if (events[n].flags & EV_ERROR) {
u->error = true;
- uloop_fd_delete(u);
+ if (!(u->flags & ULOOP_ERROR_CB))
+ uloop_fd_delete(u);
}
if(events[n].filter == EVFILT_READ)
if (events[n].events & (EPOLLERR|EPOLLHUP)) {
u->error = true;
- uloop_fd_delete(u);
+ if (!(u->flags & ULOOP_ERROR_CB))
+ uloop_fd_delete(u);
}
if(!(events[n].events & (EPOLLRDHUP|EPOLLIN|EPOLLOUT|EPOLLERR|EPOLLHUP))) {
sock->registered = true;
sock->eof = false;
+ sock->error = false;
out:
return ret;
{
int i;
- if (!fd->registered)
- return 0;
-
for (i = 0; i < cur_nfds; i++) {
if (cur_fds[cur_fd + i].fd != fd)
continue;
cur_fds[cur_fd + i].fd = NULL;
}
+
+ if (!fd->registered)
+ return 0;
+
fd->registered = false;
uloop_fd_stack_event(fd, -1);
return __uloop_fd_delete(fd);
do_sigchld = true;
}
-static void uloop_setup_signals(void)
+static void uloop_setup_signals(bool add)
{
+ static struct sigaction old_sigint, old_sigchld;
struct sigaction s;
memset(&s, 0, sizeof(struct sigaction));
- s.sa_handler = uloop_handle_sigint;
- s.sa_flags = 0;
- sigaction(SIGINT, &s, NULL);
- if (uloop_handle_sigchld) {
- s.sa_handler = uloop_sigchld;
- sigaction(SIGCHLD, &s, NULL);
+ if (add) {
+ s.sa_handler = uloop_handle_sigint;
+ s.sa_flags = 0;
+ } else {
+ s = old_sigint;
}
+
+ sigaction(SIGINT, &s, &old_sigint);
+
+ if (!uloop_handle_sigchld)
+ return;
+
+ if (add)
+ s.sa_handler = uloop_sigchld;
+ else
+ s = old_sigchld;
+
+ sigaction(SIGCHLD, &s, &old_sigchld);
}
static int uloop_get_next_timeout(struct timeval *tv)
void uloop_run(void)
{
+ static int recursive_calls = 0;
struct timeval tv;
- uloop_setup_signals();
+ /*
+ * Handlers are only updated for the first call to uloop_run() (and restored
+ * when this call is done).
+ */
+ if (!recursive_calls++)
+ uloop_setup_signals(true);
+
+ uloop_cancelled = false;
while(!uloop_cancelled)
{
uloop_gettime(&tv);
uloop_gettime(&tv);
uloop_run_events(uloop_get_next_timeout(&tv));
}
+
+ if (!--recursive_calls)
+ uloop_setup_signals(false);
}
void uloop_done(void)