# HG changeset patch # User Timo Sirainen # Date 1117284703 -10800 # Node ID 97b996dd5942098174d5d11f108c52acec0b08fc # Parent 2db396230881ca0b297828980d47e52a8b6b5558 If worker process has been idle for 10 minutes, make it kill itself. diff -r 2db396230881 -r 97b996dd5942 src/auth/auth-worker-client.c --- a/src/auth/auth-worker-client.c Sat May 28 15:34:24 2005 +0300 +++ b/src/auth/auth-worker-client.c Sat May 28 15:51:43 2005 +0300 @@ -11,6 +11,9 @@ #include +/* If no requests have come within this time, kill ourself */ +#define AUTH_WORKER_MAX_IDLE (60*10) + #define OUTBUF_THROTTLE_SIZE (1024*10) struct auth_worker_client { @@ -21,6 +24,9 @@ struct io *io; struct istream *input; struct ostream *output; + + time_t last_request; + struct timeout *to; }; static void auth_worker_client_unref(struct auth_worker_client *client); @@ -306,6 +312,8 @@ return; } + client->last_request = ioloop_time; + client->refcount++; while ((line = i_stream_next_line(client->input)) != NULL) { t_push(); @@ -338,6 +346,14 @@ return 1; } +static void auth_worker_client_timeout(void *context) +{ + struct auth_worker_client *client = context; + + if (client->last_request + AUTH_WORKER_MAX_IDLE <= ioloop_time) + auth_worker_client_destroy(client); +} + struct auth_worker_client * auth_worker_client_create(struct auth *auth, int fd) { @@ -356,6 +372,9 @@ o_stream_set_flush_callback(client->output, auth_worker_output, client); client->io = io_add(fd, IO_READ, auth_worker_input, client); + client->last_request = ioloop_time; + client->to = timeout_add(1000*60, auth_worker_client_timeout, client); + return client; } @@ -364,6 +383,8 @@ if (client->fd == -1) return; + timeout_remove(client->to); + i_stream_close(client->input); o_stream_close(client->output);