Ignore the conflict of the killed client's resource and release it forcibly 62/257162/7 accepted/tizen/unified/20210429.011932 submit/tizen/20210422.024531 submit/tizen/20210427.232346
authorYoungHun Kim <yh8004.kim@samsung.com>
Tue, 20 Apr 2021 07:33:00 +0000 (16:33 +0900)
committerYoungHun Kim <yh8004.kim@samsung.com>
Wed, 21 Apr 2021 08:45:07 +0000 (17:45 +0900)
Change-Id: If35dfaba08af8d5a2b65bf7c1cca5f29eda98dfb

packaging/mm-resource-manager.spec
packaging/org.tizen.MMResourceManager.xml
src/daemon/mm_resource_manager_daemon_dbus.c
src/daemon/mm_resource_manager_daemon_priv.c
src/daemon/mm_resource_manager_daemon_priv.h
src/lib/mm_resource_manager_priv.c

index 645f800..1885f07 100644 (file)
@@ -1,6 +1,6 @@
 Name:       mm-resource-manager
 Summary:    A Multimedia Resource Manager API
-Version:    0.2.45
+Version:    0.2.46
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 1e583a2..1028f9b 100644 (file)
@@ -17,8 +17,8 @@
     </method>
     <method name="commit">
       <arg name="id" direction="in" type="t"/>
-      <arg name="releases" direction="in" type="a(ii)"/>
-      <arg name="acquires" direction="in" type="a(ii)"/>
+      <arg name="releases" direction="in" type="a(iii)"/>
+      <arg name="acquires" direction="in" type="a(iii)"/>
       <arg name="error" direction="out" type="i"/>
       <arg name="acquired_flags" direction="out" type="ab"/>
     </method>
index 5883134..99aff0e 100644 (file)
@@ -238,19 +238,22 @@ void _mmrm_dmn_notify_fork_done(void)
 static void __gv2c_array(GVariantIter *gv, mm_resource_manager_dmn_res_request_s **c)
 {
        int i;
+       int pid;
        mm_resource_manager_res_type_e type;
        mm_resource_manager_dmn_res_request_s *rs;
 
        rs = (mm_resource_manager_dmn_res_request_s *)g_malloc0_n(g_variant_iter_n_children(gv), sizeof(*rs));
-       for (i = 0; g_variant_iter_next(gv, "(ii)", &rs[i].type, &rs[i].volume); i++) {
+       for (i = 0; g_variant_iter_next(gv, "(iii)", &rs[i].type, &rs[i].volume, &rs[i].pid); i++) {
+               pid = rs[i].pid;
                type = rs[i].type;
+
                if (!_type_is_valid(type)) {
                        MM_RM_ERROR("type %d is wrong", type);
                        break;
                }
 
                if (type != MM_RESOURCE_MANAGER_NO_RES)
-                       MM_RM_DEBUG("(type, vol) = (%d, %d)", type, rs[i].volume);
+                       MM_RM_DEBUG("[PID %d] (type, vol) = (%d, %d)", pid, type, rs[i].volume);
        }
 
        *c = rs;
index 7533179..1120e7c 100644 (file)
@@ -16,7 +16,6 @@
 
 #include <glib.h>
 #include <unistd.h>
-#include <sys/stat.h>
 #include <poll.h>
 #include <inttypes.h>
 #include <errno.h>
@@ -55,7 +54,8 @@ typedef struct {
        mm_resource_manager_id id;
        mm_resource_manager_app_class_e app_class;
        mm_resource_manager_res_type_e type;
-       int volume;
+       mm_resource_manager_res_volume volume;
+       int pid;
        gboolean is_dbus_release_emitted;
        /* 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];
@@ -67,6 +67,7 @@ typedef struct {
        mm_resource_manager_dmn_p manager;
        mm_resource_manager_res_type_e type;
        mm_resource_manager_res_volume volume;
+       int pid;
 } mm_resource_manager_dmn_release_cb_request_s;
 
 static const char *res_state_str[] = {
@@ -95,6 +96,7 @@ static GArray* __handle_acquire_requests(mm_resource_manager_dmn_p manager, mm_r
 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,
                mm_resource_manager_res_type_e type, mm_resource_manager_res_volume volume);
 static void __destroy_all_resources(mm_resource_manager_dmn_p manager);
@@ -502,6 +504,7 @@ static GArray *__handle_acquire_requests(mm_resource_manager_dmn_p manager,
        GArray *cb_requests = NULL;
        GArray *res = NULL;
        int i = 0, j = 0;
+       int pid;
        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;
 
@@ -515,6 +518,7 @@ static GArray *__handle_acquire_requests(mm_resource_manager_dmn_p manager,
                type = requests->type;
                res_name = _mm_resource_manager_get_res_str(type);
                volume = requests->volume;
+               pid = requests->pid;
 
                if (volume == MM_RESOURCE_MANAGER_RES_VOLUME_FULL) {
                        MM_RM_DEBUG("Resource of %s is requested (mgr %p)", res_name, manager);
@@ -526,7 +530,9 @@ static GArray *__handle_acquire_requests(mm_resource_manager_dmn_p manager,
                                        i_mgr->resources[type]->state = MM_RESOURCE_MANAGER_RES_STATE_ACQUIRED;
                                        i_mgr->type = type;
                                        i_mgr->volume = volume;
-                                       MM_RM_DEBUG("Reset the value of acquire in RM #%"PRIu64" (type %s mgr %p)", _mm_rm_hash64(i_mgr->id), res_name, i_mgr);
+                                       i_mgr->pid = pid;
+                                       MM_RM_DEBUG("[PID %d] Reset the value of acquire in RM #%"PRIu64" (type %s mgr %p)",
+                                               i_mgr->pid, _mm_rm_hash64(i_mgr->id), res_name, i_mgr);
                                        if (conf->max_instance[type] > 0)
                                                res_count[type]++;
                                        continue;
@@ -540,13 +546,13 @@ static GArray *__handle_acquire_requests(mm_resource_manager_dmn_p manager,
                                        g_array_free(res, TRUE);
                                        i_mgr->resources[type]->parts = NULL;
 
-                                       MM_RM_WARNING("Resource of %s is conflicted in RM #%"PRIu64, res_name, _mm_rm_hash64(i_mgr->id));
+                                       MM_RM_WARNING("[PID %d] Resource of %s is conflicted in RM #%"PRIu64, i_mgr->pid, 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);
 
-                                       MM_RM_DEBUG("Resource %s will be released (%s state) in RM #%"PRIu64" available volume %d", res_name,
+                                       MM_RM_DEBUG("[PID %d] Resource %s will be released (%s state) in RM #%"PRIu64" available volume %d", i_mgr->pid, res_name,
                                                res_state_str[i_mgr->resources[type]->state], _mm_rm_hash64(i_mgr->id), conf->max_volume[type]);
                                }
                        }
@@ -581,6 +587,7 @@ static GArray *__handle_acquire_requests(mm_resource_manager_dmn_p manager,
                                                                i_mgr->resources[type]->state = MM_RESOURCE_MANAGER_RES_STATE_ACQUIRED;
                                                                i_mgr->type = type;
                                                                i_mgr->volume = volume;
+                                                               i_mgr->pid = pid;
                                                                conf->max_volume[type] -= volume;
                                                                MM_RM_INFO("[type %s] - %d = %d", res_name, volume, conf->max_volume[type]);
                                                        }
@@ -627,7 +634,7 @@ static GArray *__handle_acquire_requests(mm_resource_manager_dmn_p manager,
                manager->resources[type]->state = MM_RESOURCE_MANAGER_RES_STATE_ACQUIRED;
                mm_resource_manager_backend_acquire(type);
                if (i_mgr)
-                       MM_RM_DEBUG("RM #%"PRIu64" (type %s mgr %p) is acquired", _mm_rm_hash64(i_mgr->id), res_name, i_mgr);
+                       MM_RM_DEBUG("[PID %d] RM #%"PRIu64" (type %s mgr %p) is acquired", i_mgr->pid, _mm_rm_hash64(i_mgr->id), res_name, i_mgr);
        }
 
        return cb_requests;
@@ -651,10 +658,20 @@ static void __close_release_cb_sync_fd(int fd)
        MM_RM_DEBUG("[%d] closed %s", fd, RELEASE_CB_SYNC_PATH);
 }
 
+static gboolean __is_process_alive(int pid)
+{
+       char path[PID_MSG_LEN];
+
+       snprintf(path, sizeof(path), "/proc/%d", pid);
+
+       return access(path, F_OK) == 0;
+}
+
 static void __handle_release_callbacks(GArray *requests)
 {
        int i;
        int sync_fd;
+       int pid;
        mm_resource_manager_id id;
        mm_resource_manager_dmn_release_cb_request_s *request;
        mm_resource_manager_res_type_e type = MM_RESOURCE_MANAGER_RES_TYPE_MAX;
@@ -676,7 +693,15 @@ static void __handle_release_callbacks(GArray *requests)
                if (mgr->resources[type]->state != MM_RESOURCE_MANAGER_RES_STATE_ACQUIRED)
                        continue;
 
+               pid = mgr->pid;
                id = mgr->id;
+
+               if (!__is_process_alive(pid)) {
+                       MM_RM_ERROR("[PID %d] is already terminated", pid);
+                       _mmrm_dmn_destroy(id);
+                       continue;
+               }
+
                MM_RM_HASH64(id);
 
                if (mgr->type == type && mgr->volume == volume && mgr->resources[type]->state == MM_RESOURCE_MANAGER_RES_STATE_FOR_RELEASE) {
index 9a30347..a8667ac 100644 (file)
@@ -30,6 +30,7 @@
 typedef struct {
        mm_resource_manager_res_type_e type;
        mm_resource_manager_res_volume volume;
+       int pid;
        gboolean priority_error;
 } mm_resource_manager_dmn_res_request_s;
 typedef mm_resource_manager_dmn_res_request_s *mm_resource_manager_dmn_res_request_p;
index 0dd7109..0a54eef 100644 (file)
@@ -60,6 +60,7 @@ typedef struct {
 
        mm_resource_manager_cb_s release_cb;
        mm_resource_manager_cb_s status_cb;
+       int pid;
 
        GMutex resources_lock;
 
@@ -510,7 +511,9 @@ int _mm_resource_manager_commit(mm_resource_manager_h rm)
        __mm_resources_lock(handle);
        __mm_resource_handles_unlock();
 
-       MM_RM_INFO("dbus_commit RM #%"PRIu64, _mm_rm_hash64(handle->id));
+       handle->pid = (int)getpid();
+
+       MM_RM_INFO("[pid %d] dbus_commit RM #%"PRIu64, handle->pid, _mm_rm_hash64(handle->id));
        ret = __dbus_commit(handle);
        if (ret == MM_RESOURCE_MANAGER_ERROR_NONE)
                MM_RM_DEBUG("Changes in RM #%"PRIu64" have been committed successfully", _mm_rm_hash64(handle->id));
@@ -995,11 +998,11 @@ static int __dbus_commit(mm_resource_manager_s *handle)
 
                switch (resource->state) {
                case MM_RESOURCE_MANAGER_RES_STATE_FOR_ACQUIRE:
-                       g_variant_builder_add_value(acquire_builder, g_variant_new("(ii)", resource->type, resource->volume));
+                       g_variant_builder_add_value(acquire_builder, g_variant_new("(iii)", resource->type, resource->volume, handle->pid));
                        acquire_num++;
                        break;
                case MM_RESOURCE_MANAGER_RES_STATE_FOR_RELEASE:
-                       g_variant_builder_add_value(release_builder, g_variant_new("(ii)", resource->type, resource->volume));
+                       g_variant_builder_add_value(release_builder, g_variant_new("(iii)", resource->type, resource->volume, handle->pid));
                        release_num++;
                        break;
                default:
@@ -1015,11 +1018,11 @@ static int __dbus_commit(mm_resource_manager_s *handle)
        }
 
        /* Acquire and release arrays are ended with special element, because g_variant_builder_end crashes without at least one element */
-       g_variant_builder_add_value(acquire_builder, g_variant_new("(ii)", MM_RESOURCE_MANAGER_NO_RES, 0));
+       g_variant_builder_add_value(acquire_builder, g_variant_new("(iii)", MM_RESOURCE_MANAGER_NO_RES, 0, handle->pid));
        acquire = g_variant_builder_end(acquire_builder);
        g_variant_builder_unref(acquire_builder);
 
-       g_variant_builder_add_value(release_builder, g_variant_new("(ii)", MM_RESOURCE_MANAGER_NO_RES, 0));
+       g_variant_builder_add_value(release_builder, g_variant_new("(iii)", MM_RESOURCE_MANAGER_NO_RES, 0, handle->pid));
        release = g_variant_builder_end(release_builder);
        g_variant_builder_unref(release_builder);