client: Add mutex to guard callback pointer change
authorSangchul Lee <sc11.lee@samsung.com>
Thu, 11 May 2023 03:27:41 +0000 (12:27 +0900)
committer이상철/Tizen Platform Lab(SR)/삼성전자 <sc11.lee@samsung.com>
Thu, 11 May 2023 05:35:24 +0000 (14:35 +0900)
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
src/client/espp_service_client.c
src/client/espp_service_client_event_handler.c
src/client/espp_service_client_priv.h

index fbd33a37d40ab6b079c46801929b7515b0ef3214..50bd0605988a677301ce8d0eb2cab734d3271126 100644 (file)
@@ -21,6 +21,7 @@ int espp_client_set_ready_to_prepare_cb(espp_h espp, espp_ready_to_prepare_cb ca
 {
        espp_s *_espp = (espp_s *)espp;
        g_autoptr(GMutexLocker) locker = NULL;
+       g_autoptr(GMutexLocker) cb_locker = NULL;
 
        RET_VAL_IF(!espp, ESPP_CLIENT_ERROR_INVALID_PARAMETER, "espp is NULL");
        RET_VAL_IF(!callback, ESPP_CLIENT_ERROR_INVALID_PARAMETER, "callback is NULL");
@@ -30,6 +31,7 @@ int espp_client_set_ready_to_prepare_cb(espp_h espp, espp_ready_to_prepare_cb ca
        if (espp_service_client_socket_request_set_callback(_espp, ESPP_SERVICE_EVENT_CB_READY_TO_PREPARE, (void *)callback, user_data) != 0)
                return ESPP_CLIENT_ERROR_INVALID_OPERATION;
 
+       cb_locker = g_mutex_locker_new(&_espp->cb_mutex);
        LOG_WARNING_IF_CALLBACK_EXISTS(_espp->ready_to_prepare_cb);
 
        _espp->ready_to_prepare_cb.callback = callback;
@@ -44,6 +46,7 @@ int espp_client_set_prepare_async_done_cb(espp_h espp, espp_prepare_async_done_c
 {
        espp_s *_espp = (espp_s *)espp;
        g_autoptr(GMutexLocker) locker = NULL;
+       g_autoptr(GMutexLocker) cb_locker = NULL;
 
        RET_VAL_IF(!espp, ESPP_CLIENT_ERROR_INVALID_PARAMETER, "espp is NULL");
        RET_VAL_IF(!callback, ESPP_CLIENT_ERROR_INVALID_PARAMETER, "callback is NULL");
@@ -53,6 +56,7 @@ int espp_client_set_prepare_async_done_cb(espp_h espp, espp_prepare_async_done_c
        if (espp_service_client_socket_request_set_callback(_espp, ESPP_SERVICE_EVENT_CB_PREPARE_ASYNC_DONE, (void *)callback, user_data) != 0)
                return ESPP_CLIENT_ERROR_INVALID_OPERATION;
 
+       cb_locker = g_mutex_locker_new(&_espp->cb_mutex);
        LOG_WARNING_IF_CALLBACK_EXISTS(_espp->prepare_async_done_cb);
 
        _espp->prepare_async_done_cb.callback = callback;
@@ -67,6 +71,7 @@ int espp_client_set_seek_done_cb(espp_h espp, espp_seek_done_cb callback, void *
 {
        espp_s *_espp = (espp_s *)espp;
        g_autoptr(GMutexLocker) locker = NULL;
+       g_autoptr(GMutexLocker) cb_locker = NULL;
 
        RET_VAL_IF(!espp, ESPP_CLIENT_ERROR_INVALID_PARAMETER, "espp is NULL");
        RET_VAL_IF(!callback, ESPP_CLIENT_ERROR_INVALID_PARAMETER, "callback is NULL");
@@ -76,6 +81,7 @@ int espp_client_set_seek_done_cb(espp_h espp, espp_seek_done_cb callback, void *
        if (espp_service_client_socket_request_set_callback(_espp, ESPP_SERVICE_EVENT_CB_SEEK_DONE, (void *)callback, user_data) != 0)
                return ESPP_CLIENT_ERROR_INVALID_OPERATION;
 
+       cb_locker = g_mutex_locker_new(&_espp->cb_mutex);
        LOG_WARNING_IF_CALLBACK_EXISTS(_espp->seek_done_cb);
 
        _espp->seek_done_cb.callback = callback;
@@ -90,6 +96,7 @@ int espp_client_set_eos_cb(espp_h espp, espp_eos_cb callback, void *user_data)
 {
        espp_s *_espp = (espp_s *)espp;
        g_autoptr(GMutexLocker) locker = NULL;
+       g_autoptr(GMutexLocker) cb_locker = NULL;
 
        RET_VAL_IF(!espp, ESPP_CLIENT_ERROR_INVALID_PARAMETER, "espp is NULL");
        RET_VAL_IF(!callback, ESPP_CLIENT_ERROR_INVALID_PARAMETER, "callback is NULL");
@@ -99,6 +106,7 @@ int espp_client_set_eos_cb(espp_h espp, espp_eos_cb callback, void *user_data)
        if (espp_service_client_socket_request_set_callback(_espp, ESPP_SERVICE_EVENT_CB_EOS, (void *)callback, user_data) != 0)
                return ESPP_CLIENT_ERROR_INVALID_OPERATION;
 
+       cb_locker = g_mutex_locker_new(&_espp->cb_mutex);
        LOG_WARNING_IF_CALLBACK_EXISTS(_espp->eos_cb);
 
        _espp->eos_cb.callback = callback;
@@ -113,6 +121,7 @@ int espp_client_set_buffer_status_cb(espp_h espp, espp_buffer_status_cb callback
 {
        espp_s *_espp = (espp_s *)espp;
        g_autoptr(GMutexLocker) locker = NULL;
+       g_autoptr(GMutexLocker) cb_locker = NULL;
 
        RET_VAL_IF(!espp, ESPP_CLIENT_ERROR_INVALID_PARAMETER, "espp is NULL");
        RET_VAL_IF(!callback, ESPP_CLIENT_ERROR_INVALID_PARAMETER, "callback is NULL");
@@ -122,6 +131,7 @@ int espp_client_set_buffer_status_cb(espp_h espp, espp_buffer_status_cb callback
        if (espp_service_client_socket_request_set_callback(_espp, ESPP_SERVICE_EVENT_CB_BUFFER_STATUS, (void *)callback, user_data) != 0)
                return ESPP_CLIENT_ERROR_INVALID_OPERATION;
 
+       cb_locker = g_mutex_locker_new(&_espp->cb_mutex);
        LOG_WARNING_IF_CALLBACK_EXISTS(_espp->buffer_status_cb);
 
        _espp->buffer_status_cb.callback = callback;
@@ -136,6 +146,7 @@ int espp_client_set_resource_conflicted_cb(espp_h espp, espp_resource_conflicted
 {
        espp_s *_espp = (espp_s *)espp;
        g_autoptr(GMutexLocker) locker = NULL;
+       g_autoptr(GMutexLocker) cb_locker = NULL;
 
        RET_VAL_IF(!espp, ESPP_CLIENT_ERROR_INVALID_PARAMETER, "espp is NULL");
        RET_VAL_IF(!callback, ESPP_CLIENT_ERROR_INVALID_PARAMETER, "callback is NULL");
@@ -145,6 +156,7 @@ int espp_client_set_resource_conflicted_cb(espp_h espp, espp_resource_conflicted
        if (espp_service_client_socket_request_set_callback(_espp, ESPP_SERVICE_EVENT_CB_RESOURCE_CONFLICTED, (void *)callback, user_data) != 0)
                return ESPP_CLIENT_ERROR_INVALID_OPERATION;
 
+       cb_locker = g_mutex_locker_new(&_espp->cb_mutex);
        LOG_WARNING_IF_CALLBACK_EXISTS(_espp->resource_conflicted_cb);
 
        _espp->resource_conflicted_cb.callback = callback;
@@ -166,6 +178,7 @@ int espp_client_create(espp_h *espp)
        _espp->event_fd = -1;
 
        g_mutex_init(&_espp->mutex);
+       g_mutex_init(&_espp->cb_mutex);
 
        if (espp_service_client_socket_request_create(_espp) != 0) {
                g_free(_espp);
@@ -205,6 +218,7 @@ int espp_client_destroy(espp_h espp)
 
        g_mutex_unlock(&_espp->mutex);
        g_mutex_clear(&_espp->mutex);
+       g_mutex_clear(&_espp->cb_mutex);
 
        LOG_INFO("espp[%p] is destroyed", espp);
 
index df5d04b7520c954cf4124d54c654898e19befcfc..cda6ee98a1f8f64685e20112be0671d25c5d7efc 100644 (file)
@@ -215,7 +215,10 @@ gpointer espp_service_client_event_handler_thread_func(gpointer user_data)
                LOG_DEBUG("<<<<< from fd[%d]: event[%s]", espp->event_fd, events[rx_data.event].str);
 
                memset(&tx_data, 0x00, write_len);
+
+               g_mutex_lock(&espp->cb_mutex);
                __func_handler(espp, &rx_data, &tx_data);
+               g_mutex_unlock(&espp->cb_mutex);
 
                LOG_DEBUG(">>>>>> to fd[%d]: tx_data.ret[%d]", espp->event_fd, tx_data.ret);
 
index 8e7900c92830455230faee50db7048db788bd818..4b5f018f11ff7d26728afcbf68f193e3136cefed 100644 (file)
@@ -46,6 +46,7 @@ typedef struct {
 
 typedef struct _espp_s {
        GMutex mutex;
+       GMutex cb_mutex;
 
        int fd;
        int event_fd;