udev: cache last queued event entry
When we have N queued events, LIST_APPEND() takes O(N). Let's cache the last event to optimize queueing.
This commit is contained in:
@@ -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");
|
||||
|
||||
@@ -50,6 +50,7 @@ typedef struct Manager {
|
||||
sd_event *event;
|
||||
Hashmap *workers;
|
||||
LIST_HEAD(Event, events);
|
||||
Event *last_event;
|
||||
char *cgroup;
|
||||
|
||||
UdevRules *rules;
|
||||
|
||||
Reference in New Issue
Block a user