changeset 3398:97b996dd5942 HEAD

If worker process has been idle for 10 minutes, make it kill itself.
author Timo Sirainen <tss@iki.fi>
date Sat, 28 May 2005 15:51:43 +0300
parents 2db396230881
children c8777e7773f8
files src/auth/auth-worker-client.c
diffstat 1 files changed, 21 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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 <stdlib.h>
 
+/* 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);