diff options
author | Lennart Poettering <lennart@poettering.net> | 2010-01-27 22:40:10 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2010-01-27 22:40:10 +0100 |
commit | 957ca8908712d2a1c909472cb4581d228e89d4ad (patch) | |
tree | 7a6bd01476a97679dbe370eca74f2bfc9f4edecf | |
parent | c9b97d2a838899d00004fbfbd3f8c2e6932c89a0 (diff) |
process only one epoll event at a time
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.
-rw-r--r-- | manager.c | 18 |
1 files changed, 9 insertions, 9 deletions
@@ -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; } } |