From: Jeongmo Yang Date: Tue, 7 Feb 2017 06:45:22 +0000 (+0900) Subject: Add defensive code for signal missing when destroy handle X-Git-Tag: submit/tizen/20170307.122057~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1e2575c955290bfa40f72ea54145a92c11c4614f;p=platform%2Fcore%2Fmultimedia%2Fmmsvc-camera.git Add defensive code for signal missing when destroy handle It seems that signal to quit task thread is missed when destroy handle, so, call g_cond_wait_until instead of g_cond_wait after stop preview is called, then, task thread can be quit although it does not receive signal. [Version] 0.2.70 [Profile] Common [Issue Type] Update [Dependency module] N/A [Test] [M(T) - Boot=(OK), sdb=(OK), Home=(OK), Touch=(OK), Version=tizen-3.0-mobile_20170206.3] Change-Id: I9338a6bd779d9f19eae027f5a75f72f3b1498cba Signed-off-by: Jeongmo Yang --- diff --git a/muse/src/muse_camera_dispatcher.c b/muse/src/muse_camera_dispatcher.c index 3c1b177..18a9f6a 100644 --- a/muse/src/muse_camera_dispatcher.c +++ b/muse/src/muse_camera_dispatcher.c @@ -1178,11 +1178,6 @@ static void __camera_task_process_job(muse_camera_handle_s *muse_camera, muse_ca { int ret = CAMERA_ERROR_NONE; - if (!job) { - LOGE("NULL job"); - return; - } - if (!muse_camera) { LOGE("NULL handle"); goto _PROCESS_DONE; @@ -1233,29 +1228,51 @@ static void *_camera_dispatcher_task_func(gpointer data) { muse_camera_handle_s *muse_camera = (muse_camera_handle_s *)data; muse_camera_task_job_s *job = NULL; + gint64 end_time = 0; + bool is_signaled = false; + bool use_wait_until = false; if (!muse_camera) { LOGE("NULL handle"); return NULL; } - LOGD("enter"); + LOGW("enter"); g_mutex_lock(&muse_camera->task_lock); while (muse_camera->task_run) { if (g_queue_is_empty(&muse_camera->task_queue)) { - LOGD("empty queue. wait signal"); - g_cond_wait(&muse_camera->task_cond, &muse_camera->task_lock); - LOGD("signal received"); + LOGD("empty queue. wait signal [wait until %d]", use_wait_until); + + if (use_wait_until) { + end_time = g_get_monotonic_time() + G_TIME_SPAN_SECOND; + is_signaled = g_cond_wait_until(&muse_camera->task_cond, &muse_camera->task_lock, end_time); + } else { + g_cond_wait(&muse_camera->task_cond, &muse_camera->task_lock); + is_signaled = true; + } + + /*LOGD("is_signaled %d", is_signaled);*/ } if (!muse_camera->task_run) { - LOGD("stop task thread"); + LOGW("stop task thread : is_signaled %d", is_signaled); break; } job = (muse_camera_task_job_s *)g_queue_pop_head(&muse_camera->task_queue); + if (!job) { + if (is_signaled) + LOGE("signal received, but no job"); + + continue; + } + + if (job->api == MUSE_CAMERA_API_STOP_PREVIEW) + use_wait_until = true; + else + use_wait_until = false; g_mutex_unlock(&muse_camera->task_lock); @@ -1266,16 +1283,15 @@ static void *_camera_dispatcher_task_func(gpointer data) while (!g_queue_is_empty(&muse_camera->task_queue)) { job = (muse_camera_task_job_s *)g_queue_pop_head(&muse_camera->task_queue); - - if (job) + if (job) { LOGW("remained job - api %d", job->api); - - __camera_task_process_job(muse_camera, job); + __camera_task_process_job(muse_camera, job); + } } g_mutex_unlock(&muse_camera->task_lock); - LOGD("leave"); + LOGW("leave"); return NULL; } diff --git a/packaging/mmsvc-camera.spec b/packaging/mmsvc-camera.spec index 8fb88aa..bf71843 100644 --- a/packaging/mmsvc-camera.spec +++ b/packaging/mmsvc-camera.spec @@ -1,6 +1,6 @@ Name: mmsvc-camera Summary: A Camera module for muse server -Version: 0.2.69 +Version: 0.2.70 Release: 0 Group: Multimedia/Libraries License: Apache-2.0