diff options
author | Thomas Haller <thaller@redhat.com> | 2020-11-20 12:09:18 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2020-11-24 08:53:01 +0100 |
commit | d358f96104f4c6e279b29884bf4a536f0030cf17 (patch) | |
tree | 453b33371e30bd1a086403450d1649732f67daa5 | |
parent | ef12e9a9e281c322f07428706a44ccba36ae9095 (diff) | |
download | NetworkManager-d358f96104f4c6e279b29884bf4a536f0030cf17.tar.gz |
dns: allow sorting of NMDnsConfigData
We will rework preparing the DNS data, so that we do things that
currently "nm-dns-systemd-resolved.c" does (see InterfaceConfig).
We thus will need to access the NMDnsConfigData, which is per-ifindex.
As such, it is useful to have NMDnsConfigData in a stable order, sorted
by ifindex. As we track NMDnsConfigData in a hash table, we need to
do the sorting outside of that.
There are many ways to achive that. The solution here is to let
NMDnsConfigData also be tracked by a CList. We only need to resort
the list, when we add a new ifindex -- which should happen only seldom.
The advantage is that the sorting happens in-place and can expose
it to other uses (by providing them access to the CList head).
-rw-r--r-- | src/dns/nm-dns-manager.c | 38 | ||||
-rw-r--r-- | src/dns/nm-dns-manager.h | 5 |
2 files changed, 40 insertions, 3 deletions
diff --git a/src/dns/nm-dns-manager.c b/src/dns/nm-dns-manager.c index c003c9e711..081f922092 100644 --- a/src/dns/nm-dns-manager.c +++ b/src/dns/nm-dns-manager.c @@ -81,14 +81,18 @@ static guint signals[LAST_SIGNAL] = {0}; typedef struct { GHashTable *configs; - CList ip_config_lst_head; - GVariant * config_variant; + CList configs_lst_head; + + CList ip_config_lst_head; + GVariant *config_variant; NMDnsIPConfigData *best_ip_config_4; NMDnsIPConfigData *best_ip_config_6; bool ip_config_lst_need_sort : 1; + bool configs_lst_need_sort : 1; + bool dns_touched : 1; bool is_stopped : 1; @@ -314,6 +318,7 @@ _config_data_free(NMDnsConfigData *data) _ASSERT_config_data(data); nm_assert(c_list_is_empty(&data->data_lst_head)); + c_list_unlink_stale(&data->configs_lst); nm_g_slice_free(data); } @@ -338,7 +343,7 @@ _ip_config_lst_head(NMDnsManager *self) { NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE(self); - if (priv->ip_config_lst_need_sort) { + if (G_UNLIKELY(priv->ip_config_lst_need_sort)) { priv->ip_config_lst_need_sort = FALSE; c_list_sort(&priv->ip_config_lst_head, _ip_config_lst_cmp, NULL); } @@ -346,6 +351,29 @@ _ip_config_lst_head(NMDnsManager *self) return &priv->ip_config_lst_head; } +static int +_configs_lst_cmp(const CList *a_lst, const CList *b_lst, const void *user_data) +{ + const NMDnsConfigData *a = c_list_entry(a_lst, NMDnsConfigData, configs_lst); + const NMDnsConfigData *b = c_list_entry(b_lst, NMDnsConfigData, configs_lst); + + NM_CMP_FIELD(b, a, ifindex); + return nm_assert_unreachable_val(0); +} + +_nm_unused static CList * +_config_data_lst_head(NMDnsManager *self) +{ + NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE(self); + + if (G_UNLIKELY(priv->configs_lst_need_sort)) { + priv->configs_lst_need_sort = FALSE; + c_list_sort(&priv->configs_lst_head, _configs_lst_cmp, NULL); + } + + return &priv->configs_lst_head; +} + /*****************************************************************************/ gboolean @@ -1857,6 +1885,8 @@ nm_dns_manager_set_ip_config(NMDnsManager * self, }; _ASSERT_config_data(data); g_hash_table_add(priv->configs, data); + c_list_link_tail(&priv->configs_lst_head, &data->configs_lst); + priv->configs_lst_need_sort = TRUE; } if (!ip_data) @@ -2505,6 +2535,7 @@ nm_dns_manager_init(NMDnsManager *self) _LOGT("creating..."); + c_list_init(&priv->configs_lst_head); c_list_init(&priv->ip_config_lst_head); priv->config = g_object_ref(nm_config_get()); @@ -2550,6 +2581,7 @@ dispose(GObject *object) _ip_config_data_free(ip_data); nm_clear_pointer(&priv->configs, g_hash_table_destroy); + nm_assert(c_list_is_empty(&priv->configs_lst_head)); nm_clear_g_source(&priv->plugin_ratelimit.timer); diff --git a/src/dns/nm-dns-manager.h b/src/dns/nm-dns-manager.h index fb2f36d222..43e1995001 100644 --- a/src/dns/nm-dns-manager.h +++ b/src/dns/nm-dns-manager.h @@ -25,6 +25,8 @@ enum { NM_DNS_PRIORITY_DEFAULT_VPN = 50, }; +/*****************************************************************************/ + struct _NMDnsConfigData; struct _NMDnsManager; @@ -66,8 +68,11 @@ typedef struct _NMDnsConfigData { int ifindex; struct _NMDnsManager *self; CList data_lst_head; + CList configs_lst; } NMDnsConfigData; +/*****************************************************************************/ + #define NM_TYPE_DNS_MANAGER (nm_dns_manager_get_type()) #define NM_DNS_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST((o), NM_TYPE_DNS_MANAGER, NMDnsManager)) #define NM_DNS_MANAGER_CLASS(k) \ |