From c3b772df917064eaa3a355a92279489cf572e1b7 Mon Sep 17 00:00:00 2001 From: Nishant Chaprana Date: Wed, 23 Sep 2020 19:56:10 +0530 Subject: [PATCH] Add wrapper to send event callback Sends event only when network_info referenced by net_register_client() If net_deregister_client() is called by App, then events are not sent. Change-Id: I006b6ded8e3444a739e5be2a655bca692619d6c3 Signed-off-by: Nishant Chaprana --- include/internal/network-info.h | 2 +- packaging/libnet-client.spec | 2 +- src/network-internal.c | 14 ++++++++++++ src/network-signal-handler.c | 47 ++++++++++++++++++++++------------------- 4 files changed, 41 insertions(+), 24 deletions(-) diff --git a/include/internal/network-info.h b/include/internal/network-info.h index 2395b2f..ae6794e 100755 --- a/include/internal/network-info.h +++ b/include/internal/network-info.h @@ -122,7 +122,7 @@ typedef struct /***************************************************************************** * Global Functions *****************************************************************************/ - +gboolean _network_info_is_ref(network_info_t *network_info); void _network_info_ref(network_info_t *network_info); void _network_info_unref(network_info_t *network_info); diff --git a/packaging/libnet-client.spec b/packaging/libnet-client.spec index b9b2fb0..dcbd933 100755 --- a/packaging/libnet-client.spec +++ b/packaging/libnet-client.spec @@ -1,6 +1,6 @@ Name: libnet-client Summary: Network Client library (Shared library) -Version: 1.2.3 +Version: 1.2.4 Release: 1 Group: System/Network License: Flora-1.1 diff --git a/src/network-internal.c b/src/network-internal.c index eb3927d..1103d62 100755 --- a/src/network-internal.c +++ b/src/network-internal.c @@ -117,6 +117,20 @@ gboolean _net_remove_idler_from_list(managed_idler_data_t *idler_data) return TRUE; } + +gboolean _network_info_is_ref(network_info_t *network_info) +{ + /** + * Maximum possible ref count is 6 + * (1 of net_register_client() + 5 of dbus signals handlers) + * which gets decreased when net_deregister_client() is called. + */ + if (__atomic_load_n(&network_info->refcount, __ATOMIC_ACQUIRE) < 6) + return FALSE; + + return TRUE; +} + void _network_info_ref(network_info_t *network_info) { __atomic_add_fetch(&network_info->refcount, 1, __ATOMIC_ACQ_REL); diff --git a/src/network-signal-handler.c b/src/network-signal-handler.c index 50e6d82..3cf04df 100755 --- a/src/network-signal-handler.c +++ b/src/network-signal-handler.c @@ -38,6 +38,16 @@ struct cs_tid_info { static GSList *cs_tid_list = NULL; /* LCOV_EXCL_START */ +static void __net_trigger_event_callback(network_info_t *network_info, + net_event_info_t *event_data) +{ + if (!network_info || !event_data || !_network_info_is_ref(network_info)) + return; + + if (network_info->event_callback) + network_info->event_callback(event_data, network_info->user_data); +} + static int __net_handle_wifi_power_rsp(gboolean value, network_info_t *network_info) { __NETWORK_FUNC_ENTER__; @@ -83,8 +93,7 @@ static int __net_handle_wifi_power_rsp(gboolean value, network_info_t *network_i event_data->Datalength = sizeof(net_wifi_state_t); event_data->Data = &(net_wifi_state); - if (network_info->event_callback) - network_info->event_callback(event_data, network_info->user_data); + __net_trigger_event_callback(network_info, event_data); g_free(event_data); __NETWORK_FUNC_EXIT__; @@ -122,7 +131,7 @@ static void __net_handle_state_ind(network_info_t *network_info, "Sending NET_EVENT_NET_STATE_IND, state: %d, profile name: %s", profile_state, event_data->ProfileName); - network_info->event_callback(event_data, network_info->user_data); + __net_trigger_event_callback(network_info, event_data); g_free(event_data); __NETWORK_FUNC_EXIT__; @@ -159,7 +168,7 @@ static void __net_handle_internet_state_ind(network_info_t *network_info, NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_INTERNET_%s_IND", is_online ? "ONLINE" : "OFFLINE"); - network_info->event_callback(event_data, network_info->user_data); + __net_trigger_event_callback(network_info, event_data); g_free(event_data); __NETWORK_FUNC_EXIT__; @@ -236,8 +245,7 @@ static void __net_handle_failure_ind(network_info_t *network_info, NETWORK_LOG(NETWORK_ERROR, "State failure %d", event_data->Error); - if (network_info && network_info->event_callback) - network_info->event_callback(event_data, network_info->user_data); + __net_trigger_event_callback(network_info, event_data); g_free(event_data); /* Reseting the state back in case of failure state */ @@ -376,8 +384,7 @@ static int __net_handle_service_state_changed(network_info_t *network_info, event_data->Error = Error; g_strlcpy(event_data->ProfileName, sig_path, NET_PROFILE_NAME_LEN_MAX+1); - if (network_info && network_info->event_callback) - network_info->event_callback(event_data, network_info->user_data); + __net_trigger_event_callback(network_info, event_data); } break; @@ -406,8 +413,7 @@ static int __net_handle_service_state_changed(network_info_t *network_info, NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_OPEN_RSP"); - if (network_info && network_info->event_callback) - network_info->event_callback(event_data, network_info->user_data); + __net_trigger_event_callback(network_info, event_data); break; } @@ -427,8 +433,7 @@ static int __net_handle_service_state_changed(network_info_t *network_info, NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_WIFI_WPS_RSP"); - if (network_info && network_info->event_callback) - network_info->event_callback(event_data, network_info->user_data); + __net_trigger_event_callback(network_info, event_data); break; } @@ -448,8 +453,7 @@ static int __net_handle_service_state_changed(network_info_t *network_info, NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_CLOSE_RSP"); - if (network_info && network_info->event_callback) - network_info->event_callback(event_data, network_info->user_data); + __net_trigger_event_callback(network_info, event_data); break; } @@ -464,8 +468,7 @@ static int __net_handle_service_state_changed(network_info_t *network_info, NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_CLOSE_IND"); - if (network_info && network_info->event_callback) - network_info->event_callback(event_data, network_info->user_data); + __net_trigger_event_callback(network_info, event_data); break; } @@ -556,7 +559,7 @@ static int __net_handle_ethernet_cable_state_rsp(GVariant *param, event_data->Datalength = 0; event_data->Data = NULL; - network_info->event_callback(event_data, network_info->user_data); + __net_trigger_event_callback(network_info, event_data); g_free(event_data); return NET_ERR_NONE; @@ -656,7 +659,7 @@ static int __net_handle_network_config_changed_event(GVariant *param, NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_NETWORK_TYPE_CHANGED"); - network_info->event_callback(event_data, network_info->user_data); + __net_trigger_event_callback(network_info, event_data); g_free(event_data); } } else if (g_strcmp0(key, "IPv4Address") == 0) { @@ -676,7 +679,7 @@ static int __net_handle_network_config_changed_event(GVariant *param, NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_IPV4_ADDRESS_CHANGED"); - network_info->event_callback(event_data, network_info->user_data); + __net_trigger_event_callback(network_info, event_data); g_free(event_data->Data); g_free(event_data); } @@ -697,7 +700,7 @@ static int __net_handle_network_config_changed_event(GVariant *param, NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_IPV6_ADDRESS_CHANGED"); - network_info->event_callback(event_data, network_info->user_data); + __net_trigger_event_callback(network_info, event_data); g_free(event_data->Data); g_free(event_data); } @@ -718,7 +721,7 @@ static int __net_handle_network_config_changed_event(GVariant *param, NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_PROXY_ADDRESS_CHANGED"); - network_info->event_callback(event_data, network_info->user_data); + __net_trigger_event_callback(network_info, event_data); g_free(event_data->Data); g_free(event_data); } @@ -810,7 +813,7 @@ static int __net_handle_wifi_connect_fail_event(GVariant *param, network_info_t return NET_ERR_NONE; } - network_info->event_callback(event_data, network_info->user_data); + __net_trigger_event_callback(network_info, event_data); g_free(event_data); __NETWORK_FUNC_EXIT__; -- 2.7.4