Mercurial > dovecot > original-hg > dovecot-1.2
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