Fix deadlock issue between buffer release and preview handler functions
[platform/adaptation/camera-hal-v4l2.git] / src / tizen_camera_v4l2.c
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",