changeset 8686:0e9b885bd29e HEAD

master: When shutting down, avoid dict processes giving "unknown process exited" errors.
author Timo Sirainen <tss@iki.fi>
date Sun, 25 Jan 2009 19:51:00 -0500
parents 6ee78e18d026
children dbd0c6e863cc
files src/master/dict-process.c
diffstat 1 files changed, 14 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/master/dict-process.c	Sun Jan 25 19:40:36 2009 -0500
+++ b/src/master/dict-process.c	Sun Jan 25 19:51:00 2009 -0500
@@ -27,7 +27,6 @@
 struct dict_process {
 	struct child_process process;
 	struct dict_process *next;
-	pid_t pid;
 
 	struct dict_listener *listener;
 	struct log_io *log;
@@ -65,7 +64,6 @@
 
 	if (pid != 0) {
 		/* master */
-		process->pid = pid;
 		process->next = process->listener->processes;
 		process->listener->processes = process;
 
@@ -121,11 +119,18 @@
 	return -1;
 }
 
+static void dict_listener_unref(struct dict_listener *listener)
+{
+	if (listener->processes == NULL)
+		i_free(listener);
+}
+
 static void dict_process_deinit(struct dict_process *process)
 {
+	struct dict_listener *listener = process->listener;
 	struct dict_process **p;
 
-	for (p = &process->listener->processes; *p != NULL; p = &(*p)->next) {
+	for (p = &listener->processes; *p != NULL; p = &(*p)->next) {
 		if (*p == process) {
 			*p = process->next;
 			break;
@@ -135,6 +140,8 @@
 	if (process->log != NULL)
 		log_unref(process->log);
 	i_free(process);
+
+	dict_listener_unref(listener);
 }
 
 static void dict_listener_input(struct dict_listener *listener)
@@ -188,10 +195,10 @@
 	if (close(listener->fd) < 0)
 		i_error("close(dict listener) failed: %m");
 
-	while (listener->processes != NULL) {
-		child_process_remove(listener->processes->pid);
-		dict_process_deinit(listener->processes);
-	}
+	/* don't try to free the dict processes here,
+	   let dict_process_destroyed() do it to avoid "unknown child exited"
+	   errors. */
+	dict_listener_unref(listener);
 }
 
 static void