Skip the acquire request while executing release resource 78/238378/8 accepted/tizen/unified/20200715.115540 submit/tizen/20200714.081252
authorYoungHun Kim <yh8004.kim@samsung.com>
Mon, 13 Jul 2020 07:00:20 +0000 (16:00 +0900)
committerYoungHun Kim <yh8004.kim@samsung.com>
Tue, 14 Jul 2020 08:07:19 +0000 (17:07 +0900)
 - return error before handle's resource lock at mark_for_acquire likewise mark_for_release case
 - return error before executing commit
 - reduce the indent of if condition part

Change-Id: I5a813264fd718f241b12d5e35afb0ac579dd3bf5

src/lib/mm_resource_manager_priv.c

index 0e76ccf..a983140 100644 (file)
@@ -237,8 +237,16 @@ int _mm_resource_manager_mark_for_acquire(mm_resource_manager_h rm, mm_resource_
        mm_resource_manager_s *handle = MM_RESOURCE_MANAGER(rm);
        mm_resource_manager_res_p resource;
 
+       MM_RM_DEBUG("Enter");
+
        __mm_resource_handles_lock();
        MM_RESOURCE_MANAGER_CHECK(handle);
+       if (handle->release_cb.is_invoked) {
+               MM_RM_ERROR("RM #%"PRIu64" is releasing resource, so resource manager can't support your acquire request",
+                       _mm_rm_hash64(handle->id));
+               __mm_resource_handles_unlock();
+               return MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION;
+       }
        __mm_resources_lock(handle);
        __mm_resource_handles_unlock();
 
@@ -419,8 +427,16 @@ int _mm_resource_manager_commit(mm_resource_manager_h rm)
        mm_resource_manager_s *handle = MM_RESOURCE_MANAGER(rm);
        int ret;
 
+       MM_RM_DEBUG("Enter");
+
        __mm_resource_handles_lock();
        MM_RESOURCE_MANAGER_CHECK(handle);
+       if (handle->release_cb.is_invoked) {
+               MM_RM_ERROR("RM #%"PRIu64" is releasing resource, so resource manager can't support your commit request",
+                       _mm_rm_hash64(handle->id));
+               __mm_resource_handles_unlock();
+               return MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION;
+       }
        __mm_resources_lock(handle);
        __mm_resource_handles_unlock();
 
@@ -512,45 +528,49 @@ static void __mm_resource_manager_release_callback(mm_resource_manager_s *handle
        MM_RM_DEBUG("Release callback is invoked for %s of volume %d in handle RM #%"PRIu64" input RM #%"PRIu64,
                res_name, volume, handle_id, id);
 
-       if (handle_id == id) {
-               __mm_resources_lock(handle);
+       if (handle_id != id) {
+               MM_RM_WARNING("handle RM #%"PRIu64" input RM #%"PRIu64" is different", handle_id, id);
                __mm_resource_handles_unlock();
-               prev_len = handle->resources->len;
+               return;
+       }
+
+       __mm_resources_lock(handle);
+       __mm_resource_handles_unlock();
+       prev_len = handle->resources->len;
 
-               MM_RM_DEBUG("resource %p length %d", handle->resources, prev_len);
+       MM_RM_DEBUG("resource %p length %d", handle->resources, prev_len);
 
-               for (idx = 0; idx < prev_len; idx++) {
-                       resource = (mm_resource_manager_res_s*)handle->resources->pdata[idx];
-                       if (resource->type == type && resource->volume == volume) {
-                               /* FIXME : Set true in advance release callback invoking to prevent deadlock with resource marking */
-                               handle->release_cb.is_invoked = TRUE;
+       for (idx = 0; idx < prev_len; idx++) {
+               resource = (mm_resource_manager_res_s*)handle->resources->pdata[idx];
+               if (resource->type == type && resource->volume == volume) {
+                       /* FIXME : Set true in advance release callback invoking to prevent deadlock with resource marking */
+                       handle->release_cb.is_invoked = TRUE;
 
-                               MM_RM_INFO("[res %p type %s volume %d] release_cb", resource, res_name, volume);
-                               release_all = ((mm_resource_manager_release_cb)handle->release_cb.cb)(handle, resource, handle->release_cb.user_data);
-                               MM_RM_INFO("[%d] release_cb is completed", release_all);
+                       MM_RM_INFO("[res %p type %s volume %d] release_cb", resource, res_name, volume);
+                       release_all = ((mm_resource_manager_release_cb)handle->release_cb.cb)(handle, resource, handle->release_cb.user_data);
+                       MM_RM_INFO("[%d] release_cb is completed", release_all);
 
-                               __send_release_cb_sync(handle->id);
+                       __send_release_cb_sync(handle->id);
 
-                               g_ptr_array_remove_index_fast(handle->resources, idx);
+                       g_ptr_array_remove_index_fast(handle->resources, idx);
 
-                               MM_RM_DEBUG("resource length %d => %d", prev_len, handle->resources->len);
+                       MM_RM_DEBUG("resource length %d => %d", prev_len, handle->resources->len);
 
-                               break;
-                       }
+                       break;
                }
+       }
 
-               __mm_resources_unlock(handle);
+       handle->release_cb.is_invoked = FALSE;
+       MM_RM_WARNING("Reset release_cb release_cb.is_invoked RM #%"PRIu64, handle_id);
 
-               if (release_all) {
-                       if (_mm_resource_manager_mark_all_for_release(handle) == MM_RESOURCE_MANAGER_ERROR_NONE &&
-                               _mm_resource_manager_commit(handle) == MM_RESOURCE_MANAGER_ERROR_NONE)
-                               MM_RM_DEBUG("All resources are released after release cb");
-                       else
-                               MM_RM_WARNING("Resources cannot be released after release cb");
-               }
-       } else {
-               MM_RM_WARNING("handle RM #%"PRIu64" input RM #%"PRIu64" is different", handle_id, id);
-               __mm_resource_handles_unlock();
+       __mm_resources_unlock(handle);
+
+       if (release_all) {
+               if (_mm_resource_manager_mark_all_for_release(handle) == MM_RESOURCE_MANAGER_ERROR_NONE &&
+                       _mm_resource_manager_commit(handle) == MM_RESOURCE_MANAGER_ERROR_NONE)
+                       MM_RM_DEBUG("All resources are released after release cb");
+               else
+                       MM_RM_WARNING("Resources cannot be released after release cb");
        }
 }