Fix deadlock issue by preview_cb_lock 73/310573/3 accepted/tizen/unified/20240503.115742 accepted/tizen/unified/dev/20240620.005530 accepted/tizen/unified/toolchain/20240508.012339 accepted/tizen/unified/x/20240507.051006 accepted/tizen/unified/x/asan/20240625.092725
authorJeongmo Yang <jm80.yang@samsung.com>
Thu, 2 May 2024 03:47:29 +0000 (12:47 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Thu, 2 May 2024 09:27:17 +0000 (18:27 +0900)
- The deadlock could be occurred like below.
 : Thread A(preview_cb) -> _MMCAMCORDER_LOCK_VSTREAM_CALLBACK() -> lock preview_cb_lock
 : Thread B(unset_preview_cb) -> lock preview_cb_lock -> _MMCAMCORDER_LOCK_VSTREAM_CALLBACK()
- Add new lock for preview_cb_flag.
- Remove some condition for waiting PREVIEW_CB_RETURN message in preview_cb().

[Version] 1.0.1
[Issue Type] Bug fix

Change-Id: Ia59a46510fd06508ccc7d3cfde15899d6a3b6322
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 63d33ed5b6512552de53e6a330e4004a01ffc122..218a3b7a56ecebed8d0a18aedb2a7d4f3e478929 100644 (file)
@@ -69,6 +69,7 @@ typedef struct {
        camera_h camera_handle;
        tbm_bufmgr bufmgr;
        muse_camera_data_list camera_data;
+       GMutex preview_cb_flag_lock;
        GMutex preview_cb_lock;
        GCond preview_cb_cond;
        guint preview_cb_flag;
index 7244395f155059c74f4bc2adb390ab8e365ee4e3..efeae20c9958405656fc59e4a81ca24c27c5011d 100644 (file)
@@ -977,11 +977,8 @@ void _camera_dispatcher_preview_cb(MMCamcorderVideoStreamDataType *stream, void
 
        muse_core_msg_free(send_message);
 
-       /* wait for PREVIEW_CB_RETURN signal if zero copy buffer is used(stream->bo[0] is not NULL)
-          and preview callback(normal or media packet) is set. */
-       if (send_ret > 0 && stream->bo[0] &&
-               (CHECK_PREVIEW_CB(muse_camera, PREVIEW_CB_TYPE_NORMAL) ||
-                CHECK_PREVIEW_CB(muse_camera, PREVIEW_CB_TYPE_MEDIA_PACKET))) {
+       /* wait for PREVIEW_CB_RETURN signal if zero copy buffer is used */
+       if (send_ret > 0 && stream->bo[0]) {
                CAM_LOG_DEBUG("wait for PREVIEW_CB_RETURN signal");
                end_time = g_get_monotonic_time() + G_TIME_SPAN_SECOND;
                do {
@@ -1315,7 +1312,7 @@ static int __camera_dispatcher_set_preview_cb_flag(muse_camera_handle_s *muse_ca
        MUSE_CAMERA_RETURN_VAL_IF_FAIL(muse_camera, CAMERA_ERROR_INVALID_PARAMETER);
        MUSE_CAMERA_RETURN_VAL_IF_FAIL(flag != PREVIEW_CB_TYPE_NONE, CAMERA_ERROR_INVALID_PARAMETER);
 
-       locker = g_mutex_locker_new(&muse_camera->preview_cb_lock);
+       locker = g_mutex_locker_new(&muse_camera->preview_cb_flag_lock);
 
        CAM_LOG_INFO("current flag[0x%x] - set[0x%x]",
                muse_camera->preview_cb_flag, flag);
@@ -1348,7 +1345,7 @@ static int __camera_dispatcher_unset_preview_cb_flag(muse_camera_handle_s *muse_
 
        MUSE_CAMERA_RETURN_VAL_IF_FAIL(muse_camera, CAMERA_ERROR_INVALID_PARAMETER);
 
-       locker = g_mutex_locker_new(&muse_camera->preview_cb_lock);
+       locker = g_mutex_locker_new(&muse_camera->preview_cb_flag_lock);
 
        if (muse_camera->preview_cb_flag == PREVIEW_CB_TYPE_NONE) {
                CAM_LOG_INFO("nothing to do");
@@ -1472,6 +1469,7 @@ static void _camera_dispatcher_release_resource(muse_module_h module)
 
        g_mutex_clear(&muse_camera->camera_data.lock);
        g_cond_clear(&muse_camera->camera_data.cond);
+       g_mutex_clear(&muse_camera->preview_cb_flag_lock);
        g_mutex_clear(&muse_camera->preview_cb_lock);
        g_cond_clear(&muse_camera->preview_cb_cond);
 
@@ -1623,6 +1621,7 @@ int camera_dispatcher_create(muse_module_h module)
 
        g_mutex_init(&muse_camera->camera_data.lock);
        g_cond_init(&muse_camera->camera_data.cond);
+       g_mutex_init(&muse_camera->preview_cb_flag_lock);
        g_mutex_init(&muse_camera->preview_cb_lock);
        g_cond_init(&muse_camera->preview_cb_cond);
        muse_camera->preview_cb_flag = PREVIEW_CB_TYPE_NONE;
index bd658dd9c641a7d27dd8004e045916289b376d35..4106349c321625fb0dac1401a84e35c8b4613cbb 100644 (file)
@@ -1,6 +1,6 @@
 Name:       mmsvc-camera
 Summary:    A Camera module for muse server
-Version:    1.0.0
+Version:    1.0.1
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0