#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)
*/
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;
/**
#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: |
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);
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);
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);
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) {
_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) {
}
/* 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 */
}
} 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);
+ }
}
}
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;
}