]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
wait-online: use hash_ops with destructor for managing Link
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 12 Apr 2025 15:20:29 +0000 (00:20 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 13 Apr 2025 01:03:40 +0000 (10:03 +0900)
src/network/wait-online/link.c
src/network/wait-online/manager.c

index a4a64462ffdfd622fd4f1ba083f7163e5f698087..7fd46c848acb6bdc26884e3e0db0af7878dcb591 100644 (file)
 #include "string-util.h"
 #include "strv.h"
 
+Link* link_free(Link *l) {
+
+        if (!l)
+                return NULL;
+
+        if (l->manager) {
+                hashmap_remove(l->manager->links_by_index, INT_TO_PTR(l->ifindex));
+                hashmap_remove(l->manager->links_by_name, l->ifname);
+
+                STRV_FOREACH(n, l->altnames)
+                        hashmap_remove(l->manager->links_by_name, *n);
+        }
+
+        dns_configuration_free(l->dns_configuration);
+
+        free(l->state);
+        free(l->ifname);
+        strv_free(l->altnames);
+        return mfree(l);
+}
+
+DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(
+                link_hash_ops_by_index,
+                void, trivial_hash_func, trivial_compare_func,
+                Link, link_free);
+
 int link_new(Manager *m, Link **ret, int ifindex, const char *ifname) {
         _cleanup_(link_freep) Link *l = NULL;
         _cleanup_free_ char *n = NULL;
@@ -36,7 +62,7 @@ int link_new(Manager *m, Link **ret, int ifindex, const char *ifname) {
                 .dns_configuration = hashmap_remove(m->dns_configuration_by_link_index, INT_TO_PTR(ifindex)),
         };
 
-        r = hashmap_ensure_put(&m->links_by_index, NULL, INT_TO_PTR(ifindex), l);
+        r = hashmap_ensure_put(&m->links_by_index, &link_hash_ops_by_index, INT_TO_PTR(ifindex), l);
         if (r < 0)
                 return r;
 
@@ -51,27 +77,6 @@ int link_new(Manager *m, Link **ret, int ifindex, const char *ifname) {
         return 0;
 }
 
-Link *link_free(Link *l) {
-
-        if (!l)
-                return NULL;
-
-        if (l->manager) {
-                hashmap_remove(l->manager->links_by_index, INT_TO_PTR(l->ifindex));
-                hashmap_remove(l->manager->links_by_name, l->ifname);
-
-                STRV_FOREACH(n, l->altnames)
-                        hashmap_remove(l->manager->links_by_name, *n);
-        }
-
-        dns_configuration_free(l->dns_configuration);
-
-        free(l->state);
-        free(l->ifname);
-        strv_free(l->altnames);
-        return mfree(l);
-}
-
 static int link_update_name(Link *l, sd_netlink_message *m) {
         char ifname_from_index[IF_NAMESIZE];
         const char *ifname;
index 4bad0f97e2c446f8ebe2ce38b3e4f2ffca956a27..02d11961773c5f52e6458a86441ab3bab1bae447 100644 (file)
@@ -572,7 +572,8 @@ Manager* manager_free(Manager *m) {
         if (!m)
                 return NULL;
 
-        hashmap_free_with_destructor(m->links_by_index, link_free);
+        /* free links_by_index at first, as it has ownership of links. */
+        hashmap_free(m->links_by_index);
         hashmap_free(m->links_by_name);
 
         sd_event_source_unref(m->network_monitor_event_source);