]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev: cache last queued event entry
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 26 Apr 2025 06:09:12 +0000 (15:09 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 9 May 2025 15:26:32 +0000 (00:26 +0900)
When we have N queued events, LIST_APPEND() takes O(N).
Let's cache the last event to optimize queueing.

src/udev/udev-manager.c
src/udev/udev-manager.h

index 259321e29d24be41e53c53dff1f96575d0a9edfa..bfe1a978ab1e234388c600f47109775c0c28d94b 100644 (file)
@@ -94,8 +94,11 @@ static Event* event_free(Event *event) {
         if (!event)
                 return NULL;
 
-        if (event->manager)
+        if (event->manager) {
+                if (event->manager->last_event == event)
+                        event->manager->last_event = event->event_prev;
                 LIST_REMOVE(event, event->manager->events, event);
+        }
 
         if (event->worker)
                 event->worker->event = NULL;
@@ -875,7 +878,8 @@ static int event_queue_insert(Manager *manager, sd_device *dev) {
                 .state = EVENT_QUEUED,
         };
 
-        LIST_APPEND(event, manager->events, event);
+        LIST_INSERT_AFTER(event, manager->events, manager->last_event, event);
+        manager->last_event = event;
         event->manager = manager;
         TAKE_PTR(event);
         log_device_uevent(dev, "Device is queued");
index 4a2225d1c2d0a01e5fc3a51e068fd9813bfaa997..87af431f2d920e3b8531ff2a40e709dd65aac4e3 100644 (file)
@@ -50,6 +50,7 @@ typedef struct Manager {
         sd_event *event;
         Hashmap *workers;
         LIST_HEAD(Event, events);
+        Event *last_event;
         char *cgroup;
 
         UdevRules *rules;