summary refs log tree commit diff
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2022-01-06 17:38:06 +0100
committerLeah Neukirchen <leah@vuxu.org>2022-01-06 17:39:32 +0100
commitcb0420bc25b0dab43d3c2cfab4e386f5d57f98cd (patch)
tree02d13dd938524a90cc1f0c9eff462b18a1dfc4f0
parentbe63c2741e3e3e2523ab6163511a1078cb73362f (diff)
downloadrvnit-cb0420bc25b0dab43d3c2cfab4e386f5d57f98cd.tar.gz
rvnit-cb0420bc25b0dab43d3c2cfab4e386f5d57f98cd.tar.xz
rvnit-cb0420bc25b0dab43d3c2cfab4e386f5d57f98cd.zip
shut down loggers by closing the pipe, then slaying if necessary
-rw-r--r--rvnit.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/rvnit.c b/rvnit.c
index 39cbdb4..b1911e0 100644
--- a/rvnit.c
+++ b/rvnit.c
@@ -520,6 +520,7 @@ main()
 		/* kill all of level */
 		int oneshot = 0;
 		int daemons = 0;
+		int loggers = 0;
 
 		for (i = 0; i < MAX_SV; i++) {
 			if (services[i].level != level)
@@ -538,10 +539,12 @@ main()
 				kill(services[i].pid, SIGCONT);
 				daemons++;
 			}
+			if (services[i].name[2] == 'L' &&
+			    services[i].pid > 0) {
+				loggers++;
+			}
 		}
 
-		// XXX figure out logger shutdown
-
 		while (oneshot) {
 			int status = 0;
 			int pid = wait(&status);
@@ -561,21 +564,22 @@ main()
 				oneshot--;
 			} else if (services[i].name[2] == 'D') {
 				LOG("daemon %s exited with status %d", services[i].name, services[i].status);
-//				if (services[i].logged)
-//					close(services[i].logfd[1]);
+				if (services[i].logged)
+					close(services[i].logfd[1]);
 				daemons--;
+			} else if (services[i].name[2] == 'L') {
+				LOG("logger %s exited with status %d", services[i].name, services[i].status);
+				loggers--;
 			}
 		}
 
 		// only daemons are left, wait up to 7s before sending
 		// them SIGKILL.
 
-		if (!daemons)
-			continue;
-
 		int slayed = 0;
 
-		while (daemons) {
+		while (daemons + loggers) {
+			LOG("level=%d waiting for %d+%d", level, daemons, loggers);
 			int status = 0;
 			int pid = timedwait(&status, 7);
 			if (pid == 0) { // hit timeout
@@ -585,8 +589,7 @@ main()
 				for (i = 0; i < MAX_SV; i++) {
 					if (services[i].level != level)
 						continue;
-					if (services[i].name[2] == 'D' &&
-					    services[i].pid > 0) {
+					if (services[i].pid > 0) {
 						kill(services[i].pid, SIGKILL);
 						kill(services[i].pid, SIGCONT);
 					}
@@ -611,9 +614,12 @@ main()
 				oneshot--;
 			} else if (services[i].name[2] == 'D') {
 				LOG("daemon %s exited with status %d", services[i].name, services[i].status);
-//				if (services[i].logged)
-//					close(services[i].logfd[1]);
+				if (services[i].logged)
+					close(services[i].logfd[1]);
 				daemons--;
+			} else if (services[i].name[2] == 'L') {
+				LOG("logger %s exited with status %d", services[i].name, services[i].status);
+				loggers--;
 			}
 		}