From d9740d108d5a06bade9703abdadd010647e47c9e Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 30 Apr 2020 10:11:44 +0200 Subject: [PATCH] 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. --- src/devices/wifi/nm-device-wifi.c | 47 ++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/src/devices/wifi/nm-device-wifi.c b/src/devices/wifi/nm-device-wifi.c index 5a4672d05..f5b62989d 100644 --- a/src/devices/wifi/nm-device-wifi.c +++ b/src/devices/wifi/nm-device-wifi.c @@ -214,21 +214,22 @@ typedef struct { } ScanRequestSsidData; static void -_scan_request_ssids_remove (NMDeviceWifiPrivate *priv, - ScanRequestSsidData *srs_data, - GBytes **out_ssid) +_scan_request_ssids_remove (ScanRequestSsidData *srs_data) { - nm_assert (priv->scan_request_ssids_hash); - nm_assert (g_hash_table_lookup (priv->scan_request_ssids_hash, srs_data) == srs_data); + c_list_unlink_stale (&srs_data->lst); + g_bytes_unref (srs_data->ssid); + 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 (); - c_list_unlink_stale (&srs_data->lst); - if (out_ssid) - *out_ssid = srs_data->ssid; - else - g_bytes_unref (srs_data->ssid); - nm_g_slice_free (srs_data); + _scan_request_ssids_remove (srs_data); } static void @@ -238,6 +239,17 @@ _scan_request_ssids_remove_all (NMDeviceWifiPrivate *priv, { 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) { 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))) { if (srs_data->timestamp_msec > cutoff_time_msec) 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; 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) == 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 * @@ -282,11 +296,10 @@ _scan_request_ssids_fetch (NMDeviceWifiPrivate *priv, gint64 now_msec) return NULL; 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))) { - GBytes *ssid; - - _scan_request_ssids_remove (priv, srs_data, &ssid); - g_ptr_array_add (ssids, ssid); + g_ptr_array_add (ssids, g_steal_pointer (&srs_data->ssid)); + _scan_request_ssids_remove (srs_data); } return ssids; }