svn commit: r211899 - head/sbin/hastd
Pawel Jakub Dawidek
pjd at FreeBSD.org
Fri Aug 27 21:28:02 UTC 2010
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);
More information about the svn-src-all
mailing list