Fix "invalid signal received" error 92/298392/1 accepted/tizen_8.0_unified tizen_8.0 accepted/tizen/8.0/unified/20231005.092827 accepted/tizen/unified/20230911.091123 tizen_8.0_m2_release
authorJeongmo Yang <jm80.yang@samsung.com>
Wed, 6 Sep 2023 09:29:38 +0000 (18:29 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Wed, 6 Sep 2023 09:29:38 +0000 (18:29 +0900)
- 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>
include/recorder_private.h
packaging/capi-media-recorder.spec
src/recorder.c

index 5ef87f7..b5937c2 100644 (file)
@@ -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];
 
index d3da553..129ca7b 100644 (file)
@@ -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
index 66f5f5a..9066219 100644 (file)
@@ -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]));