Fix the bug that attempted to release unacquired resource 59/229059/7
authorYoungHun Kim <yh8004.kim@samsung.com>
Fri, 27 Mar 2020 10:14:18 +0000 (19:14 +0900)
committerYoungHun Kim <yh8004.kim@samsung.com>
Tue, 31 Mar 2020 03:04:43 +0000 (12:04 +0900)
Change-Id: I80bc7242c128b82e10433b57c246bfd81b3a91ed

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

index 49f6519..e003b3c 100644 (file)
@@ -1,6 +1,6 @@
 Name:       mm-resource-manager
 Summary:    A Multimedia Resource Manager API
-Version:    0.2.21
+Version:    0.2.23
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index ac35b6d..a9b249e 100644 (file)
@@ -84,14 +84,12 @@ int mm_resource_manager_backend_release(mm_resource_manager_res_type_e type)
                        type >= MM_RESOURCE_MANAGER_RES_TYPE_MAX,
                        MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER, "wrong type %d", type);
 
-       if (resources[type].ref_counter > 0) {
+       if (resources[type].ref_counter > 0)
                resources[type].ref_counter--;
+       else
+               MM_RM_INFO("Reference counter is already 0");
 
-               return MM_RESOURCE_MANAGER_ERROR_NONE;
-       } else {
-               MM_RM_ERROR("Reference counter is already 0");
-               return MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION;
-       }
+       return MM_RESOURCE_MANAGER_ERROR_NONE;
 }
 
 int mm_resource_manager_backend_commit(mm_resource_manager_res_type_e type)
index bac4961..60ed561 100644 (file)
@@ -50,7 +50,8 @@ typedef struct {
        mm_resource_manager_app_class_e app_class;
        mm_resource_manager_res_type_e type;
        int volume;
-       gboolean is_released;
+       gboolean is_acquired;
+       gboolean would_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];
 
@@ -525,7 +526,7 @@ 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", res_name);
+                       MM_RM_DEBUG("Full volume of %s is requested [man %p]", res_name, manager);
 
                        for (i = 0; i < managers->len; i++) {
                                i_man = (mm_resource_manager_dmn_p)managers->pdata[i];
@@ -563,7 +564,6 @@ static GArray *__handle_acquire_requests(mm_resource_manager_dmn_p manager,
 
                                        MM_RM_DEBUG("Full resource %s is released in RM %"PRIu64" available volume %d",
                                                res_name, _mm_rm_hash64(i_man->id), conf->max_volume[type]);
-                                       break;
                                }
                        }
                } else {
@@ -589,11 +589,11 @@ static GArray *__handle_acquire_requests(mm_resource_manager_dmn_p manager,
                                                        j_man = (mm_resource_manager_dmn_p)managers->pdata[j];
                                                        res = j_man->resources[type]->parts;
 
-                                                       if (res && !j_man->is_released) {
+                                                       if (res && !j_man->would_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_man->id));
 
-                                                               j_man->is_released = TRUE;
+                                                               j_man->would_be_released = TRUE;
                                                                __add_cb_request(cb_requests, j_man, type,
                                                                                g_array_index(res, mm_resource_manager_res_volume, 0));
 
@@ -618,7 +618,7 @@ static GArray *__handle_acquire_requests(mm_resource_manager_dmn_p manager,
                                                        j_man = (mm_resource_manager_dmn_p)managers->pdata[j];
                                                        res = j_man->resources[type]->parts;
 
-                                                       if (j_man->is_released)
+                                                       if (j_man->would_be_released)
                                                                continue;
 
                                                        acquired_volume += g_array_index(res, mm_resource_manager_res_volume, 0);
@@ -626,7 +626,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_man->id));
 
-                                                       j_man->is_released = TRUE;
+                                                       j_man->would_be_released = TRUE;
                                                        __add_cb_request(cb_requests, j_man, type,
                                                                g_array_index(res, mm_resource_manager_res_volume, 0));
 
@@ -654,6 +654,7 @@ static GArray *__handle_acquire_requests(mm_resource_manager_dmn_p manager,
                mm_resource_manager_backend_acquire(type);
        }
 
+       manager->is_acquired = TRUE;
        return cb_requests;
 }
 
@@ -664,6 +665,7 @@ static void __handle_release_callbacks(GArray *requests)
        mm_resource_manager_dmn_release_cb_request_s *request;
        mm_resource_manager_res_type_e type = MM_RESOURCE_MANAGER_RES_TYPE_MAX;
        mm_resource_manager_res_volume volume = MM_RESOURCE_MANAGER_RES_VOLUME_FULL;
+       mm_resource_manager_dmn_p man = NULL;
        mm_resource_manager_conf_s *conf = mm_resource_manager_get_conf();
 
        MM_RM_RETM_IF(requests == NULL, "requests is NULL");
@@ -671,12 +673,19 @@ 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);
-               id = request->manager->id;
+               man = request->manager;
+
+               if (!man->is_acquired)
+                       continue;
+
+               id = man->id;
                MM_RM_HASH64(id);
+
                type = request->type;
                volume = request->volume;
-               MM_RM_INFO("Sending release callback to [man %p] RM #%"PRIu64" for %s of volume %d",
-                               request->manager, id, _mm_resource_manager_get_res_str(type), volume);
+
+               MM_RM_INFO("Sending release callback to [man %p acquired %d] RM #%"PRIu64" for %s of volume %d",
+                               man, man->is_acquired, id, _mm_resource_manager_get_res_str(type), volume);
 
                _mmrm_dmn_dbus_release_callback(id, type, volume);
                if (__wait_for_release_cb_sync(id))
@@ -693,6 +702,8 @@ static void __handle_release_callbacks(GArray *requests)
                        res_count[type]--;
                        MM_RM_INFO("The number of type %d #%d", type, res_count[type]);
                }
+
+               man->is_acquired = FALSE;
        }
 }