]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network/queue: detach request from the queue only when the request is actually queued 30955/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 16 Jan 2024 05:04:50 +0000 (14:04 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 16 Jan 2024 14:25:32 +0000 (23:25 +0900)
No effective functionality is changed in this commit.
Refactoring and preparation for later commits.

src/network/networkd-address.c
src/network/networkd-link.c
src/network/networkd-queue.c
src/network/networkd-queue.h
src/network/networkd-route.c

index 4c3393645e7e2e9956961766b7ff24cab35deffd..fc6a708f87d879785ac2bbdf05db5c2d2b721b9c 100644 (file)
@@ -1193,7 +1193,7 @@ int address_remove_and_cancel(Address *address, Link *link) {
          * notification about the request, then explicitly remove the address. */
         if (address_get_request(link, address, &req) >= 0) {
                 waiting = req->waiting_reply;
-                request_detach(link->manager, req);
+                request_detach(req);
                 address_cancel_requesting(address);
         }
 
index 9e69624fd2b566fe00148e12737784c48f8ba2ed..a39477e78b27a22787847d63602f19281c8e70fe 100644 (file)
@@ -987,7 +987,7 @@ static int link_drop_requests(Link *link) {
                                 ;
                         }
 
-                request_detach(link->manager, req);
+                request_detach(req);
         }
 
         return ret;
index d1e9fec57a4b6198d9ee3cb6197f9978d4fe7c5a..383f259fa7992971b86f8e67dc05966cccb459f2 100644 (file)
@@ -9,14 +9,28 @@
 
 #define REPLY_CALLBACK_COUNT_THRESHOLD 128
 
+static Request* request_detach_impl(Request *req) {
+        assert(req);
+
+        if (!req->manager)
+                return NULL;
+
+        ordered_set_remove(req->manager->request_queue, req);
+        req->manager = NULL;
+        return req;
+}
+
+void request_detach(Request *req) {
+        request_unref(request_detach_impl(req));
+}
+
 static Request *request_free(Request *req) {
         if (!req)
                 return NULL;
 
         /* To prevent from triggering assertions in the hash and compare functions, remove this request
          * from the set before freeing userdata below. */
-        if (req->manager)
-                ordered_set_remove(req->manager->request_queue, req);
+        request_detach_impl(req);
 
         if (req->free_func)
                 req->free_func(req->userdata);
@@ -31,26 +45,10 @@ static Request *request_free(Request *req) {
 
 DEFINE_TRIVIAL_REF_UNREF_FUNC(Request, request, request_free);
 
-void request_detach(Manager *manager, Request *req) {
-        assert(manager);
-
-        if (!req)
-                return;
-
-        req = ordered_set_remove(manager->request_queue, req);
-        if (!req)
-                return;
-
-        req->manager = NULL;
-        request_unref(req);
-}
-
 static void request_destroy_callback(Request *req) {
         assert(req);
 
-        if (req->manager)
-                request_detach(req->manager, req);
-
+        request_detach(req);
         request_unref(req);
 }
 
@@ -114,7 +112,7 @@ DEFINE_PRIVATE_HASH_OPS_WITH_KEY_DESTRUCTOR(
                 Request,
                 request_hash_func,
                 request_compare_func,
-                request_unref);
+                request_detach);
 
 static int request_new(
                 Manager *manager,
@@ -248,7 +246,7 @@ int manager_process_requests(Manager *manager) {
                 assert(req->process);
                 r = req->process(req, link, req->userdata);
                 if (r < 0) {
-                        request_detach(manager, req);
+                        request_detach(req);
 
                         if (link) {
                                 link_enter_failed(link);
@@ -261,7 +259,7 @@ int manager_process_requests(Manager *manager) {
                         /* If the request sends netlink message, e.g. for Address or so, the Request object is
                          * referenced by the netlink slot, and will be detached later by its destroy callback.
                          * Otherwise, e.g. for DHCP client or so, detach the request from queue now. */
-                        request_detach(manager, req);
+                        request_detach(req);
 
                 if (manager->request_queued)
                         break; /* New request is queued. Exit from the loop. */
index e911fdd33a82eb0511043a06c77cc25915829205..bdedc775377b9c56ed1df117cc01032757fe4642 100644 (file)
@@ -88,7 +88,7 @@ Request *request_ref(Request *req);
 Request *request_unref(Request *req);
 DEFINE_TRIVIAL_CLEANUP_FUNC(Request*, request_unref);
 
-void request_detach(Manager *manager, Request *req);
+void request_detach(Request *req);
 
 int netdev_queue_request(
                 NetDev *netdev,
index 48b8af2f06054e61c42e7a3c544a2207b43fadcf..54bf107d028e9898128381bd96b7860da487cc00 100644 (file)
@@ -1317,26 +1317,29 @@ int link_request_static_routes(Link *link, bool only_ipv4) {
 }
 
 void route_cancel_request(Route *route, Link *link) {
-        Request req;
+        Request *req;
 
         assert(route);
 
         link = route->link ?: link;
 
         assert(link);
+        assert(link->manager);
 
         if (!route_is_requesting(route))
                 return;
 
-        req = (Request) {
-                .link = link,
-                .type = REQUEST_TYPE_ROUTE,
-                .userdata = route,
-                .hash_func = (hash_func_t) route_hash_func,
-                .compare_func = (compare_func_t) route_compare_func,
-        };
-
-        request_detach(link->manager, &req);
+        req = ordered_set_get(link->manager->request_queue,
+                              &(Request) {
+                                      .link = link,
+                                      .type = REQUEST_TYPE_ROUTE,
+                                      .userdata = route,
+                                      .hash_func = (hash_func_t) route_hash_func,
+                                      .compare_func = (compare_func_t) route_compare_func,
+                              });
+
+        if (req)
+                request_detach(req);
         route_cancel_requesting(route);
 }