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:
Thomas Haller
2020-04-30 10:11:44 +02:00
parent 3af9209d47
commit d9740d108d

View File

@@ -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;
} }