Iterate all type's information when checking if release callback invoking 76/295176/2 accepted/tizen/unified/20230710.013129
authorYoungHun Kim <yh8004.kim@samsung.com>
Mon, 3 Jul 2023 10:27:54 +0000 (19:27 +0900)
committerYoungHun Kim <yh8004.kim@samsung.com>
Mon, 3 Jul 2023 11:45:14 +0000 (20:45 +0900)
Change-Id: Ib08a6ddb361b0cf0889fb384edb3b6db21b3f1ea

packaging/mm-resource-manager.spec
src/daemon/mm_resource_manager_daemon_priv.c

index 4e1a24c..cda86a3 100644 (file)
@@ -1,6 +1,6 @@
 Name:       mm-resource-manager
 Summary:    A Multimedia Resource Manager API
-Version:    0.2.53
+Version:    0.2.54
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 8a9bfba..5544b5e 100644 (file)
@@ -58,7 +58,6 @@ typedef struct {
        int pid;
        /* if an element is NULL, there is no such a resource for the current platform. */
        mm_resource_manager_dmn_res_p resources[MM_RESOURCE_MANAGER_RES_TYPE_MAX];
-
 } mm_resource_manager_dmn_s;
 typedef mm_resource_manager_dmn_s *mm_resource_manager_dmn_p;
 
@@ -92,11 +91,12 @@ static void __sync_increase_acquire_requests(mm_resource_manager_dmn_res_request
                mm_resource_manager_dmn_res_request_s *acquires);
 static void __handle_release_requests(mm_resource_manager_dmn_p manager, mm_resource_manager_dmn_res_request_s *requests);
 static GArray* __handle_acquire_requests(mm_resource_manager_dmn_p manager, mm_resource_manager_dmn_res_request_s *requests);
+static gboolean __is_release_invoking(mm_resource_manager_dmn_p manager);
 static void __handle_release_callbacks(GArray *requests);
 static int __open_release_cb_sync_fd(void);
 static void __close_release_cb_sync_fd(int fd);
 static gboolean __is_process_alive(int pid);
-static inline void __add_cb_request(GArray *cb_requests, mm_resource_manager_dmn_p mgr,
+static inline void __add_cb_request(GArray *cb_requests, mm_resource_manager_dmn_p manager,
                mm_resource_manager_res_type_e type, mm_resource_manager_res_volume volume);
 static void __destroy_all_resources(mm_resource_manager_dmn_p manager);
 static gboolean __poll(struct pollfd sync, mm_resource_manager_id id);
@@ -480,7 +480,7 @@ static void __sync_increase_acquire_requests(mm_resource_manager_dmn_res_request
        }
 }
 
-static inline void __add_cb_request(GArray *cb_requests,mm_resource_manager_dmn_p mgr,
+static inline void __add_cb_request(GArray *cb_requests,mm_resource_manager_dmn_p manager,
                        mm_resource_manager_res_type_e type, mm_resource_manager_res_volume volume)
 {
        mm_resource_manager_dmn_release_cb_request_s *cb_request;
@@ -488,7 +488,7 @@ static inline void __add_cb_request(GArray *cb_requests,mm_resource_manager_dmn_
        g_array_set_size(cb_requests, cb_requests->len + 1);
        cb_request = &g_array_index(cb_requests, mm_resource_manager_dmn_release_cb_request_s, cb_requests->len - 1);
 
-       cb_request->manager = mgr;
+       cb_request->manager = manager;
        cb_request->type = type;
        cb_request->volume = volume;
 }
@@ -666,6 +666,17 @@ static gboolean __is_process_alive(int pid)
        return access(path, F_OK) == 0;
 }
 
+static gboolean __is_release_invoking(mm_resource_manager_dmn_p manager)
+{
+       mm_resource_manager_res_type_e idx;
+       for (idx = MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_DECODER; idx < MM_RESOURCE_MANAGER_RES_TYPE_MAX; idx++) {
+               if (manager->resources[idx]->state == MM_RESOURCE_MANAGER_RES_STATE_FOR_RELEASE)
+                       return TRUE;
+       }
+
+       return FALSE;
+}
+
 static void __handle_release_callbacks(GArray *requests)
 {
        int i;
@@ -703,10 +714,16 @@ static void __handle_release_callbacks(GArray *requests)
 
                MM_RM_HASH64(id);
 
-               if (mgr->type == type && mgr->volume == volume && mgr->resources[type]->state == MM_RESOURCE_MANAGER_RES_STATE_FOR_RELEASE) {
-                       MM_RM_WARNING("Resource (mgr %p) release callback is already invoked RM #%"PRIu64" for %s of volume %d",
-                               mgr, id, res_name, volume);
-                       continue;
+               if (mgr->type == type && mgr->volume == volume) {
+                       if (mgr->resources[type]->state == MM_RESOURCE_MANAGER_RES_STATE_FOR_RELEASE) {
+                               MM_RM_WARNING("Resource (mgr %p) release callback is already invoked RM #%"PRIu64" for %s of volume %d",
+                                       mgr, id, res_name, volume);
+                               continue;
+                       } else if (__is_release_invoking(mgr)) {
+                               MM_RM_WARNING("Resource (mgr %p) release callback is already invoked by other than RM #%"PRIu64" for %s of volume %d",
+                                       mgr, id, res_name, volume);
+                               continue;
+                       }
                }
 
                /* Avoid to emit release callback of resource manager's other resource, which can be changed by release policy*/