From: Jeongmo Yang Date: Fri, 24 Jun 2016 06:58:15 +0000 (+0900) Subject: [Release version 0.10.58] Fix TSAM-5206 : wait for resource state change message X-Git-Tag: submit/tizen/20160627.022624^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bbd2630cc204b326c20418cebaa9032b5b204658;p=platform%2Fcore%2Fmultimedia%2Flibmm-camcorder.git [Release version 0.10.58] Fix TSAM-5206 : wait for resource state change message Change-Id: Ib927efd00f931ad43e47a6f9c75139cbfe1e3e33 Signed-off-by: Jeongmo Yang --- diff --git a/packaging/libmm-camcorder.spec b/packaging/libmm-camcorder.spec index 0ee398b..7673b34 100644 --- a/packaging/libmm-camcorder.spec +++ b/packaging/libmm-camcorder.spec @@ -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 diff --git a/src/include/mm_camcorder_internal.h b/src/include/mm_camcorder_internal.h index a90a4e9..5cd6fca 100644 --- a/src/include/mm_camcorder_internal.h +++ b/src/include/mm_camcorder_internal.h @@ -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; /** diff --git a/src/include/mm_camcorder_resource.h b/src/include/mm_camcorder_resource.h index 9c9431b..04aa39b 100644 --- a/src/include/mm_camcorder_resource.h +++ b/src/include/mm_camcorder_resource.h @@ -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); diff --git a/src/mm_camcorder_internal.c b/src/mm_camcorder_internal.c index 0ce2f68..870347a 100644 --- a/src/mm_camcorder_internal.c +++ b/src/mm_camcorder_internal.c @@ -63,6 +63,10 @@ #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 */ } diff --git a/src/mm_camcorder_resource.c b/src/mm_camcorder_resource.c index 793630d..ecaf733 100644 --- a/src/mm_camcorder_resource.c +++ b/src/mm_camcorder_resource.c @@ -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; }