wifi: clear scan_request_ssids_hash if not needed
It is very uncommon that a user provides explicit SSIDs to scan. So, most of the time there is nothing to do here.
This commit is contained in:
@@ -214,23 +214,24 @@ typedef struct {
|
|||||||
} ScanRequestSsidData;
|
} ScanRequestSsidData;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_scan_request_ssids_remove (NMDeviceWifiPrivate *priv,
|
_scan_request_ssids_remove (ScanRequestSsidData *srs_data)
|
||||||
ScanRequestSsidData *srs_data,
|
|
||||||
GBytes **out_ssid)
|
|
||||||
{
|
{
|
||||||
nm_assert (priv->scan_request_ssids_hash);
|
|
||||||
nm_assert (g_hash_table_lookup (priv->scan_request_ssids_hash, srs_data) == srs_data);
|
|
||||||
|
|
||||||
if (!g_hash_table_remove (priv->scan_request_ssids_hash, srs_data))
|
|
||||||
nm_assert_not_reached ();
|
|
||||||
c_list_unlink_stale (&srs_data->lst);
|
c_list_unlink_stale (&srs_data->lst);
|
||||||
if (out_ssid)
|
|
||||||
*out_ssid = srs_data->ssid;
|
|
||||||
else
|
|
||||||
g_bytes_unref (srs_data->ssid);
|
g_bytes_unref (srs_data->ssid);
|
||||||
nm_g_slice_free (srs_data);
|
nm_g_slice_free (srs_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_scan_request_ssids_remove_with_hash (NMDeviceWifiPrivate *priv,
|
||||||
|
ScanRequestSsidData *srs_data)
|
||||||
|
{
|
||||||
|
nm_assert (srs_data);
|
||||||
|
nm_assert (nm_g_hash_table_lookup (priv->scan_request_ssids_hash, srs_data) == srs_data);
|
||||||
|
if (!g_hash_table_remove (priv->scan_request_ssids_hash, srs_data))
|
||||||
|
nm_assert_not_reached ();
|
||||||
|
_scan_request_ssids_remove (srs_data);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_scan_request_ssids_remove_all (NMDeviceWifiPrivate *priv,
|
_scan_request_ssids_remove_all (NMDeviceWifiPrivate *priv,
|
||||||
gint64 cutoff_with_now_msec,
|
gint64 cutoff_with_now_msec,
|
||||||
@@ -238,6 +239,17 @@ _scan_request_ssids_remove_all (NMDeviceWifiPrivate *priv,
|
|||||||
{
|
{
|
||||||
ScanRequestSsidData *srs_data;
|
ScanRequestSsidData *srs_data;
|
||||||
|
|
||||||
|
nm_assert ((!priv->scan_request_ssids_hash) == c_list_is_empty (&priv->scan_request_ssids_lst_head));
|
||||||
|
if (!priv->scan_request_ssids_hash)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (cutoff_at_len == 0) {
|
||||||
|
nm_clear_pointer (&priv->scan_request_ssids_hash, g_hash_table_destroy);
|
||||||
|
while ((srs_data = c_list_first_entry (&priv->scan_request_ssids_lst_head, ScanRequestSsidData, lst)))
|
||||||
|
_scan_request_ssids_remove (srs_data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (cutoff_with_now_msec != 0) {
|
if (cutoff_with_now_msec != 0) {
|
||||||
gint64 cutoff_time_msec;
|
gint64 cutoff_time_msec;
|
||||||
|
|
||||||
@@ -247,7 +259,7 @@ _scan_request_ssids_remove_all (NMDeviceWifiPrivate *priv,
|
|||||||
while ((srs_data = c_list_last_entry (&priv->scan_request_ssids_lst_head, ScanRequestSsidData, lst))) {
|
while ((srs_data = c_list_last_entry (&priv->scan_request_ssids_lst_head, ScanRequestSsidData, lst))) {
|
||||||
if (srs_data->timestamp_msec > cutoff_time_msec)
|
if (srs_data->timestamp_msec > cutoff_time_msec)
|
||||||
break;
|
break;
|
||||||
_scan_request_ssids_remove (priv, srs_data, NULL);
|
_scan_request_ssids_remove_with_hash (priv, srs_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -260,12 +272,14 @@ _scan_request_ssids_remove_all (NMDeviceWifiPrivate *priv,
|
|||||||
ScanRequestSsidData *d;
|
ScanRequestSsidData *d;
|
||||||
|
|
||||||
d = c_list_last_entry (&priv->scan_request_ssids_lst_head, ScanRequestSsidData, lst);
|
d = c_list_last_entry (&priv->scan_request_ssids_lst_head, ScanRequestSsidData, lst);
|
||||||
_scan_request_ssids_remove (priv, d, NULL);
|
_scan_request_ssids_remove_with_hash (priv, d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nm_assert (nm_g_hash_table_size (priv->scan_request_ssids_hash) <= SCAN_REQUEST_SSIDS_MAX_NUM);
|
nm_assert (nm_g_hash_table_size (priv->scan_request_ssids_hash) <= SCAN_REQUEST_SSIDS_MAX_NUM);
|
||||||
nm_assert (nm_g_hash_table_size (priv->scan_request_ssids_hash) == c_list_length (&priv->scan_request_ssids_lst_head));
|
nm_assert (nm_g_hash_table_size (priv->scan_request_ssids_hash) == c_list_length (&priv->scan_request_ssids_lst_head));
|
||||||
|
if (c_list_is_empty (&priv->scan_request_ssids_lst_head))
|
||||||
|
nm_clear_pointer (&priv->scan_request_ssids_hash, g_hash_table_destroy);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GPtrArray *
|
static GPtrArray *
|
||||||
@@ -282,11 +296,10 @@ _scan_request_ssids_fetch (NMDeviceWifiPrivate *priv, gint64 now_msec)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
ssids = g_ptr_array_new_full (len, (GDestroyNotify) g_bytes_unref);
|
ssids = g_ptr_array_new_full (len, (GDestroyNotify) g_bytes_unref);
|
||||||
|
nm_clear_pointer (&priv->scan_request_ssids_hash, g_hash_table_destroy);
|
||||||
while ((srs_data = c_list_first_entry (&priv->scan_request_ssids_lst_head, ScanRequestSsidData, lst))) {
|
while ((srs_data = c_list_first_entry (&priv->scan_request_ssids_lst_head, ScanRequestSsidData, lst))) {
|
||||||
GBytes *ssid;
|
g_ptr_array_add (ssids, g_steal_pointer (&srs_data->ssid));
|
||||||
|
_scan_request_ssids_remove (srs_data);
|
||||||
_scan_request_ssids_remove (priv, srs_data, &ssid);
|
|
||||||
g_ptr_array_add (ssids, ssid);
|
|
||||||
}
|
}
|
||||||
return ssids;
|
return ssids;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user