Add defensive code for signal missing when destroy handle 90/113390/1
authorJeongmo Yang <jm80.yang@samsung.com>
Tue, 7 Feb 2017 06:45:22 +0000 (15:45 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Tue, 7 Feb 2017 09:13:02 +0000 (18:13 +0900)
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 <jm80.yang@samsung.com>
muse/src/muse_camera_dispatcher.c
packaging/mmsvc-camera.spec

index 3c1b177..18a9f6a 100644 (file)
@@ -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;
 }
index 8fb88aa..bf71843 100644 (file)
@@ -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