From d7a831b31c3414a8c815f35b0e10ae264b638c4f Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Thu, 10 Jan 2019 15:20:21 +0900 Subject: [PATCH] Fix deadlock issue between buffer release and preview handler functions [Version] 0.0.5 [Profile] Common [Issue Type] Bug fix [Dependency module] N/A Change-Id: Ifba0db26daf09ab7c7ab5e4dd99c9cc7704807db Signed-off-by: Jeongmo Yang --- packaging/camera-hal-v4l2.spec | 2 +- src/tizen_camera_v4l2.c | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packaging/camera-hal-v4l2.spec b/packaging/camera-hal-v4l2.spec index df55bef..2ced257 100644 --- a/packaging/camera-hal-v4l2.spec +++ b/packaging/camera-hal-v4l2.spec @@ -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 diff --git a/src/tizen_camera_v4l2.c b/src/tizen_camera_v4l2.c index 923d70b..80b5f3c 100644 --- a/src/tizen_camera_v4l2.c +++ b/src/tizen_camera_v4l2.c @@ -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", -- 2.7.4