Wait for recorder handle release when shutdown 14/109514/1
authorJeongmo Yang <jm80.yang@samsung.com>
Tue, 10 Jan 2017 08:39:48 +0000 (17:39 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Tue, 10 Jan 2017 08:39:48 +0000 (17:39 +0900)
[Version] 0.2.67
[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_20170104.1]

Change-Id: Ic36239c60fd1c84c1c2cd785d3d4c82f9020c119
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
legacy/include/legacy_camera.h
legacy/include/legacy_camera_private.h
legacy/src/legacy_camera.c
muse/src/muse_camera_dispatcher.c
packaging/mmsvc-camera.spec

index aeeec38..6c4950c 100644 (file)
@@ -3739,6 +3739,11 @@ int legacy_camera_attr_set_display_roi_area(camera_h camera, int *display_roi_ar
  */
 int legacy_camera_attr_get_display_roi_area(camera_h camera, int *display_roi_area);
 
+bool legacy_camera_is_used(camera_h camera);
+bool legacy_camera_wait(camera_h camera, unsigned int timeout);
+void legacy_camera_lock(camera_h camera, bool is_lock);
+void legacy_camera_send_signal(camera_h camera);
+
 
 /**
  * @}
index 8dcd4af..07270e6 100644 (file)
@@ -77,13 +77,16 @@ typedef struct _camera_s {
        int cached_focus_mode;
        camera_device_e device_type;
        camera_attr_ptz_type_e ptz_type;
+
+       /* for shutdown */
+       GMutex lock;
+       GCond cond;
 } camera_s;
 
 int _camera_get_mm_handle(camera_h camera , MMHandleType *handle);
 int _camera_set_relay_mm_message_callback(camera_h camera, MMMessageCallback callback, void *user_data);
 int __camera_start_continuous_focusing(camera_h camera);
 int _camera_set_use(camera_h camera, bool used);
-bool _camera_is_used(camera_h camera);
 int __convert_camera_error_code(const char* func, int code);
 
 #ifdef __cplusplus
index 2add167..64c3a57 100644 (file)
@@ -652,6 +652,9 @@ int legacy_camera_create(camera_device_e device, camera_h *camera)
        mm_camcorder_set_message_callback(handle->mm_handle,
                __mm_camera_message_callback, (void *)handle);
 
+       g_mutex_init(&handle->lock);
+       g_cond_init(&handle->cond);
+
        *camera = (camera_h)handle;
 
        LOGD("legacy camera handle %p", handle);
@@ -826,8 +829,11 @@ int legacy_camera_destroy(camera_h camera)
        LOGW("camera handle %p", handle);
 
        ret = mm_camcorder_destroy(handle->mm_handle);
-       if (ret == MM_ERROR_NONE)
+       if (ret == MM_ERROR_NONE) {
+               g_cond_clear(&handle->cond);
+               g_mutex_clear(&handle->lock);
                free(handle);
+       }
 
        return __convert_camera_error_code(__func__, ret);
 }
@@ -3807,19 +3813,6 @@ int _camera_set_use(camera_h camera, bool used)
 }
 
 
-bool _camera_is_used(camera_h camera)
-{
-       camera_s *handle = (camera_s *)camera;
-
-       if (handle == NULL) {
-               LOGE("handle is NULL");
-               return false;
-       }
-
-       return handle->is_used_in_recorder;
-}
-
-
 int _camera_get_mm_handle(camera_h camera, MMHandleType *handle)
 {
        if (camera == NULL || handle == NULL) {
@@ -4660,3 +4653,73 @@ int legacy_camera_attr_get_display_roi_area(camera_h camera, int *display_roi_ar
 
        return __convert_camera_error_code(__func__, ret);
 }
+
+
+bool legacy_camera_is_used(camera_h camera)
+{
+       camera_s *handle = (camera_s *)camera;
+
+       if (handle == NULL) {
+               LOGE("handle is NULL");
+               return false;
+       }
+
+       return handle->is_used_in_recorder;
+}
+
+
+bool legacy_camera_wait(camera_h camera, unsigned int timeout)
+{
+       camera_s *handle = (camera_s *)camera;
+       gint64 end_time;
+
+       if (handle == NULL) {
+               LOGE("handle is NULL");
+               return false;
+       }
+
+       end_time = g_get_monotonic_time() + timeout * G_TIME_SPAN_MILLISECOND;
+
+       return (bool)g_cond_wait_until(&handle->cond, &handle->lock, end_time);
+}
+
+
+void legacy_camera_lock(camera_h camera, bool is_lock)
+{
+       camera_s *handle = (camera_s *)camera;
+
+       if (handle == NULL) {
+               LOGE("handle is NULL");
+               return;
+       }
+
+       LOGD("%p lock %d", handle, is_lock);
+
+       if (is_lock)
+               g_mutex_lock(&handle->lock);
+       else
+               g_mutex_unlock(&handle->lock);
+
+       LOGD("done");
+
+       return;
+}
+
+
+void legacy_camera_send_signal(camera_h camera)
+{
+       camera_s *handle = (camera_s *)camera;
+
+       if (handle == NULL) {
+               LOGE("handle is NULL");
+               return;
+       }
+
+       LOGD("send signal");
+
+       g_cond_signal(&handle->cond);
+
+       LOGD("done");
+
+       return;
+}
index 24adc42..dc01284 100644 (file)
@@ -5049,9 +5049,24 @@ static int camera_cmd_dispatcher_shutdown(muse_module_h module)
        muse_camera = (muse_camera_handle_s *)muse_core_ipc_get_handle(module);
        if (muse_camera == NULL) {
                LOGE("NULL handle");
-               return MUSE_CAMERA_ERROR_NONE;
+               return MUSE_CAMERA_ERROR_INVALID;
        }
 
+       legacy_camera_lock(muse_camera->camera_handle, true);
+
+       if (legacy_camera_is_used(muse_camera->camera_handle)) {
+               LOGW("camera is used in recorder.. wait...");
+               if (legacy_camera_wait(muse_camera->camera_handle, 3000)) {
+                       LOGD("recorder is released");
+               } else {
+                       legacy_camera_lock(muse_camera->camera_handle, false);
+                       LOGE("wait timeout, could not release camera handle %p", muse_camera->camera_handle);
+                       return MUSE_CAMERA_ERROR_INVALID;
+               }
+       }
+
+       legacy_camera_lock(muse_camera->camera_handle, false);
+
 again:
        legacy_camera_get_state(muse_camera->camera_handle, &state);
 
index 6dbf7e9..3c8c6d2 100644 (file)
@@ -1,6 +1,6 @@
 Name:       mmsvc-camera
 Summary:    A Camera module for muse server
-Version:    0.2.66
+Version:    0.2.67
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0