eloop: forward EOF and I/O errors of counters to caller

Instead of silently dropping read() errors we now disable the counter and
call the user-supplied callback with 0 as argument so they can react on
errors.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2012-05-19 12:30:05 +02:00
parent f10ca03eab
commit c9fe031cb7

View File

@ -960,6 +960,8 @@ static void counter_event(struct ev_fd *fd, int mask, void *data)
if (mask & (EV_HUP | EV_ERR)) {
log_warning("HUP/ERR on eventfd");
if (cnt->cb)
cnt->cb(cnt, 0, cnt->data);
return;
}
@ -968,14 +970,25 @@ static void counter_event(struct ev_fd *fd, int mask, void *data)
ret = read(cnt->fd, &val, sizeof(val));
if (ret < 0) {
if (errno != EAGAIN)
if (errno != EAGAIN) {
log_warning("reading eventfd failed (%d): %m", errno);
ev_counter_disable(cnt);
if (cnt->cb)
cnt->cb(cnt, 0, cnt->data);
}
} else if (ret == 0) {
log_warning("EOF on eventfd");
ev_counter_disable(cnt);
if (cnt->cb)
cnt->cb(cnt, 0, cnt->data);
} else if (ret != sizeof(val)) {
log_warning("read %d bytes instead of 8 on eventfd", ret);
} else if (cnt->cb) {
cnt->cb(cnt, val, cnt->data);
ev_counter_disable(cnt);
if (cnt->cb)
cnt->cb(cnt, 0, cnt->data);
} else if (val > 0) {
if (cnt->cb)
cnt->cb(cnt, val, cnt->data);
}
}