diff -urN fence-virt-53a2b29/server/daemon_init.c mod/server/daemon_init.c --- fence-virt-53a2b29/server/daemon_init.c 2011-08-11 09:53:47.000000000 +0900 +++ mod/server/daemon_init.c 2011-09-12 11:12:12.000000000 +0900 @@ -193,6 +193,8 @@ sigdelset(&set, SIGQUIT); sigdelset(&set, SIGCHLD); + sigdelset(&set, SIGHUP); + return (sigprocmask(SIG_BLOCK, &set, NULL)); } diff -urN fence-virt-53a2b29/server/main.c mod/server/main.c --- fence-virt-53a2b29/server/main.c 2011-08-11 09:53:47.000000000 +0900 +++ mod/server/main.c 2011-09-12 11:14:33.000000000 +0900 @@ -36,7 +36,8 @@ void exit_handler(int sig) { - run = 0; + if (sig != SIGHUP) + run = 0; } @@ -188,6 +189,7 @@ signal(SIGINT, exit_handler); signal(SIGTERM, exit_handler); signal(SIGQUIT, exit_handler); + signal(SIGHUP, exit_handler); while (p->init(&backend_ctx, config) < 0) { if (!wait_for_backend) { diff -urN fence-virt-53a2b29/server/serial.c mod/server/serial.c --- fence-virt-53a2b29/server/serial.c 2011-08-11 09:53:47.000000000 +0900 +++ mod/server/serial.c 2011-09-12 12:01:17.000000000 +0900 @@ -266,6 +266,8 @@ n = select(max+1, &rfds, NULL, NULL, timeout); if (n < 0) { + if (errno == EINTR) + return 0; perror("select"); return n; } diff -urN fence-virt-53a2b29/server/virt-serial.c mod/server/virt-serial.c --- fence-virt-53a2b29/server/virt-serial.c 2011-08-11 09:53:47.000000000 +0900 +++ mod/server/virt-serial.c 2011-09-12 11:10:58.000000000 +0900 @@ -69,25 +69,6 @@ }; -int -myDomainEventCallback1(virConnectPtr conn, - virDomainPtr dom, int event, int detail, void *opaque) -{ - struct domain_info *dinfo = (struct domain_info *) opaque; - - if (event == VIR_DOMAIN_EVENT_STARTED || - event == VIR_DOMAIN_EVENT_STOPPED) { - virDomainRef(dom); - dinfo->dom = dom; - dinfo->event = event; - } else { - dinfo->event = VIR_DOMAIN_EVENT_UNDEFINED; - } - - return 0; -} - - /* EventImpl Functions */ int myEventHandleTypeToPollEvent(virEventHandleType events) @@ -413,15 +394,38 @@ char *uri; char *path; int mode; + pthread_t p_tid; }; +int +myDomainEventCallback1(virConnectPtr conn, + virDomainPtr dom, int event, int detail, void *opaque) +{ + struct event_args *args = (struct event_args *)opaque; + + if (event == VIR_DOMAIN_EVENT_STARTED || + event == VIR_DOMAIN_EVENT_STOPPED) { + virDomainRef(dom); + if (event == VIR_DOMAIN_EVENT_STARTED) { + domainStarted(dom, args->path, args->mode); + virDomainFree(dom); + pthread_kill(args->p_tid, SIGHUP); + } else if (event == VIR_DOMAIN_EVENT_STOPPED) { + domainStopped(dom); + virDomainFree(dom); + } + } + + return 0; +} + + static void * event_thread(void *arg) { struct event_args *args = (struct event_args *)arg; virConnectPtr dconn = NULL; - struct domain_info dinfo; int callback1ret = -1; int sts; @@ -450,11 +454,9 @@ registerExisting(dconn, args->path, args->mode); /* Add 2 callbacks to prove this works with more than just one */ - memset(&dinfo, 0, sizeof (dinfo)); - dinfo.event = VIR_DOMAIN_EVENT_UNDEFINED; callback1ret = virConnectDomainEventRegister(dconn, myDomainEventCallback1, - &dinfo, NULL); + arg, NULL); if ((callback1ret == 0)) { while (run) { @@ -469,18 +471,6 @@ t_cb(t_timeout, t_opaque); } - if (dinfo.event == VIR_DOMAIN_EVENT_STARTED) { - domainStarted(dinfo.dom, args->path, args->mode); - virDomainFree(dinfo.dom); - dinfo.dom = NULL; - dinfo.event = VIR_DOMAIN_EVENT_UNDEFINED; - } else if (dinfo.event == VIR_DOMAIN_EVENT_STOPPED) { - domainStopped(dinfo.dom); - virDomainFree(dinfo.dom); - dinfo.dom = NULL; - dinfo.event = VIR_DOMAIN_EVENT_UNDEFINED; - } - if (sts == 0) { /* DEBUG0("Poll timeout"); */ continue; @@ -546,6 +536,7 @@ } args->mode = mode; + args->p_tid = pthread_self(); run = 1; return pthread_create(&event_tid, NULL, event_thread, args);