From: Liu Yuan <[email protected]>

Signed-off-by: Liu Yuan <[email protected]>
---
 sheep/sheep.c |   56 +++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 51 insertions(+), 5 deletions(-)

diff --git a/sheep/sheep.c b/sheep/sheep.c
index 3ae1ec9..df28a94 100644
--- a/sheep/sheep.c
+++ b/sheep/sheep.c
@@ -21,6 +21,7 @@
 #include <sys/syslog.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/signalfd.h>
 #include <fcntl.h>
 #include <errno.h>
 
@@ -122,9 +123,54 @@ static int create_pidfile(const char *filename)
        return 0;
 }
 
+static int sigfd;
+
+static void signal_handler(int listen_fd, int events, void *data)
+{
+       struct signalfd_siginfo siginfo;
+       int ret;
+
+       ret = read(sigfd, &siginfo, sizeof(siginfo));
+       assert(ret == sizeof(siginfo));
+       dprintf("signal %d\n", siginfo.ssi_signo);
+       switch (siginfo.ssi_signo) {
+       case SIGTERM:
+               sys->status= SD_STATUS_KILLED;
+               break;
+       default:
+               eprintf("signal %d unhandled \n", siginfo.ssi_signo);
+               break;
+       }
+}
+
 static int init_signal(void)
 {
-       return trace_init_signal();
+       sigset_t mask;
+       int ret;
+
+       ret = trace_init_signal();
+       if (ret)
+               return ret;
+
+       sigemptyset(&mask);
+       sigaddset(&mask, SIGTERM);
+       sigprocmask(SIG_BLOCK, &mask, NULL);
+
+       sigfd = signalfd(-1, &mask, SFD_NONBLOCK);
+       if (sigfd < 0) {
+               eprintf("failed to create a signal fd: %m\n");
+               return -1;
+       }
+
+       ret = register_event(sigfd, signal_handler, NULL);
+       if (ret) {
+               eprintf("failed to register signal handler (%d)\n", ret);
+               return -1;
+       }
+
+       dprintf("register signal_handler for %d\n", sigfd);
+
+       return 0;
 }
 
 static struct cluster_info __sys;
@@ -289,6 +335,10 @@ int main(int argc, char **argv)
 
        local_req_init();
 
+       ret = init_signal();
+       if (ret)
+               exit(1);
+
        sys->gateway_wqueue = init_work_queue("gateway", false);
        sys->io_wqueue = init_work_queue("io", false);
        sys->recovery_wqueue = init_work_queue("recovery", true);
@@ -298,10 +348,6 @@ int main(int argc, char **argv)
            !sys->deletion_wqueue || !sys->block_wqueue)
                exit(1);
 
-       ret = init_signal();
-       if (ret)
-               exit(1);
-
        ret = trace_init();
        if (ret)
                exit(1);
-- 
1.7.10.2

-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to