int _mm_resource_manager_mark_for_release(mm_resource_manager_h rm,
mm_resource_manager_res_h resource_h)
{
- mm_resource_manager_s *handle;
+ mm_resource_manager_s *handle;
mm_resource_manager_res_p resource;
mm_resource_manager_res_p res_p;
mm_resource_manager_id handle_id;
mm_resource_manager_id resource_id;
+ mm_resource_manager_res_type_e type;
+ mm_resource_manager_res_volume volume;
int idx = 0;
__mm_resource_handles_lock();
resource_id = resource->id;
MM_RM_HASH64(resource_id);
- MM_RM_INFO("Resource %p (%s) is marked for release in RM #%"PRIu64,
- resource_h, _mm_resource_manager_get_res_str(resource->type), handle_id);
+ type = resource->type;
+ volume = resource->volume;
+
+ MM_RM_INFO("Resource %p (%s volume %d) is marked for release in RM #%"PRIu64,
+ resource_h, _mm_resource_manager_get_res_str(type), volume, handle_id);
MM_RM_RETVM_IF(handle_id != resource_id, MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER,
"handle RM #%"PRIu64" is not resource RM #%"PRIu64, handle_id, resource_id);
+ __mm_resources_lock(handle);
+ __mm_resource_handles_unlock();
+
for (idx = 0; idx < handle->resources->len; idx++) {
res_p = (mm_resource_manager_res_p)handle->resources->pdata[idx];
- if (res_p->state == MM_RESOURCE_MANAGER_RES_STATE_FOR_RELEASE) {
+ if (res_p->state == MM_RESOURCE_MANAGER_RES_STATE_FOR_RELEASE &&
+ res_p->id == handle->id && res_p->type == type && res_p->volume == volume) {
MM_RM_DEBUG("Resource %p (%s) release is executing in RM #%"PRIu64,
- res_p, _mm_resource_manager_get_res_str(res_p->type), _mm_rm_hash64(res_p->id));
- __mm_resource_handles_unlock();
+ res_p, _mm_resource_manager_get_res_str(type), handle_id);
+ __mm_resources_unlock(handle);
return MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION;
}
}
- __mm_resources_lock(handle);
- __mm_resource_handles_unlock();
-
idx = __get_resource_index(handle, resource);
MM_RM_UNLOCK_RETVM_IF(idx == MM_RESOURCE_MANAGER_RES_NOT_FOUND,
handle->resources_lock, MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER,
resource, _mm_resource_manager_get_res_str(resource->type), _mm_rm_hash64(resource->id));
}
- resource->state = MM_RESOURCE_MANAGER_RES_STATE_FOR_RELEASE;
MM_RM_INFO("[res %p type %s volume %d] release_cb",
resource, _mm_resource_manager_get_res_str(type), volume);
release_all = ((mm_resource_manager_release_cb)handle->release_cb.cb)
__send_release_cb_sync(handle->id);
g_ptr_array_remove_index_fast(handle->resources, idx);
+
+ resource->state = MM_RESOURCE_MANAGER_RES_STATE_FOR_RELEASE;
break;
}
}