From: Jeongmo Yang Date: Thu, 10 Jan 2019 06:20:21 +0000 (+0900) Subject: Fix deadlock issue between buffer release and preview handler functions X-Git-Tag: submit/tizen/20190111.042104^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F70%2F197170%2F1;p=platform%2Fadaptation%2Fcamera-hal-v4l2.git 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 --- 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",