Add "is_interrupted" flag to avoid deadlock after camera pipeline is stopped. 71/299071/2
authorJeongmo Yang <jm80.yang@samsung.com>
Tue, 19 Sep 2023 06:27:15 +0000 (15:27 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Wed, 20 Sep 2023 06:04:39 +0000 (15:04 +0900)
[Version] 0.3.67
[Issue Type] Improvement

Change-Id: I449254315aaed470f0cd1cbeaac8f70d91f622fc
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
muse/include/muse_camera_internal.h
muse/src/muse_camera_dispatcher.c
packaging/mmsvc-camera.spec

index bc16f20..63d33ed 100644 (file)
@@ -84,6 +84,7 @@ typedef struct {
        int fds[MUSE_NUM_FD];
        int fd_number;
        const char *platform_privilege;
+       gboolean is_interrupted;
 } muse_camera_handle_s;
 
 
index 77ac2ce..4c42774 100644 (file)
@@ -513,10 +513,8 @@ void camera_export_data_free(gpointer data)
        if (!export_data)
                return;
 
-       CAM_LOG_DEBUG("export data[%p], bo[%p/%p], bo_fd[%d/%d], buffer_fd[%d/%d/%d], gstbuffer[%p]",
-               export_data, export_data->bo, export_data->data_bo, export_data->fd, export_data->data_fd,
-               export_data->buffer_fd[0], export_data->buffer_fd[1], export_data->buffer_fd[2],
-               export_data->internal_buffer);
+       CAM_LOG_INFO("export_data[%p], bo[%p], fd[%d]",
+               export_data, export_data->bo, export_data->fd);
 
        /* unref bo */
        if (export_data->bo) {
@@ -532,6 +530,10 @@ void camera_export_data_free(gpointer data)
                export_data->fd = -1;
        }
 
+       CAM_LOG_INFO("data_bo[%p], data_fd[%d], buffer_fd[%d/%d/%d]",
+               export_data->data_bo, export_data->data_fd,
+               export_data->buffer_fd[0], export_data->buffer_fd[1], export_data->buffer_fd[2]);
+
        /* unref exported data_bo */
        if (export_data->data_bo) {
                tbm_bo_unref(export_data->data_bo);
@@ -552,6 +554,8 @@ void camera_export_data_free(gpointer data)
                }
        }
 
+       CAM_LOG_INFO("internal_buffer[%p]", export_data->internal_buffer);
+
        /* unref GstBuffer */
        if (export_data->internal_buffer) {
                gst_buffer_unref((GstBuffer *)export_data->internal_buffer);
@@ -559,6 +563,8 @@ void camera_export_data_free(gpointer data)
        }
 
        g_free(export_data);
+
+       CAM_LOG_INFO("done");
 }
 
 
@@ -577,6 +583,8 @@ gboolean camera_remove_export_data(muse_camera_data_list *camera_data, tbm_fd fd
        camera_return_val_if_fail(camera_data, FALSE);
        camera_return_val_if_fail(fd >= -1, FALSE); /* -1 means "Remove all". */
 
+       CAM_LOG_INFO("fd[%d]", fd);
+
        g_mutex_lock(&camera_data->lock);
 
        if (fd == -1) {
@@ -605,6 +613,8 @@ gboolean camera_remove_export_data(muse_camera_data_list *camera_data, tbm_fd fd
 
        g_mutex_unlock(&camera_data->lock);
 
+       CAM_LOG_INFO("done");
+
        return TRUE;
 }
 
@@ -879,6 +889,13 @@ void _camera_dispatcher_state_changed_cb(camera_state_e previous, camera_state_e
 void _camera_dispatcher_interrupted_cb(camera_policy_e policy, camera_state_e previous, camera_state_e current, void *user_data)
 {
        muse_module_h module = (muse_module_h)user_data;
+       muse_camera_handle_s *muse_camera = NULL;
+
+       muse_camera = (muse_camera_handle_s *)muse_server_ipc_get_handle(module);
+       if (muse_camera) {
+               CAM_LOG_WARNING("set interrupt flag");
+               muse_camera->is_interrupted = TRUE;
+       }
 
        CAM_LOG_INFO("Enter - policy[%d], state previous[%d] -> current[%d]", policy, previous, current);
 
@@ -1216,6 +1233,9 @@ static void __camera_task_process_job(muse_camera_handle_s *muse_camera, muse_ca
                                snprintf(value_key, KEY_LENGTH, "flash_state_camera%d", device_type);
                                muse_server_module_set_value(muse_camera->module, value_key, 0);
                        }
+
+                       /* reset interrupt flag */
+                       muse_camera->is_interrupted = FALSE;
                }
                break;
        case MUSE_CAMERA_API_START_CAPTURE:
@@ -5475,7 +5495,10 @@ int camera_dispatcher_return_buffer(muse_module_h module)
 
        muse_camera_msg_get(ret_fd, muse_server_module_get_msg(module));
 
-       CAM_LOG_VERBOSE("ret_fd[%d]", ret_fd);
+       if (muse_camera->is_interrupted) {
+               CAM_LOG_WARNING("Interrupted... skip it[ret_fd:%d]", ret_fd);
+               return MUSE_CAMERA_ERROR_NONE;
+       }
 
        if (!camera_remove_export_data(&muse_camera->camera_data, (tbm_fd)ret_fd))
                CAM_LOG_ERROR("remove export data failed : fd[%d]", ret_fd);
@@ -6212,7 +6235,7 @@ muse_camera_export_data *camera_export_data_new_from_stream(MMCamcorderVideoStre
        if (stream->internal_buffer)
                export_data->internal_buffer = gst_buffer_ref((GstBuffer *)stream->internal_buffer);
 
-       CAM_LOG_DEBUG("bo[%p/%p], bo_fd[%d/%d], buffer_fd[%d/%d/%d]",
+       CAM_LOG_INFO("bo[%p/%p], bo_fd[%d/%d], buffer_fd[%d/%d/%d]",
                export_data->bo, export_data->data_bo, export_data->fd, export_data->data_fd,
                export_data->buffer_fd[0], export_data->buffer_fd[1], export_data->buffer_fd[2]);
 
index 9bac706..4f6ee4b 100644 (file)
@@ -1,6 +1,6 @@
 Name:       mmsvc-camera
 Summary:    A Camera module for muse server
-Version:    0.3.66
+Version:    0.3.67
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0