]> err.no Git - systemd/commitdiff
process only one epoll event at a time
authorLennart Poettering <lennart@poettering.net>
Wed, 27 Jan 2010 21:40:10 +0000 (22:40 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 27 Jan 2010 21:40:10 +0000 (22:40 +0100)
if we ask for more than one from the kernel we might need to check for
the validity of the ptr element since event might be processed after its
ptr was already destructed.

manager.c

index f15cf79869f3a23028e60025037c759661612ca2..cd97e67da57e5a15e49e17806e320c464d4c7662 100644 (file)
--- a/manager.c
+++ b/manager.c
@@ -1084,12 +1084,12 @@ int manager_loop(Manager *m) {
         assert(m);
 
         for (;;) {
-                struct epoll_event events[32];
-                int n, i;
+                struct epoll_event event;
+                int n;
 
                 manager_dispatch_run_queue(m);
 
-                if ((n = epoll_wait(m->epoll_fd, events, ELEMENTSOF(events), -1)) < 0) {
+                if ((n = epoll_wait(m->epoll_fd, &event, 1, -1)) < 0) {
 
                         if (errno == -EINTR)
                                 continue;
@@ -1097,12 +1097,12 @@ int manager_loop(Manager *m) {
                         return -errno;
                 }
 
-                for (i = 0; i < n; i++) {
-                        if ((r = process_event(m, events + i, &quit)) < 0)
-                                return r;
+                assert(n == 1);
 
-                        if (quit)
-                                return 0;
-                }
+                if ((r = process_event(m, &event, &quit)) < 0)
+                        return r;
+
+                if (quit)
+                        return 0;
         }
 }