]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
Use non-blocking API for signal handling.
authorAndre Noll <maan@systemlinux.org>
Sun, 18 Apr 2010 12:55:04 +0000 (14:55 +0200)
committerAndre Noll <maan@systemlinux.org>
Sun, 25 Apr 2010 18:13:24 +0000 (20:13 +0200)
This gets rid of a couple of calls to FD_ISSET() and simplifies
para_next_signal() a bit.

afs.c
audiod.c
gui.c
server.c
signal.c
signal.h

diff --git a/afs.c b/afs.c
index e2a517ece2c8451b7a2715bc7f7a943b7680d079..e491e30791f309b27a9ba8873e262323204f41d5 100644 (file)
--- 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);
index 99b4c7df78ddfe2b48058726a5a3acc9ca18fd61..012f6344e7120f2cc4e17992d0719252a51ed0cd 100644 (file)
--- 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 64fab61b7859e5192a3d1583a693622be8977087..f2098d45162bd854de5c256feb35d2aab9fe730b 100644 (file)
--- 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)) {
index ba5dabde066050825a46ef3abae82556474e7226..bc143039563b830b07164efd96ac76a4f6d3e267 100644 (file)
--- 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;
index bded532ed209ab4fa686d1e93147a4cfc4a5bcce..0b4b6f0b847171e3c68311c4075c2d26f017a5b3 100644 (file)
--- 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;
 }
index a628df45263f258b519c311d88e7cc67f0d138c0..1dbfc98193fba8ba067314ef4abc0e0453f39df5 100644 (file)
--- 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);