summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpr.jung <pr.jung@samsung.com>2015-07-03 18:28:09 +0900
committerTaeyoung Kim <ty317.kim@samsung.com>2015-11-11 21:33:23 -0800
commitfd339614f135820e7295c7d57f7da5a00357401c (patch)
tree95d06f33f67832f6ab5691214e64e407bf82259a
parenta411107c0ff4a392fe6c7f54f5e4dc522dd6650e (diff)
downloadlibsvi-fd339614f135820e7295c7d57f7da5a00357401c.tar.gz
libsvi-fd339614f135820e7295c7d57f7da5a00357401c.tar.bz2
libsvi-fd339614f135820e7295c7d57f7da5a00357401c.zip
Add count for initialization and deinitialization
Change-Id: I57d95946248397b70c4d59c25cc08a32bd89aa39 Signed-off-by: pr.jung <pr.jung@samsung.com>
-rw-r--r--src/feedback.c47
1 files changed, 36 insertions, 11 deletions
diff --git a/src/feedback.c b/src/feedback.c
index 7cb65be..bee3687 100644
--- a/src/feedback.c
+++ b/src/feedback.c
@@ -30,18 +30,23 @@
#define API __attribute__ ((visibility("default")))
#endif
-static bool binit;
+static unsigned int init_cnt;
+static pthread_mutex_t fmutex = PTHREAD_MUTEX_INITIALIZER;
API int feedback_initialize(void)
{
- if (binit)
- return FEEDBACK_ERROR_NONE;
-
+ pthread_mutex_lock(&fmutex);
if (!profile) {
_E("there is no valid profile module.");
+ pthread_mutex_unlock(&fmutex);
return FEEDBACK_ERROR_NOT_SUPPORTED;
}
+ if (init_cnt++ > 0) {
+ pthread_mutex_unlock(&fmutex);
+ return FEEDBACK_ERROR_NONE;
+ }
+
/* initialize device */
devices_init();
@@ -49,14 +54,22 @@ API int feedback_initialize(void)
if (profile->init)
profile->init();
- binit = true;
+ pthread_mutex_unlock(&fmutex);
return FEEDBACK_ERROR_NONE;
}
API int feedback_deinitialize(void)
{
- if (!binit)
+ pthread_mutex_lock(&fmutex);
+ if (!init_cnt) {
+ pthread_mutex_unlock(&fmutex);
return FEEDBACK_ERROR_NOT_INITIALIZED;
+ }
+
+ if (init_cnt-- > 1) {
+ pthread_mutex_unlock(&fmutex);
+ return FEEDBACK_ERROR_NONE;
+ }
/* deinitialize device */
devices_exit();
@@ -65,7 +78,7 @@ API int feedback_deinitialize(void)
if (profile->exit)
profile->exit();
- binit = false;
+ pthread_mutex_unlock(&fmutex);
return FEEDBACK_ERROR_NONE;
}
@@ -76,10 +89,13 @@ API int feedback_play(feedback_pattern_e pattern)
int switched;
/* check initialize */
- if (!binit) {
+ pthread_mutex_lock(&fmutex);
+ if (!init_cnt) {
_E("Not initialized");
+ pthread_mutex_unlock(&fmutex);
return FEEDBACK_ERROR_NOT_INITIALIZED;
}
+ pthread_mutex_unlock(&fmutex);
if (pattern <= FEEDBACK_PATTERN_NONE ||
pattern >= profile->max_pattern) {
@@ -120,10 +136,13 @@ API int feedback_play_type(feedback_type_e type, feedback_pattern_e pattern)
int switched;
/* check initialize */
- if (!binit) {
+ pthread_mutex_lock(&fmutex);
+ if (!init_cnt) {
_E("Not initialized");
+ pthread_mutex_unlock(&fmutex);
return FEEDBACK_ERROR_NOT_INITIALIZED;
}
+ pthread_mutex_unlock(&fmutex);
if (type <= FEEDBACK_TYPE_NONE ||
type >= profile->max_type) {
@@ -170,10 +189,13 @@ API int feedback_stop(void)
int err;
/* check initialize */
- if (!binit) {
+ pthread_mutex_lock(&fmutex);
+ if (!init_cnt) {
_E("Not initialized");
+ pthread_mutex_unlock(&fmutex);
return FEEDBACK_ERROR_NOT_INITIALIZED;
}
+ pthread_mutex_unlock(&fmutex);
/* stop all device */
err = devices_stop();
@@ -196,10 +218,13 @@ API int feedback_is_supported_pattern(feedback_type_e type, feedback_pattern_e p
int switched;
/* check initialize */
- if (!binit) {
+ pthread_mutex_lock(&fmutex);
+ if (!init_cnt) {
_E("Not initialized");
+ pthread_mutex_unlock(&fmutex);
return FEEDBACK_ERROR_NOT_INITIALIZED;
}
+ pthread_mutex_unlock(&fmutex);
if (!status) {
_E("Invalid parameter : status(NULL)");