[Release version 0.10.58] Fix TSAM-5206 : wait for resource state change message 19/76519/4 accepted/tizen/common/20160627.191931 accepted/tizen/ivi/20160629.015427 accepted/tizen/mobile/20160629.015328 accepted/tizen/tv/20160629.015406 accepted/tizen/wearable/20160629.015349 submit/tizen/20160627.022624
authorJeongmo Yang <jm80.yang@samsung.com>
Fri, 24 Jun 2016 06:58:15 +0000 (15:58 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Mon, 27 Jun 2016 01:55:14 +0000 (10:55 +0900)
Change-Id: Ib927efd00f931ad43e47a6f9c75139cbfe1e3e33
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
packaging/libmm-camcorder.spec
src/include/mm_camcorder_internal.h
src/include/mm_camcorder_resource.h
src/mm_camcorder_internal.c
src/mm_camcorder_resource.c

index 0ee398b..7673b34 100644 (file)
@@ -2,7 +2,7 @@
 
 Name:       libmm-camcorder
 Summary:    Camera and recorder library
-Version:    0.10.57
+Version:    0.10.58
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index a90a4e9..5cd6fca 100644 (file)
@@ -396,6 +396,18 @@ extern "C" {
 #define _MMCAMCORDER_TRYLOCK_ASTREAM_CALLBACK(handle)       _MMCAMCORDER_TRYLOCK_FUNC(_MMCAMCORDER_GET_ASTREAM_CALLBACK_LOCK(handle))
 #define _MMCAMCORDER_UNLOCK_ASTREAM_CALLBACK(handle)        _MMCAMCORDER_UNLOCK_FUNC(_MMCAMCORDER_GET_ASTREAM_CALLBACK_LOCK(handle))
 
+#ifdef _MMCAMCORDER_MURPHY_SUPPORT
+/* for resource conflict */
+#define _MMCAMCORDER_GET_RESOURCE_LOCK(handle)              (_MMCAMCORDER_CAST_MTSAFE(handle).resource_lock)
+#define _MMCAMCORDER_GET_RESOURCE_COND(handle)              (_MMCAMCORDER_CAST_MTSAFE(handle).resource_cond)
+#define _MMCAMCORDER_LOCK_RESOURCE(handle)                  _MMCAMCORDER_LOCK_FUNC(_MMCAMCORDER_GET_RESOURCE_LOCK(handle))
+#define _MMCAMCORDER_TRYLOCK_RESOURCE(handle)               _MMCAMCORDER_TRYLOCK_FUNC(_MMCAMCORDER_GET_RESOURCE_LOCK(handle))
+#define _MMCAMCORDER_UNLOCK_RESOURCE(handle)                _MMCAMCORDER_UNLOCK_FUNC(_MMCAMCORDER_GET_RESOURCE_LOCK(handle))
+#define _MMCAMCORDER_RESOURCE_WAIT(handle)                  g_cond_wait(&_MMCAMCORDER_GET_RESOURCE_COND(handle), &_MMCAMCORDER_GET_RESOURCE_LOCK(handle))
+#define _MMCAMCORDER_RESOURCE_WAIT_UNTIL(handle, end_time)  g_cond_wait_until(&_MMCAMCORDER_GET_RESOURCE_COND(handle), &_MMCAMCORDER_GET_RESOURCE_LOCK(handle), end_time)
+#define _MMCAMCORDER_RESOURCE_SIGNAL(handle)                g_cond_signal(&_MMCAMCORDER_GET_RESOURCE_COND(handle));
+#endif /* _MMCAMCORDER_MURPHY_SUPPORT */
+
 /**
  * Caster of main handle (camcorder)
  */
@@ -600,6 +612,10 @@ typedef struct {
        GMutex vcapture_cb_lock;        /**< Mutex (for video capture callback) */
        GMutex vstream_cb_lock;         /**< Mutex (for video stream callback) */
        GMutex astream_cb_lock;         /**< Mutex (for audio stream callback) */
+#ifdef _MMCAMCORDER_MURPHY_SUPPORT
+       GCond resource_cond;            /**< Condition (for resource check) */
+       GMutex resource_lock;           /**< Mutex (for resource check) */
+#endif /* _MMCAMCORDER_MURPHY_SUPPORT */
 } _MMCamcorderMTSafe;
 
 /**
index 9c9431b..04aa39b 100644 (file)
@@ -40,6 +40,7 @@ typedef struct {
        mrp_res_resource_set_t *rset;
        bool is_connected;
        void *user_data;
+       int acquire_count;
 } MMCamcorderResourceManager;
 
 int _mmcamcorder_resource_manager_init(MMCamcorderResourceManager *resource_manager, void *user_data);
index 0ce2f68..870347a 100644 (file)
 #define DPM_ALLOWED                             1
 #define DPM_DISALLOWED                          0
 
+#ifdef _MMCAMCORDER_MURPHY_SUPPORT
+#define __MMCAMCORDER_RESOURCE_WAIT_TIME        5
+#endif /* _MMCAMCORDER_MURPHY_SUPPORT */
+
 
 /*---------------------------------------------------------------------------------------
 |    LOCAL FUNCTION PROTOTYPES:                                                                |
@@ -141,6 +145,10 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info)
        g_mutex_init(&(hcamcorder->mtsafe).vcapture_cb_lock);
        g_mutex_init(&(hcamcorder->mtsafe).vstream_cb_lock);
        g_mutex_init(&(hcamcorder->mtsafe).astream_cb_lock);
+#ifdef _MMCAMCORDER_MURPHY_SUPPORT
+       g_cond_init(&(hcamcorder->mtsafe).resource_cond);
+       g_mutex_init(&(hcamcorder->mtsafe).resource_lock);
+#endif /* _MMCAMCORDER_MURPHY_SUPPORT */
 
        g_mutex_init(&hcamcorder->restart_preview_lock);
 
@@ -575,6 +583,10 @@ _ERR_DEFAULT_VALUE_INIT:
        g_mutex_clear(&(hcamcorder->mtsafe).vcapture_cb_lock);
        g_mutex_clear(&(hcamcorder->mtsafe).vstream_cb_lock);
        g_mutex_clear(&(hcamcorder->mtsafe).astream_cb_lock);
+#ifdef _MMCAMCORDER_MURPHY_SUPPORT
+       g_cond_clear(&(hcamcorder->mtsafe).resource_cond);
+       g_mutex_clear(&(hcamcorder->mtsafe).resource_lock);
+#endif /* _MMCAMCORDER_MURPHY_SUPPORT */
 
        g_mutex_clear(&hcamcorder->snd_info.open_mutex);
        g_cond_clear(&hcamcorder->snd_info.open_cond);
@@ -784,6 +796,10 @@ int _mmcamcorder_destroy(MMHandleType handle)
        g_mutex_clear(&(hcamcorder->mtsafe).vcapture_cb_lock);
        g_mutex_clear(&(hcamcorder->mtsafe).vstream_cb_lock);
        g_mutex_clear(&(hcamcorder->mtsafe).astream_cb_lock);
+#ifdef _MMCAMCORDER_MURPHY_SUPPORT
+       g_cond_clear(&(hcamcorder->mtsafe).resource_cond);
+       g_mutex_clear(&(hcamcorder->mtsafe).resource_lock);
+#endif /* _MMCAMCORDER_MURPHY_SUPPORT */
 
        g_mutex_clear(&hcamcorder->snd_info.open_mutex);
        g_cond_clear(&hcamcorder->snd_info.open_cond);
@@ -1084,6 +1100,9 @@ int _mmcamcorder_realize(MMHandleType handle)
 
        if (hcamcorder->type == MM_CAMCORDER_MODE_VIDEO_CAPTURE) {
                int dpm_camera_state = DPM_ALLOWED;
+#ifdef _MMCAMCORDER_MURPHY_SUPPORT
+               gint64 end_time = 0;
+#endif /* _MMCAMCORDER_MURPHY_SUPPORT */
 
                /* check camera policy from DPM */
                if (hcamcorder->dpm_policy) {
@@ -1101,6 +1120,8 @@ int _mmcamcorder_realize(MMHandleType handle)
                        _mmcam_dbg_warn("NULL dpm_policy");
                }
 #ifdef _MMCAMCORDER_MURPHY_SUPPORT
+               hcamcorder->resource_manager.acquire_count = 0;
+
                /* prepare resource manager for camera */
                ret = _mmcamcorder_resource_manager_prepare(&hcamcorder->resource_manager, MM_CAMCORDER_RESOURCE_TYPE_CAMERA);
                if (ret != MM_ERROR_NONE) {
@@ -1124,11 +1145,36 @@ int _mmcamcorder_realize(MMHandleType handle)
                }
 
                /* acquire resources */
+               _MMCAMCORDER_LOCK_RESOURCE(hcamcorder);
+
                if (hcamcorder->resource_manager.rset && _mmcamcorder_resource_manager_acquire(&hcamcorder->resource_manager)) {
+                       _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
+
                        _mmcam_dbg_err("could not acquire resources");
+
                        _mmcamcorder_resource_manager_unprepare(&hcamcorder->resource_manager);
                        goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
                }
+
+               if (hcamcorder->resource_manager.acquire_count > 0) {
+                       _mmcam_dbg_warn("wait for resource state change");
+
+                       /* wait for resource state change */
+                       end_time = g_get_monotonic_time() + (__MMCAMCORDER_RESOURCE_WAIT_TIME * G_TIME_SPAN_SECOND);
+
+                       if (_MMCAMCORDER_RESOURCE_WAIT_UNTIL(hcamcorder, end_time)) {
+                               _mmcam_dbg_warn("signal received");
+                       } else {
+                               _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
+                               _mmcam_dbg_err("timeout");
+                               ret = MM_ERROR_RESOURCE_INTERNAL;
+                               goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
+                       }
+               } else {
+                       _mmcam_dbg_log("already all acquired");
+               }
+
+               _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
 #endif /* _MMCAMCORDER_MURPHY_SUPPORT */
        }
 
index 793630d..ecaf733 100644 (file)
@@ -151,6 +151,22 @@ static void __mmcamcorder_resource_set_state_callback(mrp_res_context_t *cx, con
                } else {
                        _mmcam_dbg_log(" -- resource name [%s] -> [%s]",
                                res->name, __mmcamcorder_resource_state_to_str(res->state));
+
+                       if (res->state == MRP_RES_RESOURCE_ACQUIRED) {
+                               _MMCAMCORDER_LOCK_RESOURCE(camcorder);
+
+                               camcorder->resource_manager.acquire_count--;
+
+                               if (camcorder->resource_manager.acquire_count <= 0) {
+                                       _mmcam_dbg_log("send signal - resource acquire done");
+                                       _MMCAMCORDER_RESOURCE_SIGNAL(camcorder);
+                               } else {
+                                       _mmcam_dbg_warn("remained acquire count %d",
+                                               camcorder->resource_manager.acquire_count);
+                               }
+
+                               _MMCAMCORDER_UNLOCK_RESOURCE(camcorder);
+                       }
                }
        }
 
@@ -245,7 +261,10 @@ static int __mmcamcorder_resource_include_resource(MMCamcorderResourceManager *r
                return MM_ERROR_RESOURCE_INTERNAL;
        }
 
-       _mmcam_dbg_log(" - include resource[%s]", resource_name);
+       resource_manager->acquire_count++;
+
+       _mmcam_dbg_log(" - count[%d] include resource[%s]",
+               resource_manager->acquire_count, resource_name);
 
        return MM_ERROR_NONE;
 }