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 <n.chaprana@samsung.com>
/*****************************************************************************
* Global Functions
*****************************************************************************/
/*****************************************************************************
* 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);
void _network_info_ref(network_info_t *network_info);
void _network_info_unref(network_info_t *network_info);
Name: libnet-client
Summary: Network Client library (Shared library)
Name: libnet-client
Summary: Network Client library (Shared library)
Release: 1
Group: System/Network
License: Flora-1.1
Release: 1
Group: System/Network
License: Flora-1.1
+
+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);
void _network_info_ref(network_info_t *network_info)
{
__atomic_add_fetch(&network_info->refcount, 1, __ATOMIC_ACQ_REL);
static GSList *cs_tid_list = NULL;
/* LCOV_EXCL_START */
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__;
static int __net_handle_wifi_power_rsp(gboolean value, network_info_t *network_info)
{
__NETWORK_FUNC_ENTER__;
event_data->Datalength = sizeof(net_wifi_state_t);
event_data->Data = &(net_wifi_state);
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__;
g_free(event_data);
__NETWORK_FUNC_EXIT__;
"Sending NET_EVENT_NET_STATE_IND, state: %d, profile name: %s",
profile_state, event_data->ProfileName);
"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__;
g_free(event_data);
__NETWORK_FUNC_EXIT__;
NETWORK_LOG(NETWORK_LOW,
"Sending NET_EVENT_INTERNET_%s_IND", is_online ? "ONLINE" : "OFFLINE");
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__;
g_free(event_data);
__NETWORK_FUNC_EXIT__;
NETWORK_LOG(NETWORK_ERROR, "State failure %d", event_data->Error);
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 */
g_free(event_data);
/* Reseting the state back in case of failure state */
event_data->Error = Error;
g_strlcpy(event_data->ProfileName, sig_path, NET_PROFILE_NAME_LEN_MAX+1);
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);
NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_OPEN_RSP");
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);
NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_WIFI_WPS_RSP");
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);
NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_CLOSE_RSP");
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);
NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_CLOSE_IND");
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);
event_data->Datalength = 0;
event_data->Data = NULL;
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;
g_free(event_data);
return NET_ERR_NONE;
NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_NETWORK_TYPE_CHANGED");
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) {
g_free(event_data);
}
} else if (g_strcmp0(key, "IPv4Address") == 0) {
NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_IPV4_ADDRESS_CHANGED");
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);
}
g_free(event_data->Data);
g_free(event_data);
}
NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_IPV6_ADDRESS_CHANGED");
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);
}
g_free(event_data->Data);
g_free(event_data);
}
NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_PROXY_ADDRESS_CHANGED");
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);
}
g_free(event_data->Data);
g_free(event_data);
}
- 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__;
g_free(event_data);
__NETWORK_FUNC_EXIT__;