Author: pjd
Date: Fri Aug 27 21:28:02 2010
New Revision: 211899
URL: http://svn.freebsd.org/changeset/base/211899

Log:
  When SIGTERM or SIGINT is received, terminate worker processes.
  
  MFC after:    2 weeks
  Obtained from:        Wheel Systems Sp. z o.o. http://www.wheelsystems.com

Modified:
  head/sbin/hastd/hastd.c

Modified: head/sbin/hastd/hastd.c
==============================================================================
--- head/sbin/hastd/hastd.c     Fri Aug 27 21:26:55 2010        (r211898)
+++ head/sbin/hastd/hastd.c     Fri Aug 27 21:28:02 2010        (r211899)
@@ -82,6 +82,10 @@ sighandler(int sig)
 {
 
        switch (sig) {
+       case SIGINT:
+       case SIGTERM:
+               sigexit_received = true;
+               break;
        case SIGCHLD:
                sigchld_received = true;
                break;
@@ -374,6 +378,25 @@ failed:
 }
 
 static void
+terminate_workers(void)
+{
+       struct hast_resource *res;
+
+       pjdlog_info("Termination signal received, exiting.");
+       TAILQ_FOREACH(res, &cfg->hc_resources, hr_next) {
+               if (res->hr_workerpid == 0)
+                       continue;
+               pjdlog_info("Terminating worker process (resource=%s, role=%s, 
pid=%u).",
+                   res->hr_name, role2str(res->hr_role), res->hr_workerpid);
+               if (kill(res->hr_workerpid, SIGTERM) == 0)
+                       continue;
+               pjdlog_errno(LOG_WARNING,
+                   "Unable to send signal to worker process (resource=%s, 
role=%s, pid=%u).",
+                   res->hr_name, role2str(res->hr_role), res->hr_workerpid);
+       }
+}
+
+static void
 listen_accept(void)
 {
        struct hast_resource *res;
@@ -599,6 +622,11 @@ main_loop(void)
        int cfd, lfd, maxfd, ret;
 
        for (;;) {
+               if (sigexit_received) {
+                       sigexit_received = false;
+                       terminate_workers();
+                       exit(EX_OK);
+               }
                if (sigchld_received) {
                        sigchld_received = false;
                        child_exit();
@@ -692,6 +720,8 @@ main(int argc, char *argv[])
        cfg = yy_config_parse(cfgpath, true);
        assert(cfg != NULL);
 
+       signal(SIGINT, sighandler);
+       signal(SIGTERM, sighandler);
        signal(SIGHUP, sighandler);
        signal(SIGCHLD, sighandler);
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to