diff options
author | Jeongmo Yang <jm80.yang@samsung.com> | 2023-09-06 18:29:38 +0900 |
---|---|---|
committer | Jeongmo Yang <jm80.yang@samsung.com> | 2023-09-06 18:29:38 +0900 |
commit | b314bde76a11552f1331ef1a86286d19258fe9d5 (patch) | |
tree | cd8728fb1983ca3feacd0dbd161407a81bc87e02 | |
parent | 523299fa92faaa7eb14550531aab2c228eea2df2 (diff) | |
download | recorder-b314bde76a11552f1331ef1a86286d19258fe9d5.tar.gz recorder-b314bde76a11552f1331ef1a86286d19258fe9d5.tar.bz2 recorder-b314bde76a11552f1331ef1a86286d19258fe9d5.zip |
Fix "invalid signal received" errortizen_8.0_m2_releaseaccepted/tizen/unified/20230911.091123accepted/tizen/8.0/unified/20231005.092827tizen_8.0accepted/tizen_8.0_unified
- If the same API is called in several threads simultaneously,
"api_activating[api]" value is reset when first response is come.
As a result, second response will get "invalid signal received" error.
- This patch changes type of "api_activating" member variable from "gboolean" to "gint",
and use it like reference count.
[Version] 0.3.41
[Issue Type] Bug fix
Change-Id: I08aa674d1d99d3a84af85b98e10dd047d944d3f9
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
-rw-r--r-- | include/recorder_private.h | 2 | ||||
-rw-r--r-- | packaging/capi-media-recorder.spec | 2 | ||||
-rw-r--r-- | src/recorder.c | 38 |
3 files changed, 33 insertions, 9 deletions
diff --git a/include/recorder_private.h b/include/recorder_private.h index 5ef87f7..b5937c2 100644 --- a/include/recorder_private.h +++ b/include/recorder_private.h @@ -132,7 +132,7 @@ typedef struct _recorder_cb_info_s { gchar recv_msg[MUSE_MSG_MAX_LENGTH + 1]; GCond api_cond[MUSE_RECORDER_API_MAX]; GMutex api_mutex[MUSE_RECORDER_API_MAX]; - gboolean api_activating[MUSE_RECORDER_API_MAX]; + gint api_activating[MUSE_RECORDER_API_MAX]; gint api_waiting[MUSE_RECORDER_API_MAX]; gint api_ret[MUSE_RECORDER_API_MAX]; diff --git a/packaging/capi-media-recorder.spec b/packaging/capi-media-recorder.spec index d3da553..129ca7b 100644 --- a/packaging/capi-media-recorder.spec +++ b/packaging/capi-media-recorder.spec @@ -1,6 +1,6 @@ Name: capi-media-recorder Summary: A Recorder API -Version: 0.3.40 +Version: 0.3.41 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/recorder.c b/src/recorder.c index 66f5f5a..9066219 100644 --- a/src/recorder.c +++ b/src/recorder.c @@ -915,7 +915,15 @@ static void __recorder_process_msg(recorder_cb_info_s *cb_info, char *msg, int * if (cb_info->api_waiting[api] > 0) { cb_info->api_ret[api] = ret; - cb_info->api_activating[api] = TRUE; + + if (cb_info->api_activating[api] < 0) { + REC_LOG_WARNING("api[%d] invalid activating[%d]", + api, cb_info->api_activating[api]); + + cb_info->api_activating[api] = 0; + } + + cb_info->api_activating[api]++; g_cond_signal(&cb_info->api_cond[api]); } else { @@ -984,7 +992,15 @@ static void *_recorder_msg_handler_func(gpointer data) if (muse_recorder_msg_get(ret, rec_msg->recv_msg)) { if (cb_info->api_waiting[api] > 0) { cb_info->api_ret[api] = ret; - cb_info->api_activating[api] = TRUE; + + if (cb_info->api_activating[api] < 0) { + REC_LOG_WARNING("api[%d] invalid activating[%d]", + api, cb_info->api_activating[api]); + + cb_info->api_activating[api] = 0; + } + + cb_info->api_activating[api]++; REC_LOG_DEBUG("recorder api[%d] - return[0x%x]", api, ret); @@ -1305,11 +1321,12 @@ static int _recorder_client_wait_for_cb_return(muse_recorder_api_e api, recorder g_mutex_lock(&(cb_info->api_mutex[api])); - REC_LOG_INFO("api[%d], timeout[%d]sec", api, time_out); + REC_LOG_INFO("api[%d], timeout[%d]sec, START:activating[%d]", + api, time_out, cb_info->api_activating[api]); end_time = g_get_monotonic_time() + time_out * G_TIME_SPAN_SECOND; - while (!cb_info->api_activating[api]) { + while (cb_info->api_activating[api] <= 0) { if (time_out == RECORDER_CB_NO_TIMEOUT) { g_cond_wait(&(cb_info->api_cond[api]), &(cb_info->api_mutex[api])); REC_LOG_WARNING("api[%d] returned[0x%x]", api, cb_info->api_ret[api]); @@ -1319,12 +1336,19 @@ static int _recorder_client_wait_for_cb_return(muse_recorder_api_e api, recorder goto _CB_RETURN_END; } - if (!cb_info->api_activating[api]) - REC_LOG_WARNING("invalid signal received, wait again..."); + if (cb_info->api_activating[api] <= 0) + REC_LOG_WARNING("api[%d] invalid signal received, wait again...", api); } ret = cb_info->api_ret[api]; - cb_info->api_activating[api] = FALSE; + + if (cb_info->api_activating[api] > 0) { + cb_info->api_activating[api]--; + REC_LOG_INFO("api[%d] END:activating[%d]", api, cb_info->api_activating[api]); + } else { + REC_LOG_WARNING("api[%d] invalid activating[%d]", + api, cb_info->api_activating[api]); + } _CB_RETURN_END: g_mutex_unlock(&(cb_info->api_mutex[api])); |