Mercurial > dovecot > core-2.2
changeset 10033:40a71105529b HEAD
lib-master: If config fd is kept open, close it after last connection has been created.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 09 Oct 2009 21:25:27 -0400 |
parents | ebe9b1e7a46b |
children | cf376fcbd6ff |
files | src/lib-master/master-service.c |
diffstat | 1 files changed, 17 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-master/master-service.c Fri Oct 09 21:02:56 2009 -0400 +++ b/src/lib-master/master-service.c Fri Oct 09 21:25:27 2009 -0400 @@ -475,6 +475,15 @@ } } +static void master_service_close_config_fd(struct master_service *service) +{ + if (service->config_fd != -1) { + if (close(service->config_fd) < 0) + i_error("close(master config fd) failed: %m"); + service->config_fd = -1; + } +} + void master_service_deinit(struct master_service **_service) { struct master_service *service = *_service; @@ -483,6 +492,7 @@ io_listeners_remove(service); + master_service_close_config_fd(service); if (service->io_status_error != NULL) io_remove(&service->io_status_error); if (service->io_status_write != NULL) @@ -549,7 +559,13 @@ service->master_status.available_count--; master_status_update(service); - service->callback(&conn); + service->callback(&conn); + + if (service->master_status.available_count == 0 && + service->service_count_left == 1) { + /* we're dying as soon as this connection closes. */ + master_service_close_config_fd(service); + } } static void io_listeners_init(struct master_service *service)