From 1c6c6cb88b5789dabe98e40f62dab37d7644f835 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Tue, 4 Feb 2025 13:57:00 +0900 Subject: [PATCH] Fix coverity issue: Data race condition [Version] 1.3.5 [Issue Type] Coverity Change-Id: Iaec4bd0ac04a3393e2160f17187504a0f85e4be2 Signed-off-by: Jeongmo Yang --- packaging/hal-backend-camera-v4l2.spec | 2 +- src/hal_backend_camera_v4l2.c | 32 ++++++++++---------------- src/hal_backend_camera_v4l2_private.h | 1 + 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/packaging/hal-backend-camera-v4l2.spec b/packaging/hal-backend-camera-v4l2.spec index aeef470..d49ccd6 100644 --- a/packaging/hal-backend-camera-v4l2.spec +++ b/packaging/hal-backend-camera-v4l2.spec @@ -2,7 +2,7 @@ Name: hal-backend-camera-v4l2 Summary: Tizen Camera Hal using generic V4L2 interface -Version: 1.3.4 +Version: 1.3.5 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/hal_backend_camera_v4l2.c b/src/hal_backend_camera_v4l2.c index d4e7f26..a3edf9a 100644 --- a/src/hal_backend_camera_v4l2.c +++ b/src/hal_backend_camera_v4l2.c @@ -1438,14 +1438,11 @@ static void __camera_do_capture(hal_camera_handle *handle) handle->camera_buffers[index].planes[0].bytesused = bytesused; if (handle->captured_count > 0) { - g_mutex_lock(&handle->buffer_lock); if (handle->state != CAMERA_STATE_CAPTURING) { LOGW("stop continuous capture"); handle->captured_count = handle->capture_count; - g_mutex_unlock(&handle->buffer_lock); goto _TRY_NEXT; } - g_mutex_unlock(&handle->buffer_lock); } if (handle->capture_count > 1) { @@ -1458,9 +1455,7 @@ static void __camera_do_capture(hal_camera_handle *handle) goto _TRY_NEXT; } - g_mutex_lock(&handle->buffer_lock); handle->captured_count++; - g_mutex_unlock(&handle->buffer_lock); LOGD("capture cb[%p], buffer index[%d],count[%d]", handle->capture_cb, index, handle->captured_count); @@ -1483,17 +1478,17 @@ _TRY_NEXT: LOGE("qbuf failed for capture[0x%x]", ret); } while (handle->captured_count < handle->capture_count); - g_mutex_lock(&handle->buffer_lock); + g_mutex_lock(&handle->lock); if (handle->state == CAMERA_STATE_CAPTURING) { LOGD("wait for capture stop signal"); - g_cond_wait(&handle->buffer_cond, &handle->buffer_lock); + g_cond_wait(&handle->cond, &handle->lock); LOGD("signal received"); } else { LOGD("The state is already changed."); } - g_mutex_unlock(&handle->buffer_lock); + g_mutex_unlock(&handle->lock); _CAPTURE_DONE: /* restart stream for preview */ @@ -1760,6 +1755,7 @@ static void __camera_release_handle(hal_camera_handle *handle) g_mutex_clear(&handle->buffer_lock); g_mutex_clear(&handle->msg_cb_lock); g_mutex_clear(&handle->extra_preview_lock); + g_cond_clear(&handle->cond); g_cond_clear(&handle->buffer_cond); g_cond_clear(&handle->msg_cb_cond); @@ -1815,6 +1811,7 @@ int camera_v4l2_init(void **camera_handle) g_mutex_init(&new_handle->buffer_lock); g_mutex_init(&new_handle->msg_cb_lock); g_mutex_init(&new_handle->extra_preview_lock); + g_cond_init(&new_handle->cond); g_cond_init(&new_handle->buffer_cond); g_cond_init(&new_handle->msg_cb_cond); @@ -2483,6 +2480,11 @@ int camera_v4l2_stop_capture(void *camera_handle) return CAMERA_ERROR_INVALID_PARAMETER; } + if (handle->captured_count == 0) { + LOGE("No captured image yet."); + return CAMERA_ERROR_INTERNAL; + } + g_mutex_lock(&handle->lock); if (handle->state != CAMERA_STATE_CAPTURING) { @@ -2491,21 +2493,11 @@ int camera_v4l2_stop_capture(void *camera_handle) return CAMERA_ERROR_INVALID_STATE; } - g_mutex_lock(&handle->buffer_lock); - - if (handle->captured_count == 0) { - LOGE("No captured image yet."); - g_mutex_unlock(&handle->buffer_lock); - g_mutex_unlock(&handle->lock); - return CAMERA_ERROR_INTERNAL; - } + handle->state = CAMERA_STATE_PREVIEWING; LOGD("send signal to start preview after capture"); - g_cond_signal(&handle->buffer_cond); - g_mutex_unlock(&handle->buffer_lock); - - handle->state = CAMERA_STATE_PREVIEWING; + g_cond_signal(&handle->cond); g_mutex_unlock(&handle->lock); diff --git a/src/hal_backend_camera_v4l2_private.h b/src/hal_backend_camera_v4l2_private.h index bf1ede2..55f6401 100644 --- a/src/hal_backend_camera_v4l2_private.h +++ b/src/hal_backend_camera_v4l2_private.h @@ -98,6 +98,7 @@ typedef struct _camera_hal_handle { /* etc */ GMutex lock; + GCond cond; camera_state_e state; } hal_camera_handle; -- 2.34.1