changeset 4670:5372b92be174 HEAD

Reference counter fixes
author Timo Sirainen <tss@iki.fi>
date Sat, 14 Oct 2006 02:50:09 +0300
parents d84a7bd63862
children 830cee5ef3c0
files src/master/login-process.c src/master/login-process.h src/master/main.c
diffstat 3 files changed, 8 insertions(+), 9 deletions(-) [+]
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)
--- a/src/master/login-process.h	Sat Oct 14 02:11:04 2006 +0300
+++ b/src/master/login-process.h	Sat Oct 14 02:50:09 2006 +0300
@@ -20,7 +20,7 @@
 
 void login_process_destroyed(pid_t pid, bool abnormal_exit);
 
-void login_processes_destroy_all(bool unref);
+void login_processes_destroy_all(void);
 
 void login_processes_init(void);
 void login_processes_deinit(void);
--- a/src/master/main.c	Sat Oct 14 02:11:04 2006 +0300
+++ b/src/master/main.c	Sat Oct 14 02:50:09 2006 +0300
@@ -135,7 +135,7 @@
 	i_warning("SIGHUP received - reloading configuration");
 
 	/* restart auth and login processes */
-        login_processes_destroy_all(FALSE);
+        login_processes_destroy_all();
         auth_processes_destroy_all();
         dict_process_kill();