From b314bde76a11552f1331ef1a86286d19258fe9d5 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Wed, 6 Sep 2023 18:29:38 +0900 Subject: [PATCH] Fix "invalid signal received" error - 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 --- include/recorder_private.h | 2 +- packaging/capi-media-recorder.spec | 2 +- 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])); -- 2.7.4