Răsfoiți Sursa

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.
Oswald Buddenhagen 14 ani în urmă
părinte
comite
a266f28f1c
1 a modificat fișierele cu 16 adăugiri și 0 ștergeri
  1. 16 0
      src/drv_imap.c

+ 16 - 0
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 );