cb_info = cam_idle_event->cb_info;
if (cb_info == NULL) {
CAM_LOG_WARNING("NULL cb_info for event[%d] %p", cam_idle_event->event, cam_idle_event);
- g_mutex_unlock(&g_cam_idle_event_lock);
goto IDLE_EVENT_CALLBACK_DONE;
}
if (cb_info->idle_event_list)
cb_info->idle_event_list = g_list_remove(cb_info->idle_event_list, (gpointer)cam_idle_event);
+ cb_info->is_in_idle_cb = TRUE;
+
g_mutex_unlock(&g_cam_idle_event_lock);
/* user callback */
__camera_client_user_callback(cb_info, cam_idle_event->recv_msg, cam_idle_event->event, cam_idle_event->tfd);
+ g_mutex_lock(&g_cam_idle_event_lock);
+
+ cb_info->is_in_idle_cb = FALSE;
+
IDLE_EVENT_CALLBACK_DONE:
+ g_mutex_unlock(&g_cam_idle_event_lock);
+
/* release event */
g_free(cam_idle_event);
{
camera_idle_event_s *cam_idle_event = NULL;
GList *list = NULL;
- g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&g_cam_idle_event_lock);
if (cb_info == NULL) {
CAM_LOG_ERROR("cb_info is NULL");
list = g_list_next(list);
if (!cam_idle_event) {
- CAM_LOG_WARNING("Fail to remove idle event. The event is NULL");
+ CAM_LOG_WARNING("The event is NULL");
continue;
}
int ret = CAMERA_ERROR_NONE;
muse_camera_api_e api = MUSE_CAMERA_API_DESTROY;
camera_cli_s *pc = (camera_cli_s *)camera;
+ g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&g_cam_idle_event_lock);
CAMERA_CHECK_HANDLE_RETURN_VAL(pc, CAMERA_ERROR_INVALID_PARAMETER);
CAM_LOG_INFO("Enter");
+ if (pc->cb_info->is_in_idle_cb) {
+ CAM_LOG_ERROR("should not be called in idle callback");
+ return CAMERA_ERROR_INVALID_OPERATION;
+ }
+
if (pc->cb_info->is_server_connected)
_camera_msg_send(api, NULL, pc->cb_info, &ret, CAMERA_CB_TIMEOUT);
else
CAM_LOG_WARNING("server disconnected. release resource without send message.");
- if (ret == CAMERA_ERROR_NONE) {
- __camera_deactivate_idle_event_all(pc->cb_info);
- __camera_client_callback_destroy(pc->cb_info);
- pc->cb_info = NULL;
-
- g_free(pc);
- pc = NULL;
+ if (ret != CAMERA_ERROR_NONE) {
+ CAM_LOG_ERROR("handle destroy failed[0x%x]", ret);
+ return ret;
}
- CAM_LOG_INFO("ret : 0x%x", ret);
+ __camera_deactivate_idle_event_all(pc->cb_info);
+
+ g_clear_pointer(&locker, g_mutex_locker_free);
+
+ __camera_client_callback_destroy(pc->cb_info);
+
+ g_free(pc);
+
+ CAM_LOG_INFO("done");
return ret;
}