int pid;
/* 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_s;
typedef mm_resource_manager_dmn_s *mm_resource_manager_dmn_p;
mm_resource_manager_dmn_res_request_s *acquires);
static void __handle_release_requests(mm_resource_manager_dmn_p manager, mm_resource_manager_dmn_res_request_s *requests);
static GArray* __handle_acquire_requests(mm_resource_manager_dmn_p manager, mm_resource_manager_dmn_res_request_s *requests);
+static gboolean __is_release_invoking(mm_resource_manager_dmn_p manager);
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,
+static inline void __add_cb_request(GArray *cb_requests, mm_resource_manager_dmn_p manager,
mm_resource_manager_res_type_e type, mm_resource_manager_res_volume volume);
static void __destroy_all_resources(mm_resource_manager_dmn_p manager);
static gboolean __poll(struct pollfd sync, mm_resource_manager_id id);
}
}
-static inline void __add_cb_request(GArray *cb_requests,mm_resource_manager_dmn_p mgr,
+static inline void __add_cb_request(GArray *cb_requests,mm_resource_manager_dmn_p manager,
mm_resource_manager_res_type_e type, mm_resource_manager_res_volume volume)
{
mm_resource_manager_dmn_release_cb_request_s *cb_request;
g_array_set_size(cb_requests, cb_requests->len + 1);
cb_request = &g_array_index(cb_requests, mm_resource_manager_dmn_release_cb_request_s, cb_requests->len - 1);
- cb_request->manager = mgr;
+ cb_request->manager = manager;
cb_request->type = type;
cb_request->volume = volume;
}
return access(path, F_OK) == 0;
}
+static gboolean __is_release_invoking(mm_resource_manager_dmn_p manager)
+{
+ mm_resource_manager_res_type_e idx;
+ for (idx = MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_DECODER; idx < MM_RESOURCE_MANAGER_RES_TYPE_MAX; idx++) {
+ if (manager->resources[idx]->state == MM_RESOURCE_MANAGER_RES_STATE_FOR_RELEASE)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static void __handle_release_callbacks(GArray *requests)
{
int i;
MM_RM_HASH64(id);
- if (mgr->type == type && mgr->volume == volume && mgr->resources[type]->state == MM_RESOURCE_MANAGER_RES_STATE_FOR_RELEASE) {
- MM_RM_WARNING("Resource (mgr %p) release callback is already invoked RM #%"PRIu64" for %s of volume %d",
- mgr, id, res_name, volume);
- continue;
+ if (mgr->type == type && mgr->volume == volume) {
+ if (mgr->resources[type]->state == MM_RESOURCE_MANAGER_RES_STATE_FOR_RELEASE) {
+ MM_RM_WARNING("Resource (mgr %p) release callback is already invoked RM #%"PRIu64" for %s of volume %d",
+ mgr, id, res_name, volume);
+ continue;
+ } else if (__is_release_invoking(mgr)) {
+ MM_RM_WARNING("Resource (mgr %p) release callback is already invoked by other than RM #%"PRIu64" for %s of volume %d",
+ mgr, id, res_name, volume);
+ continue;
+ }
}
/* Avoid to emit release callback of resource manager's other resource, which can be changed by release policy*/