On 07/24/2012 09:33 AM, Liu Yuan wrote: > From: Liu Yuan <tailai.ly at taobao.com> > > Signed-off-by: Liu Yuan <tailai.ly at taobao.com> > --- > 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); > Applied Yuan |