diff options
author | jusung <jusung07.son@samsung.com> | 2021-04-07 14:18:44 +0900 |
---|---|---|
committer | jusung <jusung07.son@samsung.com> | 2021-04-07 14:20:18 +0900 |
commit | 8acef5067403613f77819e10c94bd82c28fcdd1c (patch) | |
tree | 4897af54ab94797ae52bdc9e50e76a6402abbbdd | |
parent | 77c630a6c63b55b4a0f98c0d54b910e34d46f69a (diff) | |
download | data-control-8acef5067403613f77819e10c94bd82c28fcdd1c.tar.gz data-control-8acef5067403613f77819e10c94bd82c28fcdd1c.tar.bz2 data-control-8acef5067403613f77819e10c94bd82c28fcdd1c.zip |
Fix multi-thread issue
Change-Id: Ia4a5722c37ebe706e2f424aa6a551f24a3109ce3
Signed-off-by: jusung <jusung07.son@samsung.com>
-rw-r--r-- | src/data_control_internal.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/src/data_control_internal.c b/src/data_control_internal.c index 40a706c..d007146 100644 --- a/src/data_control_internal.c +++ b/src/data_control_internal.c @@ -101,10 +101,18 @@ static GHashTable *__checked_consumer_hash; static GDBusConnection *_gdbus_conn; static pthread_mutex_t __data_control_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t __data_control_socket_mutex = PTHREAD_MUTEX_INITIALIZER; /* 100 milliseconds */ const struct timespec TRY_SLEEP_TIME = { 0, 100 * 1000 * 1000 }; +void __remove_socket_pair_hash(const char *provider_id) +{ + pthread_mutex_lock(&__data_control_socket_mutex); + g_hash_table_remove(__socket_pair_hash, provider_id); + pthread_mutex_unlock(&__data_control_socket_mutex); +} + int __get_unique_handle_id(void) { static int id = 0; @@ -1197,7 +1205,7 @@ error: if (((__response_cb_s *)data) != NULL) { _dc = (__response_cb_s *)data; - g_hash_table_remove(__socket_pair_hash, _dc->provider_id); + __remove_socket_pair_hash(_dc->provider_id); itr = g_list_first(_dc->request_info_list); while (itr != NULL) { @@ -1599,6 +1607,7 @@ int _request_provider(data_control_h provider, datacontrol_request_type type, const struct timespec TRY_SLEEP_TIME = { 0, 1000 * 1000 * 1000 }; bundle *send_data; char *socket_hash_key; + int socket; _LOGI("Data control request, type: %d, request id: %d", type, request_id); @@ -1669,6 +1678,7 @@ int _request_provider(data_control_h provider, datacontrol_request_type type, _LOGI("caller_id %s, app_id %s", caller_app_id, app_id); do { + pthread_mutex_lock(&__data_control_socket_mutex); datacontrol_socket_info *socket_info = g_hash_table_lookup(__socket_pair_hash, provider->provider_id); if (socket_info == NULL) { @@ -1678,6 +1688,7 @@ int _request_provider(data_control_h provider, datacontrol_request_type type, &socket_info); if (ret != DATA_CONTROL_ERROR_NONE) { bundle_free(send_data); + pthread_mutex_unlock(&__data_control_socket_mutex); return ret; } @@ -1686,6 +1697,7 @@ int _request_provider(data_control_h provider, datacontrol_request_type type, bundle_free(send_data); _socket_info_free((gpointer)socket_info); _LOGE("Out of memory"); + pthread_mutex_unlock(&__data_control_socket_mutex); return DATA_CONTROL_ERROR_OUT_OF_MEMORY; } @@ -1694,6 +1706,7 @@ int _request_provider(data_control_h provider, datacontrol_request_type type, bundle_free(send_data); _socket_info_free((gpointer)socket_info); free(socket_hash_key); + pthread_mutex_unlock(&__data_control_socket_mutex); return ret; } @@ -1701,13 +1714,17 @@ int _request_provider(data_control_h provider, datacontrol_request_type type, socket_hash_key, socket_info); } + socket = socket_info->socket_fd; + pthread_mutex_unlock(&__data_control_socket_mutex); + _LOGI("send data from consumer"); - ret = __datacontrol_send_async(socket_info->socket_fd, send_data, + ret = __datacontrol_send_async(socket, send_data, extra_data, type, NULL); if (ret != DATA_CONTROL_ERROR_NONE) - g_hash_table_remove(__socket_pair_hash, provider->provider_id); + __remove_socket_pair_hash(provider->provider_id); else break; + count++; nanosleep(&TRY_SLEEP_TIME, 0); } while (ret != DATA_CONTROL_ERROR_NONE && count < TRY_COUNT); @@ -1993,7 +2010,7 @@ int _unregister_response_cb(data_control_h provider, bool is_bind, if (has_bound_cb == NULL && _dc_temp->registered_cb == NULL) { g_hash_table_remove(__response_table, provider->provider_id); - g_hash_table_remove(__socket_pair_hash, provider->provider_id); + __remove_socket_pair_hash(provider->provider_id); _LOGI("All of registered callback was removed"); } } |