mm_resource_manager_s *handle = MM_RESOURCE_MANAGER(rm);
mm_resource_manager_res_p resource;
+ MM_RM_DEBUG("Enter");
+
__mm_resource_handles_lock();
MM_RESOURCE_MANAGER_CHECK(handle);
+ if (handle->release_cb.is_invoked) {
+ MM_RM_ERROR("RM #%"PRIu64" is releasing resource, so resource manager can't support your acquire request",
+ _mm_rm_hash64(handle->id));
+ __mm_resource_handles_unlock();
+ return MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION;
+ }
__mm_resources_lock(handle);
__mm_resource_handles_unlock();
mm_resource_manager_s *handle = MM_RESOURCE_MANAGER(rm);
int ret;
+ MM_RM_DEBUG("Enter");
+
__mm_resource_handles_lock();
MM_RESOURCE_MANAGER_CHECK(handle);
+ if (handle->release_cb.is_invoked) {
+ MM_RM_ERROR("RM #%"PRIu64" is releasing resource, so resource manager can't support your commit request",
+ _mm_rm_hash64(handle->id));
+ __mm_resource_handles_unlock();
+ return MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION;
+ }
__mm_resources_lock(handle);
__mm_resource_handles_unlock();
MM_RM_DEBUG("Release callback is invoked for %s of volume %d in handle RM #%"PRIu64" input RM #%"PRIu64,
res_name, volume, handle_id, id);
- if (handle_id == id) {
- __mm_resources_lock(handle);
+ if (handle_id != id) {
+ MM_RM_WARNING("handle RM #%"PRIu64" input RM #%"PRIu64" is different", handle_id, id);
__mm_resource_handles_unlock();
- prev_len = handle->resources->len;
+ return;
+ }
+
+ __mm_resources_lock(handle);
+ __mm_resource_handles_unlock();
+ prev_len = handle->resources->len;
- MM_RM_DEBUG("resource %p length %d", handle->resources, prev_len);
+ MM_RM_DEBUG("resource %p length %d", handle->resources, prev_len);
- for (idx = 0; idx < prev_len; idx++) {
- resource = (mm_resource_manager_res_s*)handle->resources->pdata[idx];
- if (resource->type == type && resource->volume == volume) {
- /* FIXME : Set true in advance release callback invoking to prevent deadlock with resource marking */
- handle->release_cb.is_invoked = TRUE;
+ for (idx = 0; idx < prev_len; idx++) {
+ resource = (mm_resource_manager_res_s*)handle->resources->pdata[idx];
+ if (resource->type == type && resource->volume == volume) {
+ /* FIXME : Set true in advance release callback invoking to prevent deadlock with resource marking */
+ handle->release_cb.is_invoked = TRUE;
- MM_RM_INFO("[res %p type %s volume %d] release_cb", resource, res_name, volume);
- release_all = ((mm_resource_manager_release_cb)handle->release_cb.cb)(handle, resource, handle->release_cb.user_data);
- MM_RM_INFO("[%d] release_cb is completed", release_all);
+ MM_RM_INFO("[res %p type %s volume %d] release_cb", resource, res_name, volume);
+ release_all = ((mm_resource_manager_release_cb)handle->release_cb.cb)(handle, resource, handle->release_cb.user_data);
+ MM_RM_INFO("[%d] release_cb is completed", release_all);
- __send_release_cb_sync(handle->id);
+ __send_release_cb_sync(handle->id);
- g_ptr_array_remove_index_fast(handle->resources, idx);
+ g_ptr_array_remove_index_fast(handle->resources, idx);
- MM_RM_DEBUG("resource length %d => %d", prev_len, handle->resources->len);
+ MM_RM_DEBUG("resource length %d => %d", prev_len, handle->resources->len);
- break;
- }
+ break;
}
+ }
- __mm_resources_unlock(handle);
+ handle->release_cb.is_invoked = FALSE;
+ MM_RM_WARNING("Reset release_cb release_cb.is_invoked RM #%"PRIu64, handle_id);
- if (release_all) {
- if (_mm_resource_manager_mark_all_for_release(handle) == MM_RESOURCE_MANAGER_ERROR_NONE &&
- _mm_resource_manager_commit(handle) == MM_RESOURCE_MANAGER_ERROR_NONE)
- MM_RM_DEBUG("All resources are released after release cb");
- else
- MM_RM_WARNING("Resources cannot be released after release cb");
- }
- } else {
- MM_RM_WARNING("handle RM #%"PRIu64" input RM #%"PRIu64" is different", handle_id, id);
- __mm_resource_handles_unlock();
+ __mm_resources_unlock(handle);
+
+ if (release_all) {
+ if (_mm_resource_manager_mark_all_for_release(handle) == MM_RESOURCE_MANAGER_ERROR_NONE &&
+ _mm_resource_manager_commit(handle) == MM_RESOURCE_MANAGER_ERROR_NONE)
+ MM_RM_DEBUG("All resources are released after release cb");
+ else
+ MM_RM_WARNING("Resources cannot be released after release cb");
}
}