From: Lennart Poettering Date: Wed, 27 Jan 2010 21:40:10 +0000 (+0100) Subject: process only one epoll event at a time X-Git-Tag: v1~781 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=957ca8908712d2a1c909472cb4581d228e89d4ad;ds=inline 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. --- diff --git a/manager.c b/manager.c index f15cf7986..cd97e67da 100644 --- 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; } }