fixup! Ignore client's duplicate release request after invoking release callback 56/234656/2
authorYoungHun Kim <yh8004.kim@samsung.com>
Thu, 28 May 2020 00:44:19 +0000 (09:44 +0900)
committerYoungHun Kim <yh8004.kim@samsung.com>
Thu, 28 May 2020 03:33:49 +0000 (12:33 +0900)
Change-Id: I42eb01678012b8998464a7ac90a739e0892203c7

src/lib/mm_resource_manager_priv.c

index be0dfe7..d3d73c4 100644 (file)
@@ -331,11 +331,13 @@ int _mm_resource_manager_resize_marked(mm_resource_manager_h rm,
 int _mm_resource_manager_mark_for_release(mm_resource_manager_h rm,
                mm_resource_manager_res_h resource_h)
 {
-               mm_resource_manager_s *handle;
+       mm_resource_manager_s *handle;
        mm_resource_manager_res_p resource;
        mm_resource_manager_res_p res_p;
        mm_resource_manager_id handle_id;
        mm_resource_manager_id resource_id;
+       mm_resource_manager_res_type_e type;
+       mm_resource_manager_res_volume volume;
        int idx = 0;
 
        __mm_resource_handles_lock();
@@ -349,25 +351,29 @@ int _mm_resource_manager_mark_for_release(mm_resource_manager_h rm,
        resource_id = resource->id;
        MM_RM_HASH64(resource_id);
 
-       MM_RM_INFO("Resource %p (%s) is marked for release in RM #%"PRIu64,
-               resource_h, _mm_resource_manager_get_res_str(resource->type), handle_id);
+       type = resource->type;
+       volume = resource->volume;
+
+       MM_RM_INFO("Resource %p (%s volume %d) is marked for release in RM #%"PRIu64,
+               resource_h, _mm_resource_manager_get_res_str(type), volume, handle_id);
 
        MM_RM_RETVM_IF(handle_id != resource_id, MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER,
                        "handle RM #%"PRIu64" is not resource RM #%"PRIu64, handle_id, resource_id);
 
+       __mm_resources_lock(handle);
+       __mm_resource_handles_unlock();
+
        for (idx = 0; idx < handle->resources->len; idx++) {
                res_p = (mm_resource_manager_res_p)handle->resources->pdata[idx];
-               if (res_p->state == MM_RESOURCE_MANAGER_RES_STATE_FOR_RELEASE) {
+               if (res_p->state == MM_RESOURCE_MANAGER_RES_STATE_FOR_RELEASE &&
+                       res_p->id == handle->id && res_p->type == type && res_p->volume == volume) {
                        MM_RM_DEBUG("Resource %p (%s) release is executing in RM #%"PRIu64,
-                               res_p, _mm_resource_manager_get_res_str(res_p->type), _mm_rm_hash64(res_p->id));
-                       __mm_resource_handles_unlock();
+                               res_p, _mm_resource_manager_get_res_str(type), handle_id);
+                       __mm_resources_unlock(handle);
                        return MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION;
                }
        }
 
-       __mm_resources_lock(handle);
-       __mm_resource_handles_unlock();
-
        idx = __get_resource_index(handle, resource);
        MM_RM_UNLOCK_RETVM_IF(idx == MM_RESOURCE_MANAGER_RES_NOT_FOUND,
                        handle->resources_lock, MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER,
@@ -546,7 +552,6 @@ static void __mm_resource_manager_release_callback(mm_resource_manager_s *handle
                                                resource, _mm_resource_manager_get_res_str(resource->type), _mm_rm_hash64(resource->id));
                                }
 
-                               resource->state = MM_RESOURCE_MANAGER_RES_STATE_FOR_RELEASE;
                                MM_RM_INFO("[res %p type %s volume %d] release_cb",
                                        resource, _mm_resource_manager_get_res_str(type), volume);
                                release_all = ((mm_resource_manager_release_cb)handle->release_cb.cb)
@@ -556,6 +561,8 @@ static void __mm_resource_manager_release_callback(mm_resource_manager_s *handle
                                __send_release_cb_sync(handle->id);
 
                                g_ptr_array_remove_index_fast(handle->resources, idx);
+
+                               resource->state = MM_RESOURCE_MANAGER_RES_STATE_FOR_RELEASE;
                                break;
                        }
                }