Fix the bug of resource release 18/229518/1 accepted/tizen/5.5/unified/20200402.000022 submit/tizen_5.5/20200401.115713
authorYoungHun Kim <yh8004.kim@samsung.com>
Wed, 1 Apr 2020 11:16:22 +0000 (20:16 +0900)
committerYoungHun Kim <yh8004.kim@samsung.com>
Wed, 1 Apr 2020 11:56:15 +0000 (11:56 +0000)
Change-Id: I00bb8bd20fdb0688ea0f016accd33f5509c72751
(cherry picked from commit 958a5b9e0c6bb5c6eaeebec58755a8f6c37a7fcc)

src/daemon/mm_resource_manager_daemon_priv.c
src/lib/mm_resource_manager_priv.c

index 0a0c488..bc21c84 100644 (file)
@@ -50,8 +50,7 @@ typedef struct {
        mm_resource_manager_app_class_e app_class;
        mm_resource_manager_res_type_e type;
        int volume;
-       gboolean is_acquired;
-       gboolean would_be_released;
+       gboolean be_released;
        /* 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];
 
@@ -526,12 +525,13 @@ static GArray *__handle_acquire_requests(mm_resource_manager_dmn_p manager,
                volume = requests->volume;
 
                if (volume == MM_RESOURCE_MANAGER_RES_VOLUME_FULL) {
-                       MM_RM_DEBUG("Full volume of %s is requested [man %p]", res_name, manager);
+                       MM_RM_DEBUG("Full volume of %s is requested [man %p] %s",
+                               res_name, manager, _mm_resource_manager_get_res_str(type));
 
                        for (i = 0; i < managers->len; i++) {
                                i_mgr = (mm_resource_manager_dmn_p)managers->pdata[i];
 
-                               if (!i_mgr->resources[type]->is_acquired ||
+                               if (manager->id == i_mgr->id ||
                                        conf->priority[i_mgr->app_class] >conf->priority[manager->app_class]) {
                                        i_mgr->resources[type]->is_acquired = TRUE;
                                        if (conf->max_instance[type] > 0)
@@ -554,21 +554,19 @@ static GArray *__handle_acquire_requests(mm_resource_manager_dmn_p manager,
                                        i_mgr->resources[type]->is_acquired = FALSE;
 
                                        MM_RM_DEBUG("All parts of %s are released in RM %"PRIu64,
-                                                       res_name, _mm_rm_hash64(i_mgr->id));
+                                               res_name, _mm_rm_hash64(i_mgr->id));
                                } else {
                                        __add_cb_request(cb_requests, i_mgr, type, MM_RESOURCE_MANAGER_RES_VOLUME_FULL);
 
                                        mm_resource_manager_backend_release(type);
 
-                                       i_mgr->resources[type]->is_acquired = FALSE;
-
                                        MM_RM_DEBUG("Full resource %s is released in RM %"PRIu64" available volume %d",
                                                res_name, _mm_rm_hash64(i_mgr->id), conf->max_volume[type]);
                                }
                        }
                } else {
-                       MM_RM_INFO("[managers len #%d] [%d type #%d (max inst #%d)] [%d (max vol %d) units of %s] are requested",
-                               managers->len, type, res_count[type] + 1,
+                       MM_RM_INFO("[managers len #%d] [%s #%d (max inst #%d)] [%d (max vol %d) units of %s] are requested",
+                               managers->len, _mm_resource_manager_get_res_str(type), res_count[type] + 1,
                                conf->max_instance[type], volume, conf->max_volume[type], res_name);
 
                        for (i = 0; i < managers->len; i++) {
@@ -589,11 +587,11 @@ static GArray *__handle_acquire_requests(mm_resource_manager_dmn_p manager,
                                                        j_mgr = (mm_resource_manager_dmn_p)managers->pdata[j];
                                                        res = j_mgr->resources[type]->parts;
 
-                                                       if (res && !j_mgr->would_be_released) {
+                                                       if (res && !j_mgr->be_released) {
                                                                MM_RM_INFO("[#%d] [#%d / #%d] would be released %s in RM %"PRIu64,
                                                                managers->len, j + 1, res->len, res_name, _mm_rm_hash64(j_mgr->id));
 
-                                                               j_mgr->would_be_released = TRUE;
+                                                               j_mgr->be_released = TRUE;
                                                                __add_cb_request(cb_requests, j_mgr, type,
                                                                                g_array_index(res, mm_resource_manager_res_volume, 0));
 
@@ -618,7 +616,7 @@ static GArray *__handle_acquire_requests(mm_resource_manager_dmn_p manager,
                                                        j_mgr = (mm_resource_manager_dmn_p)managers->pdata[j];
                                                        res = j_mgr->resources[type]->parts;
 
-                                                       if (j_mgr->would_be_released)
+                                                       if (j_mgr->be_released)
                                                                continue;
 
                                                        acquired_volume += g_array_index(res, mm_resource_manager_res_volume, 0);
@@ -626,7 +624,7 @@ static GArray *__handle_acquire_requests(mm_resource_manager_dmn_p manager,
                                                                managers->len, j + 1, res->len, acquired_volume, res_name,
                                                                _mm_rm_hash64(j_mgr->id));
 
-                                                       j_mgr->would_be_released = TRUE;
+                                                       j_mgr->be_released = TRUE;
                                                        __add_cb_request(cb_requests, j_mgr, type,
                                                                g_array_index(res, mm_resource_manager_res_volume, 0));
 
@@ -654,7 +652,6 @@ static GArray *__handle_acquire_requests(mm_resource_manager_dmn_p manager,
                mm_resource_manager_backend_acquire(type);
        }
 
-       manager->is_acquired = TRUE;
        return cb_requests;
 }
 
@@ -674,18 +671,18 @@ static void __handle_release_callbacks(GArray *requests)
        for (i = 0; i < requests->len; i++) {
                request = &g_array_index(requests, mm_resource_manager_dmn_release_cb_request_s, i);
                mgr = request->manager;
+               type = request->type;
 
-               if (!mgr->is_acquired)
+               if (!mgr->resources[type]->is_acquired)
                        continue;
 
                id = mgr->id;
                MM_RM_HASH64(id);
 
-               type = request->type;
                volume = request->volume;
 
-               MM_RM_INFO("Sending release callback to [man %p acquired %d] RM #%"PRIu64" for %s of volume %d",
-                               mgr, mgr->is_acquired, id, _mm_resource_manager_get_res_str(type), volume);
+               MM_RM_INFO("Sending release callback to [man %p] RM #%"PRIu64" for %s of volume %d",
+                               mgr, id, _mm_resource_manager_get_res_str(type), volume);
 
                _mmrm_dmn_dbus_release_callback(id, type, volume);
                if (__wait_for_release_cb_sync(id))
@@ -703,7 +700,8 @@ static void __handle_release_callbacks(GArray *requests)
                        MM_RM_INFO("The number of type %d #%d", type, res_count[type]);
                }
 
-               mgr->is_acquired = FALSE;
+               mgr->resources[type]->is_acquired = FALSE;
+               mgr->be_released = TRUE;
        }
 }
 
index ae8981c..bfaf54b 100644 (file)
@@ -922,7 +922,6 @@ static int __dbus_commit(mm_resource_manager_s *handle)
                                g_ptr_array_remove_index_fast(handle->resources, i--);
                                break;
                        default:
-                               MM_RM_WARNING("resource state : ACQUIRED");
                                break;
                        }
                }