From fecbff83c4ca773815965f4ebdc7e6d9769a87dc Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sun, 18 Apr 2010 14:55:04 +0200 Subject: [PATCH] Use non-blocking API for signal handling. This gets rid of a couple of calls to FD_ISSET() and simplifies para_next_signal() a bit. --- afs.c | 5 ++--- audiod.c | 8 ++------ gui.c | 8 +++----- server.c | 11 ++++------- signal.c | 29 +++++++++++++---------------- signal.h | 2 +- 6 files changed, 25 insertions(+), 38 deletions(-) diff --git a/afs.c b/afs.c index e2a517ec..e491e307 100644 --- a/afs.c +++ b/afs.c @@ -709,16 +709,15 @@ static void signal_pre_select(struct sched *s, struct task *t) static void afs_signal_post_select(struct sched *s, struct task *t) { - struct signal_task *st = container_of(t, struct signal_task, task); int signum; if (getppid() == 1) { PARA_EMERG_LOG("para_server died\n"); goto shutdown; } - if (!FD_ISSET(st->fd, &s->rfds)) + signum = para_next_signal(&s->rfds); + if (signum == 0) return; - signum = para_next_signal(); if (signum == SIGHUP) { close_afs_tables(); parse_config_or_die(1); diff --git a/audiod.c b/audiod.c index 99b4c7df..012f6344 100644 --- a/audiod.c +++ b/audiod.c @@ -980,15 +980,11 @@ static void signal_pre_select(struct sched *s, struct task *t) para_fd_set(st->fd, &s->rfds, &s->max_fileno); } -static void signal_post_select(struct sched *s, struct task *t) +static void signal_post_select(struct sched *s, __a_unused struct task *t) { - struct signal_task *st = container_of(t, struct signal_task, task); int signum; - if (!FD_ISSET(st->fd, &s->rfds)) - return; - - signum = para_next_signal(); + signum = para_next_signal(&s->rfds); switch (signum) { case SIGINT: case SIGTERM: diff --git a/gui.c b/gui.c index 64fab61b..f2098d45 100644 --- a/gui.c +++ b/gui.c @@ -955,11 +955,9 @@ repeat: if (ret <= 0) goto check_return; /* skip fd checks */ /* signals */ - if (FD_ISSET(signal_pipe, &rfds)) { - int sig_nr = para_next_signal(); - if (sig_nr > 0) - handle_signal(sig_nr); - } + ret = para_next_signal(&rfds); + if (ret > 0) + handle_signal(ret); /* read command pipe if ready */ if (command_pipe >= 0 && mode == COMMAND_MODE && FD_ISSET(command_pipe, &rfds)) { diff --git a/server.c b/server.c index ba5dabde..bc143039 100644 --- a/server.c +++ b/server.c @@ -276,16 +276,13 @@ static void handle_sighup(void) kill(mmd->afs_pid, SIGHUP); } -static void signal_post_select(struct sched *s, struct task *t) +static void signal_post_select(struct sched *s, __a_unused struct task *t) { - struct signal_task *st = container_of(t, struct signal_task, task); - int signum; - - if (!FD_ISSET(st->fd, &s->rfds)) - return; + int signum = para_next_signal(&s->rfds); - signum = para_next_signal(); switch (signum) { + case 0: + return; case SIGHUP: handle_sighup(); break; diff --git a/signal.c b/signal.c index bded532e..0b4b6f0b 100644 --- a/signal.c +++ b/signal.c @@ -151,27 +151,24 @@ void para_install_sighandler(int sig) /** * Return the number of the next pending signal. * - * This should be called if the fd for the signal pipe is ready for reading. + * \param rfds Th fd_set containing the signal pipe. * - * \return On success, the number of the received signal is returned. If the - * read returned zero or was interrupted by another signal the function returns - * 0. Otherwise, a negative error value is returned. + * \return On success, the number of the received signal is returned. If there + * is no signal currently pending, the function returns zero. On read errors + * from the signal pipe, the process is terminated. */ -int para_next_signal(void) +int para_next_signal(fd_set *rfds) { - int s; - ssize_t r = read(signal_pipe[0], &s, sizeof(s)); + size_t n; + int s, ret = read_nonblock(signal_pipe[0], &s, sizeof(s), rfds, &n); - if (!r) { - PARA_CRIT_LOG("read from signal pipe returned zero\n"); - return 0; - } - if (r < 0) { - if (errno == EAGAIN || errno == EINTR) - return 0; - return -ERRNO_TO_PARA_ERROR(errno); + if (ret < 0) { + PARA_EMERG_LOG("%s\n", para_strerror(-ret)); + exit(EXIT_FAILURE); } - assert(r == sizeof(s)); + if (n == 0) + return 0; + assert(n == sizeof(s)); PARA_DEBUG_LOG("next signal: %d\n", s); return s; } diff --git a/signal.h b/signal.h index a628df45..1dbfc981 100644 --- a/signal.h +++ b/signal.h @@ -20,5 +20,5 @@ int para_signal_init(void); void para_sigaction(int sig, void (*handler)(int)); void para_install_sighandler(int); int para_reap_child(pid_t *pid); -int para_next_signal(void); +int para_next_signal(fd_set *rfds); void para_signal_shutdown(void); -- 2.39.2