Fix deadlock issue between buffer release and preview handler functions 70/197170/1 accepted/tizen/unified/20190114.060138 submit/tizen/20190111.042104
authorJeongmo Yang <jm80.yang@samsung.com>
Thu, 10 Jan 2019 06:20:21 +0000 (15:20 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Thu, 10 Jan 2019 06:41:34 +0000 (15:41 +0900)
[Version] 0.0.5
[Profile] Common
[Issue Type] Bug fix
[Dependency module] N/A

Change-Id: Ifba0db26daf09ab7c7ab5e4dd99c9cc7704807db
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
packaging/camera-hal-v4l2.spec
src/tizen_camera_v4l2.c

index df55bef..2ced257 100644 (file)
@@ -1,6 +1,6 @@
 Name:       camera-hal-v4l2
 Summary:    Tizen Camera Hal for V4L2
-Version:    0.0.4
+Version:    0.0.5
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index 923d70b..80b5f3c 100644 (file)
@@ -601,16 +601,22 @@ static void *_camera_preview_handler_func(gpointer data)
        g_mutex_lock(&handle->preview_cb_lock);
 
        while (handle->preview_cb_run) {
+               g_mutex_unlock(&handle->preview_cb_lock);
+
                if (_camera_v4l2_wait_frame(handle->device_fd, 5) != CAMERA_ERROR_NONE) {
                        LOGE("frame wait failed");
+                       g_mutex_lock(&handle->preview_cb_lock);
                        break;
                }
 
                if (_camera_v4l2_dqbuf(handle->device_fd, handle->v4l2_type, V4L2_MEMORY_MMAP, &index) != CAMERA_ERROR_NONE) {
                        LOGE("dqbuf failed");
+                       g_mutex_lock(&handle->preview_cb_lock);
                        break;
                }
 
+               g_mutex_lock(&handle->preview_cb_lock);
+
                handle->live_buffer_num++;
 
                LOGD("live buffer num %d", handle->live_buffer_num);
@@ -1399,8 +1405,6 @@ int camera_release_preview_buffer(void *camera_handle, int buffer_index)
 
        handle = (camera_hal_handle *)camera_handle;
 
-       g_mutex_lock(&handle->preview_cb_lock);
-
        if (buffer_index >= handle->preview_buffer_num) {
                LOGE("invalid buffer index %d", buffer_index);
                g_mutex_unlock(&handle->preview_cb_lock);
@@ -1410,6 +1414,8 @@ int camera_release_preview_buffer(void *camera_handle, int buffer_index)
        ret = _camera_v4l2_qbuf(handle->device_fd,
                handle->v4l2_type, V4L2_MEMORY_MMAP, buffer_index);
 
+       g_mutex_lock(&handle->preview_cb_lock);
+
        if (ret == CAMERA_ERROR_NONE) {
                handle->live_buffer_num--;
                LOGD("qbud done : index %d, live buffer num %d",