summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeongmo Yang <jm80.yang@samsung.com>2023-09-06 18:29:38 +0900
committerJeongmo Yang <jm80.yang@samsung.com>2023-09-06 18:29:38 +0900
commitb314bde76a11552f1331ef1a86286d19258fe9d5 (patch)
treecd8728fb1983ca3feacd0dbd161407a81bc87e02
parent523299fa92faaa7eb14550531aab2c228eea2df2 (diff)
downloadrecorder-b314bde76a11552f1331ef1a86286d19258fe9d5.tar.gz
recorder-b314bde76a11552f1331ef1a86286d19258fe9d5.tar.bz2
recorder-b314bde76a11552f1331ef1a86286d19258fe9d5.zip
- 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.h2
-rw-r--r--packaging/capi-media-recorder.spec2
-rw-r--r--src/recorder.c38
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]));