changeset 6531:d747bfbda43c HEAD

Fixed process hanging sometimes when disconnecting.
author Timo Sirainen <tss@iki.fi>
date Sat, 06 Oct 2007 02:16:56 +0300
parents 2f397bc2cc0c
children da3093d9f572
files src/imap/client.c src/imap/client.h src/imap/cmd-append.c src/imap/cmd-idle.c src/imap/cmd-search.c
diffstat 5 files changed, 11 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/imap/client.c	Sat Oct 06 01:50:52 2007 +0300
+++ b/src/imap/client.c	Sat Oct 06 02:16:56 2007 +0300
@@ -441,14 +441,18 @@
 	}
 }
 
-void client_continue_pending_input(struct client *client)
+void client_continue_pending_input(struct client **_client)
 {
+	struct client *client = *_client;
 	size_t size;
 
 	i_assert(!client->handling_input);
 
-	if (client->disconnected)
+	if (client->disconnected) {
+		client_destroy(client, NULL);
+		*_client = NULL;
 		return;
+	}
 
 	if (client->input_lock != NULL) {
 		/* there's a command that has locked the input */
@@ -688,7 +692,7 @@
 		client_destroy(client, NULL);
 		return 1;
 	} else {
-		client_continue_pending_input(client);
+		client_continue_pending_input(&client);
 	}
 	return ret;
 }
--- a/src/imap/client.h	Sat Oct 06 01:50:52 2007 +0300
+++ b/src/imap/client.h	Sat Oct 06 02:16:56 2007 +0300
@@ -106,7 +106,7 @@
 void client_command_cancel(struct client_command_context *cmd);
 void client_command_free(struct client_command_context *cmd);
 
-void client_continue_pending_input(struct client *client);
+void client_continue_pending_input(struct client **_client);
 
 void client_input(struct client *client);
 int client_output(struct client *client);
--- a/src/imap/cmd-append.c	Sat Oct 06 01:50:52 2007 +0300
+++ b/src/imap/cmd-append.c	Sat Oct 06 02:16:56 2007 +0300
@@ -76,7 +76,7 @@
 	if (cmd->func(cmd)) {
 		o_stream_uncork(client->output);
 		client_command_free(cmd);
-		client_continue_pending_input(client);
+		client_continue_pending_input(&client);
 	}
 }
 
--- a/src/imap/cmd-idle.c	Sat Oct 06 01:50:52 2007 +0300
+++ b/src/imap/cmd-idle.c	Sat Oct 06 02:16:56 2007 +0300
@@ -55,7 +55,7 @@
 	o_stream_uncork(client->output);
 	if (free_cmd)
 		client_command_free(ctx->cmd);
-	client_continue_pending_input(client);
+	client_continue_pending_input(&client);
 }
 
 static void idle_client_input(struct cmd_idle_context *ctx)
--- a/src/imap/cmd-search.c	Sat Oct 06 01:50:52 2007 +0300
+++ b/src/imap/cmd-search.c	Sat Oct 06 02:16:56 2007 +0300
@@ -114,7 +114,7 @@
 
 	if (finished) {
 		client_command_free(cmd);
-		client_continue_pending_input(client);
+		client_continue_pending_input(&client);
 	} else {
 		if (cmd->output_pending)
 			o_stream_set_flush_pending(client->output, TRUE);