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.
This commit is contained in:
Lennart Poettering 2010-01-27 22:40:10 +01:00
parent c9b97d2a83
commit 957ca89087
1 changed files with 9 additions and 9 deletions

View File

@ -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;
}
}