On 2018-10-29 23:27, Ted Unangst wrote:
Rian Hunter wrote:
Another gentle bump on this patch:

this looks about right.

Another gentle bump on this patch:

Index: lib/libfuse/fuse.c
===================================================================
RCS file: /cvs/src/lib/libfuse/fuse.c,v
retrieving revision 1.49
diff -u -r1.49 fuse.c
--- lib/libfuse/fuse.c  5 Jul 2018 10:57:31 -0000       1.49
+++ lib/libfuse/fuse.c  20 Oct 2018 01:03:23 -0000
@@ -32,8 +32,6 @@
  #include "fuse_private.h"
  #include "debug.h"

-static volatile sig_atomic_t sigraised = 0;
-static volatile sig_atomic_t signum = 0;
  static struct fuse_context *ictx = NULL;

  enum {
@@ -116,21 +114,10 @@
  };

  static void
-ifuse_sighdlr(int num)
-{
-       if (!sigraised || (num == SIGCHLD)) {
-               sigraised = 1;
-               signum = num;
-       }
-}
-
-static void
  ifuse_try_unmount(struct fuse *f)
  {
        pid_t child;

-       signal(SIGCHLD, ifuse_sighdlr);
-
        /* unmount in another thread so fuse_loop() doesn't deadlock */
        child = fork();

@@ -152,7 +139,6 @@
  {
        int status;

-       signal(SIGCHLD, SIG_DFL);
        if (waitpid(WAIT_ANY, &status, WNOHANG) == -1)
                fprintf(stderr, "fuse: %s\n", strerror(errno));

@@ -160,7 +146,6 @@
                fprintf(stderr, "fuse: %s: %s\n",
                        f->fc->dir, strerror(WEXITSTATUS(status)));

-       sigraised = 0;
        return;
  }

@@ -170,6 +155,7 @@
        struct fusebuf fbuf;
        struct fuse_context ctx;
        struct fb_ioctl_xch ioexch;
+       struct kevent event[5];
        struct kevent ev;
        ssize_t n;
        int ret;
@@ -181,28 +167,39 @@
        if (fuse->fc->kq == -1)
                return (-1);

-       EV_SET(&fuse->fc->event, fuse->fc->fd, EVFILT_READ, EV_ADD |
+       EV_SET(&event[0], fuse->fc->fd, EVFILT_READ, EV_ADD |
            EV_ENABLE, 0, 0, 0);

+       /* signal events */
+       EV_SET(&event[1], SIGCHLD, EVFILT_SIGNAL, EV_ADD |
+           EV_ENABLE, 0, 0, 0);
+       EV_SET(&event[2], SIGHUP, EVFILT_SIGNAL, EV_ADD |
+           EV_ENABLE, 0, 0, 0);
+       EV_SET(&event[3], SIGINT, EVFILT_SIGNAL, EV_ADD |
+           EV_ENABLE, 0, 0, 0);
+       EV_SET(&event[4], SIGTERM, EVFILT_SIGNAL, EV_ADD |
+           EV_ENABLE, 0, 0, 0);
+
        while (!fuse->fc->dead) {
-               ret = kevent(fuse->fc->kq, &fuse->fc->event, 1, &ev, 1, NULL);
+               ret = kevent(fuse->fc->kq, &event[0], 5, &ev, 1, NULL);
                if (ret == -1) {
-                       if (errno == EINTR) {
-                               switch (signum) {
-                               case SIGCHLD:
-                                       ifuse_child_exit(fuse);
-                                       break;
-                               case SIGHUP:
-                               case SIGINT:
-                               case SIGTERM:
-                                       ifuse_try_unmount(fuse);
-                                       break;
-                               default:
-                                       fprintf(stderr, "%s: %s\n", __func__,
-                                           strsignal(signum));
-                               }
-                       } else
+                       if (errno != EINTR)
                                DPERROR(__func__);
+               } else if (ret > 0 && ev.filter == EVFILT_SIGNAL) {
+                       int signum = ev.ident;
+                       switch (signum) {
+                       case SIGCHLD:
+                               ifuse_child_exit(fuse);
+                               break;
+                       case SIGHUP:
+                       case SIGINT:
+                       case SIGTERM:
+                               ifuse_try_unmount(fuse);
+                               break;
+                       default:
+                               fprintf(stderr, "%s: %s\n", __func__,
+                                       strsignal(signum));
+                       }
                } else if (ret > 0) {
                        n = read(fuse->fc->fd, &fbuf, sizeof(fbuf));
                        if (n != sizeof(fbuf)) {
@@ -479,20 +476,24 @@
        struct sigaction old_sa;

        if (sigaction(SIGHUP, NULL, &old_sa) == 0)
-               if (old_sa.sa_handler == ifuse_sighdlr)
+               if (old_sa.sa_handler == SIG_IGN)
                        signal(SIGHUP, SIG_DFL);

        if (sigaction(SIGINT, NULL, &old_sa) == 0)
-               if (old_sa.sa_handler == ifuse_sighdlr)
+               if (old_sa.sa_handler == SIG_IGN)
                        signal(SIGINT, SIG_DFL);

        if (sigaction(SIGTERM, NULL, &old_sa) == 0)
-               if (old_sa.sa_handler == ifuse_sighdlr)
+               if (old_sa.sa_handler == SIG_IGN)
                        signal(SIGTERM, SIG_DFL);

        if (sigaction(SIGPIPE, NULL, &old_sa) == 0)
                if (old_sa.sa_handler == SIG_IGN)
                        signal(SIGPIPE, SIG_DFL);
+
+       if (sigaction(SIGCHLD, NULL, &old_sa) == 0)
+               if (old_sa.sa_handler == SIG_IGN)
+                       signal(SIGCHLD, SIG_DFL);
  }
  DEF(fuse_remove_signal_handlers);

@@ -504,22 +505,27 @@
        if (sigaction(SIGHUP, NULL, &old_sa) == -1)
                return (-1);
        if (old_sa.sa_handler == SIG_DFL)
-               signal(SIGHUP, ifuse_sighdlr);
+               signal(SIGHUP, SIG_IGN);

        if (sigaction(SIGINT, NULL, &old_sa) == -1)
                return (-1);
        if (old_sa.sa_handler == SIG_DFL)
-               signal(SIGINT, ifuse_sighdlr);
+               signal(SIGINT, SIG_IGN);

        if (sigaction(SIGTERM, NULL, &old_sa) == -1)
                return (-1);
        if (old_sa.sa_handler == SIG_DFL)
-               signal(SIGTERM, ifuse_sighdlr);
+               signal(SIGTERM, SIG_IGN);

        if (sigaction(SIGPIPE, NULL, &old_sa) == -1)
                return (-1);
        if (old_sa.sa_handler == SIG_DFL)
                signal(SIGPIPE, SIG_IGN);
+
+       if (sigaction(SIGCHLD, NULL, &old_sa) == -1)
+               return (-1);
+       if (old_sa.sa_handler == SIG_DFL)
+               signal(SIGCHLD, SIG_IGN);

        return (0);
  }
Index: lib/libfuse/fuse_private.h
===================================================================
RCS file: /cvs/src/lib/libfuse/fuse_private.h,v
retrieving revision 1.21
diff -u -r1.21 fuse_private.h
--- lib/libfuse/fuse_private.h  19 Jun 2018 13:01:34 -0000      1.21
+++ lib/libfuse/fuse_private.h  20 Oct 2018 01:03:23 -0000
@@ -69,7 +69,6 @@

        /* kqueue stuff */
        int kq;
-       struct kevent event;
  };

  struct fuse_config {

Reply via email to