Fix the bug of available volume and instance scenario 32/234832/1
authorYoungHun Kim <yh8004.kim@samsung.com>
Fri, 29 May 2020 05:12:29 +0000 (14:12 +0900)
committerYoungHun Kim <yh8004.kim@samsung.com>
Fri, 29 May 2020 06:13:26 +0000 (15:13 +0900)
Change-Id: Ia60f3b5558709d42394ba8270fb24de66b0decdd

src/daemon/mm_resource_manager_daemon_priv.c

index 6a9fcd6..04b1b07 100644 (file)
@@ -513,7 +513,6 @@ static GArray *__handle_acquire_requests(mm_resource_manager_dmn_p manager,
        GArray *cb_requests = NULL;
        GArray *res = NULL;
        int i = 0, j = 0;
-       gboolean is_released_called_once = FALSE;
        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;
 
@@ -567,81 +566,75 @@ static GArray *__handle_acquire_requests(mm_resource_manager_dmn_p manager,
                                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++) {
-                               i_mgr = (mm_resource_manager_dmn_p)managers->pdata[i];
-                               res = i_mgr->resources[type]->parts;
-
-                               if (!i_mgr->resources[type]->is_acquired || res ||
-                                       conf->priority[i_mgr->app_class] > conf->priority[manager->app_class]) {
-
-                                       if (conf->volume_would_be_checked[type] && conf->max_volume[type] >= 0 && !res) {
-                                               conf->max_volume[type] -= volume;
-                                               MM_RM_INFO("[type %d] - %d = %d", type, volume, conf->max_volume[type]);
-                                       }
-
-                                       if (conf->max_instance[type] > 0 && conf->max_instance[type] == res_count[type]
-                                               && !is_released_called_once) {
-                                               for (j = 0; j < managers->len; j++) {
-                                                       j_mgr = (mm_resource_manager_dmn_p)managers->pdata[j];
-                                                       res = j_mgr->resources[type]->parts;
+                       if (conf->max_instance[type] > 0 && conf->max_instance[type] == res_count[type]) {
+                               for (i= 0; i < managers->len; i++) {
+                                       i_mgr = (mm_resource_manager_dmn_p)managers->pdata[j];
+                                       res = i_mgr->resources[type]->parts;
 
-                                                       if (res && j_mgr->resources[type]->is_acquired) {
-                                                               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));
+                                       if (res && i_mgr->resources[type]->is_acquired) {
+                                               MM_RM_INFO("[#%d] [#%d / #%d] would be released %s in RM %"PRIu64,
+                                               managers->len, i + 1, res->len, res_name, _mm_rm_hash64(i_mgr->id));
 
-                                                               __add_cb_request(cb_requests, j_mgr, type,
-                                                                               g_array_index(res, mm_resource_manager_res_volume, 0));
+                                               __add_cb_request(cb_requests, i_mgr, type, g_array_index(res, mm_resource_manager_res_volume, 0));
 
-                                                               mm_resource_manager_backend_release(type);
-                                                               is_released_called_once = TRUE;
-                                                               break;
-                                                       }
-                                               }
+                                               mm_resource_manager_backend_release(type);
+                                               break;
                                        }
+                               }
+                       } else {
+                               for (i = 0; i < managers->len; i++) {
+                                       i_mgr = (mm_resource_manager_dmn_p)managers->pdata[i];
+                                       res = i_mgr->resources[type]->parts;
+
+                                       if (manager->id == i_mgr->id || conf->priority[i_mgr->app_class] > conf->priority[manager->app_class]) {
+
+                                               if (conf->volume_would_be_checked[type]) {
+                                                       if (!i_mgr->resources[type]->is_acquired && conf->max_volume[type] >= 0) {
+                                                               i_mgr->resources[type]->is_acquired = TRUE;
+                                                               i_mgr->type = type;
+                                                               i_mgr->volume = volume;
+                                                               conf->max_volume[type] -= volume;
+                                                               MM_RM_INFO("[type %d] - %d = %d", type, volume, conf->max_volume[type]);
+                                                       }
 
-                                       if (conf->max_instance[type] > 0 && !res)
-                                               res_count[type]++;
-
-                                       i_mgr->resources[type]->is_acquired = TRUE;
+                                                       if (conf->volume_would_be_checked[type] && conf->max_volume[type] < 0
+                                                               && acquired_volume < volume) {
+                                                               for (j = 0; j < managers->len; j++) {
+                                                                       j_mgr = (mm_resource_manager_dmn_p)managers->pdata[j];
+                                                                       res = j_mgr->resources[type]->parts;
 
-                                       if (conf->max_instance[type] < res_count[type])
-                                               break;
+                                                                       if (!j_mgr->resources[type]->is_acquired)
+                                                                               continue;
 
-                                       if (conf->volume_would_be_checked[type] && conf->max_volume[type] < 0
-                                               && acquired_volume < volume) {
-                                               for (j = 0; j < managers->len; j++) {
-                                                       j_mgr = (mm_resource_manager_dmn_p)managers->pdata[j];
-                                                       res = j_mgr->resources[type]->parts;
+                                                                       acquired_volume += g_array_index(res, mm_resource_manager_res_volume, 0);
+                                                                       MM_RM_INFO("[#%d] [#%d / #%d] There are %d units of %s in RM %"PRIu64,
+                                                                               managers->len, j + 1, res->len, acquired_volume, res_name, _mm_rm_hash64(j_mgr->id));
 
-                                                       if (!j_mgr->resources[type]->is_acquired)
-                                                               continue;
+                                                                       __add_cb_request(cb_requests, j_mgr, type, g_array_index(res, mm_resource_manager_res_volume, 0));
 
-                                                       acquired_volume += g_array_index(res, mm_resource_manager_res_volume, 0);
-                                                       MM_RM_INFO("[#%d] [#%d / #%d] There are %d units of %s in RM %"PRIu64,
-                                                               managers->len, j + 1, res->len, acquired_volume, res_name,
-                                                               _mm_rm_hash64(j_mgr->id));
+                                                                       mm_resource_manager_backend_release(type);
 
-                                                       __add_cb_request(cb_requests, j_mgr, type,
-                                                               g_array_index(res, mm_resource_manager_res_volume, 0));
+                                                                       if (acquired_volume >= volume)
+                                                                               break;
+                                                               }
+                                                       }
+                                               }
 
-                                                       mm_resource_manager_backend_release(type);
+                                               if (i_mgr->resources[type]->is_acquired)
+                                                       res_count[type]++;
 
-                                                       if (acquired_volume >= volume)
-                                                               break;
-                                               }
+                                               i_mgr->resources[type]->is_acquired = TRUE;
                                        }
-
-                                       continue;
                                }
-                       }
 
-                       res = manager->resources[requests->type]->parts;
-                       if (res == NULL) {
-                               res = g_array_sized_new(FALSE, FALSE, sizeof(mm_resource_manager_res_volume),
-                                       MM_RESOURCE_MANAGER_RESERVED_PART_ARRAY_SIZE);
-                               manager->resources[requests->type]->parts = res;
+                               res = manager->resources[requests->type]->parts;
+                               if (!res) {
+                                       res = g_array_sized_new(FALSE, FALSE, sizeof(mm_resource_manager_res_volume),
+                                               MM_RESOURCE_MANAGER_RESERVED_PART_ARRAY_SIZE);
+                                       manager->resources[requests->type]->parts = res;
+                               }
+                               g_array_append_val(res, requests->volume);
                        }
-                       g_array_append_val(res, requests->volume);
                }
 
                manager->resources[type]->is_acquired = TRUE;