eloop: call post-cbs on errors during dispatch
If the dispatch files or is skipped for whatever reason, we should nevertheless call the post-cbs to avoid any integration errors. Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
parent
de9111b40a
commit
2534b99d9a
20
src/eloop.c
20
src/eloop.c
@ -782,7 +782,7 @@ int ev_eloop_dispatch(struct ev_eloop *loop, int timeout)
|
|||||||
{
|
{
|
||||||
struct epoll_event *ep;
|
struct epoll_event *ep;
|
||||||
struct ev_fd *fd;
|
struct ev_fd *fd;
|
||||||
int i, count, mask;
|
int i, count, mask, ret;
|
||||||
|
|
||||||
if (!loop)
|
if (!loop)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -793,16 +793,20 @@ int ev_eloop_dispatch(struct ev_eloop *loop, int timeout)
|
|||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loop->dispatching = true;
|
||||||
|
|
||||||
count = epoll_wait(loop->efd,
|
count = epoll_wait(loop->efd,
|
||||||
loop->cur_fds,
|
loop->cur_fds,
|
||||||
loop->cur_fds_size,
|
loop->cur_fds_size,
|
||||||
timeout);
|
timeout);
|
||||||
if (count < 0) {
|
if (count < 0) {
|
||||||
if (errno == EINTR) {
|
if (errno == EINTR) {
|
||||||
return 0;
|
ret = 0;
|
||||||
|
goto out_dispatch;
|
||||||
} else {
|
} else {
|
||||||
llog_warn(loop, "epoll_wait dispatching failed: %m");
|
llog_warn(loop, "epoll_wait dispatching failed: %m");
|
||||||
return -errno;
|
ret = -errno;
|
||||||
|
goto out_dispatch;
|
||||||
}
|
}
|
||||||
} else if (count > loop->cur_fds_size) {
|
} else if (count > loop->cur_fds_size) {
|
||||||
count = loop->cur_fds_size;
|
count = loop->cur_fds_size;
|
||||||
@ -810,7 +814,6 @@ int ev_eloop_dispatch(struct ev_eloop *loop, int timeout)
|
|||||||
|
|
||||||
ep = loop->cur_fds;
|
ep = loop->cur_fds;
|
||||||
loop->cur_fds_cnt = count;
|
loop->cur_fds_cnt = count;
|
||||||
loop->dispatching = true;
|
|
||||||
|
|
||||||
for (i = 0; i < count; ++i) {
|
for (i = 0; i < count; ++i) {
|
||||||
if (ep[i].data.ptr == loop) {
|
if (ep[i].data.ptr == loop) {
|
||||||
@ -829,8 +832,6 @@ int ev_eloop_dispatch(struct ev_eloop *loop, int timeout)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
loop->dispatching = false;
|
|
||||||
|
|
||||||
if (count == loop->cur_fds_size) {
|
if (count == loop->cur_fds_size) {
|
||||||
ep = realloc(loop->cur_fds, sizeof(struct epoll_event) *
|
ep = realloc(loop->cur_fds, sizeof(struct epoll_event) *
|
||||||
loop->cur_fds_size * 2);
|
loop->cur_fds_size * 2);
|
||||||
@ -843,9 +844,12 @@ int ev_eloop_dispatch(struct ev_eloop *loop, int timeout)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
kmscon_hook_call(loop->posts, loop, NULL);
|
ret = 0;
|
||||||
|
|
||||||
return 0;
|
out_dispatch:
|
||||||
|
kmscon_hook_call(loop->posts, loop, NULL);
|
||||||
|
loop->dispatching = false;
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user