commit a266f28f1c35e555b570879b1655eb470e0d33b5
parent 171f7d6cd3f6b836e41accd6b47edcfa2a0b748c
Author: Oswald Buddenhagen <ossi@users.sf.net>
Date: Sat, 19 Mar 2011 22:12:55 +0100
cancel submitted commands when canceling store
we already have some minimal asynchronicity, so there might be commands
in flight when a fatal error comes in.
Diffstat:
1 file changed, 16 insertions(+), 0 deletions(-)
diff --git a/src/drv_imap.c b/src/drv_imap.c
@@ -283,6 +283,21 @@ submit_imap_cmd( imap_store_t *ctx, struct imap_cmd *cmd, const char *fmt, ... )
return ret;
}
+static void
+cancel_submitted_imap_cmds( imap_store_t *ctx )
+{
+ struct imap_cmd *cmd;
+
+ while ((cmd = ctx->in_progress)) {
+ ctx->in_progress = cmd->next;
+ /* don't update num_in_progress and in_progress_append - store is dead */
+ cmd->param.done( ctx, cmd, RESP_CANCEL );
+ free( cmd->param.data );
+ free( cmd->cmd );
+ free( cmd );
+ }
+}
+
static int
imap_exec( imap_store_t *ctx, struct imap_cmd *cmdp,
void (*done)( imap_store_t *ctx, struct imap_cmd *cmd, int response ),
@@ -927,6 +942,7 @@ imap_cancel_store( store_t *gctx )
imap_store_t *ctx = (imap_store_t *)gctx;
socket_close( &ctx->conn );
+ cancel_submitted_imap_cmds( ctx );
free_generic_messages( ctx->gen.msgs );
free_string_list( ctx->gen.boxes );
free_list( ctx->ns_personal );