projects
/
project
/
libubox.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
uloop: Remove uloop_cancelled variable, it is not used anywhere
[project/libubox.git]
/
uloop.c
diff --git
a/uloop.c
b/uloop.c
index
deb08a3
..
9fedcce
100644
(file)
--- a/
uloop.c
+++ b/
uloop.c
@@
-58,7
+58,6
@@
static struct list_head processes = LIST_HEAD_INIT(processes);
static int poll_fd = -1;
bool uloop_cancelled = false;
static int poll_fd = -1;
bool uloop_cancelled = false;
-bool uloop_handle_sigchld = true;
static bool do_sigchld = false;
static struct uloop_fd_event cur_fds[ULOOP_MAX_EVENTS];
static bool do_sigchld = false;
static struct uloop_fd_event cur_fds[ULOOP_MAX_EVENTS];
@@
-174,7
+173,8
@@
static int uloop_fetch_events(int timeout)
if (events[n].flags & EV_ERROR) {
u->error = true;
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].filter == EVFILT_READ)
@@
-268,7
+268,8
@@
static int uloop_fetch_events(int timeout)
if (events[n].events & (EPOLLERR|EPOLLHUP)) {
u->error = true;
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))) {
}
if(!(events[n].events & (EPOLLRDHUP|EPOLLIN|EPOLLOUT|EPOLLERR|EPOLLHUP))) {
@@
-383,6
+384,7
@@
int uloop_fd_add(struct uloop_fd *sock, unsigned int flags)
sock->registered = true;
sock->eof = false;
sock->registered = true;
sock->eof = false;
+ sock->error = false;
out:
return ret;
out:
return ret;
@@
-392,15
+394,16
@@
int uloop_fd_delete(struct uloop_fd *fd)
{
int i;
{
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;
}
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);
fd->registered = false;
uloop_fd_stack_event(fd, -1);
return __uloop_fd_delete(fd);
@@
-555,19
+558,28
@@
static void uloop_sigchld(int signo)
do_sigchld = true;
}
do_sigchld = true;
}
-static void uloop_setup_signals(
voi
d)
+static void uloop_setup_signals(
bool ad
d)
{
{
+ static struct sigaction old_sigint, old_sigchld;
struct sigaction s;
memset(&s, 0, sizeof(struct sigaction));
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 (add)
+ s.sa_handler = uloop_sigchld;
+ else
+ s = old_sigchld;
+
+ sigaction(SIGCHLD, &s, &old_sigchld);
}
static int uloop_get_next_timeout(struct timeval *tv)
}
static int uloop_get_next_timeout(struct timeval *tv)
@@
-620,9
+632,17
@@
static void uloop_clear_processes(void)
void uloop_run(void)
{
void uloop_run(void)
{
+ static int recursive_calls = 0;
struct timeval tv;
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);
while(!uloop_cancelled)
{
uloop_gettime(&tv);
@@
-635,6
+655,9
@@
void uloop_run(void)
uloop_gettime(&tv);
uloop_run_events(uloop_get_next_timeout(&tv));
}
uloop_gettime(&tv);
uloop_run_events(uloop_get_next_timeout(&tv));
}
+
+ if (!--recursive_calls)
+ uloop_setup_signals(false);
}
void uloop_done(void)
}
void uloop_done(void)