diff src/master/login-process.c @ 4670:5372b92be174 HEAD

Reference counter fixes
author Timo Sirainen <tss@iki.fi>
date Sat, 14 Oct 2006 02:50:09 +0300
parents 654aa0e9075b
children f032a5d2bc0d
line wrap: on
line diff
--- a/src/master/login-process.c	Sat Oct 14 02:11:04 2006 +0300
+++ b/src/master/login-process.c	Sat Oct 14 02:50:09 2006 +0300
@@ -439,7 +439,7 @@
 
 	p = i_new(struct login_process, 1);
 	p->group = group;
-	p->refcount = 1;
+	p->refcount = 2; /* once for fd close, another for process exit */
 	p->pid = pid;
 	p->fd = fd;
 	p->io = io_add(fd, IO_READ, login_process_input, p);
@@ -487,10 +487,12 @@
 
 	if (p->inetd_child)
 		login_process_exited(p);
+	login_process_unref(p);
 }
 
 static void login_process_unref(struct login_process *p)
 {
+	i_assert(p->refcount > 0);
 	if (--p->refcount > 0)
 		return;
 
@@ -689,20 +691,17 @@
 			p->group->wanted_processes_count = 0;
 	}
 
-	login_process_destroy(p);
 	login_process_exited(p);
 }
 
-void login_processes_destroy_all(bool unref)
+void login_processes_destroy_all(void)
 {
 	struct hash_iterate_context *iter;
 	void *key, *value;
 
 	iter = hash_iterate_init(processes);
-	while (hash_iterate(iter, &key, &value)) {
+	while (hash_iterate(iter, &key, &value))
 		login_process_destroy(value);
-		if (unref) login_process_unref(value);
-	}
 	hash_iterate_deinit(iter);
 
 	while (login_groups != NULL) {
@@ -893,7 +892,7 @@
 
 void login_processes_deinit(void)
 {
-        login_processes_destroy_all(TRUE);
+        login_processes_destroy_all();
 	hash_destroy(processes);
 
 	if (to != NULL)