Add thread exit code for shutdown case. 13/117613/2
authorHaesu Gwon <haesu.gwon@samsung.com>
Fri, 24 Feb 2017 05:57:41 +0000 (14:57 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Tue, 7 Mar 2017 02:55:44 +0000 (18:55 -0800)
In shutdown case, camera_task_thread is not destroyed properly.
So signal missing can be caused by this unhandled thread.

Change-Id: Ia45d7b0f5626851a61bd8ed9022b5f43c1bb2eb4
Signed-off-by: Haesu Gwon <haesu.gwon@samsung.com>
muse/src/muse_camera_dispatcher.c
packaging/mmsvc-camera.spec

index 18a9f6a..299bfcd 100644 (file)
@@ -1297,6 +1297,53 @@ static void *_camera_dispatcher_task_func(gpointer data)
 }
 
 
+_camera_dispatcher_release_resource(muse_module_h module)
+{
+       muse_camera_handle_s *muse_camera = NULL;
+
+       if (!module) {
+               LOGE("NULL handle");
+               return;
+       }
+
+       LOGW("enter");
+
+       muse_camera = (muse_camera_handle_s *)muse_core_ipc_get_handle(module);
+
+       _camera_remove_export_data(module, 0, TRUE);
+
+       g_mutex_clear(&muse_camera->list_lock);
+       g_cond_clear(&muse_camera->list_cond);
+       g_mutex_clear(&muse_camera->preview_cb_lock);
+       g_cond_clear(&muse_camera->preview_cb_cond);
+
+       muse_camera->bufmgr = NULL;
+
+       if (muse_camera->task_thread) {
+               LOGW("task thread exiting start");
+
+               g_mutex_lock(&muse_camera->task_lock);
+               muse_camera->task_run = false;
+               g_cond_signal(&muse_camera->task_cond);
+               g_mutex_unlock(&muse_camera->task_lock);
+
+               LOGW("wait task thread join");
+
+               g_thread_join(muse_camera->task_thread);
+               muse_camera->task_thread = NULL;
+
+               LOGW("task thread exiting end");
+       }
+
+       g_mutex_clear(&muse_camera->task_lock);
+       g_cond_clear(&muse_camera->task_cond);
+       g_queue_clear(&muse_camera->task_queue);
+
+       free(muse_camera);
+       muse_camera = NULL;
+}
+
+
 int camera_dispatcher_create(muse_module_h module)
 {
        int ret = CAMERA_ERROR_NONE;
@@ -1464,35 +1511,8 @@ int camera_dispatcher_destroy(muse_module_h module)
        LOGD("Enter, handle : %p", muse_camera);
 
        ret = legacy_camera_destroy(muse_camera->camera_handle);
-       if (ret == CAMERA_ERROR_NONE) {
-               _camera_remove_export_data(module, 0, TRUE);
-
-               g_mutex_clear(&muse_camera->list_lock);
-               g_cond_clear(&muse_camera->list_cond);
-               g_mutex_clear(&muse_camera->preview_cb_lock);
-               g_cond_clear(&muse_camera->preview_cb_cond);
-
-               muse_camera->bufmgr = NULL;
-
-               if (muse_camera->task_thread) {
-                       g_mutex_lock(&muse_camera->task_lock);
-                       muse_camera->task_run = false;
-                       g_cond_signal(&muse_camera->task_cond);
-                       g_mutex_unlock(&muse_camera->task_lock);
-
-                       LOGE("task thread join");
-
-                       g_thread_join(muse_camera->task_thread);
-                       muse_camera->task_thread = NULL;
-               }
-
-               g_mutex_clear(&muse_camera->task_lock);
-               g_cond_clear(&muse_camera->task_cond);
-               g_queue_clear(&muse_camera->task_queue);
-
-               free(muse_camera);
-               muse_camera = NULL;
-       }
+       if (ret == CAMERA_ERROR_NONE)
+               _camera_dispatcher_release_resource(module);
 
        muse_camera_msg_return(api, class, ret, module);
 
@@ -5098,6 +5118,7 @@ static int camera_cmd_dispatcher_shutdown(muse_module_h module)
        muse_camera_handle_s *muse_camera = NULL;
        camera_state_e state = CAMERA_STATE_NONE;
        int capture_try_count = 0;
+       int ret = 0;
 
        muse_camera = (muse_camera_handle_s *)muse_core_ipc_get_handle(module);
        if (muse_camera == NULL) {
@@ -5143,20 +5164,12 @@ again:
                legacy_camera_stop_preview(muse_camera->camera_handle);
                /* fall through */
        case CAMERA_STATE_CREATED:
-               if (legacy_camera_destroy(muse_camera->camera_handle) == CAMERA_ERROR_NONE) {
-                       _camera_remove_export_data(module, 0, TRUE);
-
-                       g_mutex_clear(&muse_camera->list_lock);
-                       g_mutex_clear(&muse_camera->preview_cb_lock);
-                       g_cond_clear(&muse_camera->preview_cb_cond);
-
-                       muse_camera->bufmgr = NULL;
-
-                       free(muse_camera);
-                       muse_camera = NULL;
-               } else {
+               ret = legacy_camera_destroy(muse_camera->camera_handle);
+               if (ret == CAMERA_ERROR_NONE)
+                       _camera_dispatcher_release_resource(module);
+               else
                        LOGE("failed to destroy camera handle");
-               }
+
                break;
        default:
                break;
index 7230d16..989139b 100644 (file)
@@ -1,6 +1,6 @@
 Name:       mmsvc-camera
 Summary:    A Camera module for muse server
-Version:    0.2.71
+Version:    0.2.72
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0