@@ -1283,43 +1283,42 @@ static umf_result_t coarse_memory_provider_alloc(void *provider, size_t size,
12831283
12841284 if (coarse_provider -> upstream_memory_provider == NULL ) {
12851285 LOG_ERR ("out of memory - no upstream memory provider given" );
1286- return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
1286+ umf_result = UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
1287+ goto err_unlock ;
12871288 }
12881289
12891290 umfMemoryProviderAlloc (coarse_provider -> upstream_memory_provider , size ,
12901291 alignment , resultPtr );
12911292 if (* resultPtr == NULL ) {
12921293 LOG_ERR ("out of memory - upstream memory provider allocation failed" );
1293- return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
1294+ umf_result = UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
1295+ goto err_unlock ;
12941296 }
12951297
12961298 ASSERT_IS_ALIGNED (((uintptr_t )(* resultPtr )), alignment );
12971299
12981300 umf_result = coarse_add_upstream_block (coarse_provider , * resultPtr , size );
12991301 if (umf_result != UMF_RESULT_SUCCESS ) {
1300- return umf_result ;
1302+ if (!coarse_provider -> disable_upstream_provider_free ) {
1303+ umfMemoryProviderFree (coarse_provider -> upstream_memory_provider ,
1304+ * resultPtr , size );
1305+ }
1306+ goto err_unlock ;
13011307 }
13021308
13031309 LOG_DEBUG ("coarse_ALLOC (upstream) %zu used %zu alloc %zu" , size ,
13041310 coarse_provider -> used_size , coarse_provider -> alloc_size );
13051311
1312+ umf_result = UMF_RESULT_SUCCESS ;
1313+
1314+ err_unlock :
13061315 assert (debug_check (coarse_provider ));
13071316
13081317 if (utils_mutex_unlock (& coarse_provider -> lock ) != 0 ) {
13091318 LOG_ERR ("unlocking the lock failed" );
1310- umf_result = UMF_RESULT_ERROR_UNKNOWN ;
1311- goto unlock_error ;
1312- }
1313-
1314- return UMF_RESULT_SUCCESS ;
1315-
1316- unlock_error :
1317- coarse_ravl_rm (coarse_provider -> all_blocks , * resultPtr );
1318- coarse_ravl_rm (coarse_provider -> upstream_blocks , * resultPtr );
1319-
1320- if (!coarse_provider -> disable_upstream_provider_free ) {
1321- umfMemoryProviderFree (coarse_provider -> upstream_memory_provider ,
1322- * resultPtr , size );
1319+ if (umf_result == UMF_RESULT_SUCCESS ) {
1320+ umf_result = UMF_RESULT_ERROR_UNKNOWN ;
1321+ }
13231322 }
13241323
13251324 return umf_result ;
0 commit comments