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;
#include <glib.h>
#include <unistd.h>
-#include <sys/stat.h>
#include <poll.h>
#include <inttypes.h>
#include <errno.h>
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];
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[] = {
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);
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;
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);
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;
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]);
}
}
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]);
}
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;
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;
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) {
mm_resource_manager_cb_s release_cb;
mm_resource_manager_cb_s status_cb;
+ int pid;
GMutex resources_lock;
__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));
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:
}
/* 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);