commit 4c141231447cba66c38f1a47768c153753fe7811
Author: Oswald Buddenhagen <o...@users.sf.net>
Date:   Fri May 13 13:02:35 2022 +0200

    postpone check for cancellation in some driver callbacks
    
    the purpose of these checks is preventing triggering more driver calls,
    while immediate followups to already completed calls should be still
    made.
    
    note that some of the checks are strictly speaking redundant, as
    chaining into a next phase will return immediately anyway when the
    other side isn't ready yet. but we keep them for clarity.

 src/sync.c | 27 ++++++++++++++++++++++-----
 1 file changed, 22 insertions(+), 5 deletions(-)

diff --git a/src/sync.c b/src/sync.c
index b6336f72..c7cbe11e 100644
--- a/src/sync.c
+++ b/src/sync.c
@@ -255,7 +255,7 @@ check_ret( int sts, void *aux )
                cancel_sync( svars );
                return 1;
        }
-       return check_cancel( svars );
+       return 0;
 }
 
 #define SVARS_CHECK_RET \
@@ -263,6 +263,13 @@ check_ret( int sts, void *aux )
                return; \
        DECL_INIT_SVARS(aux)
 
+// After drv->cancel_cmds() on our side, commands may still complete
+// successfully, while the other side is already dead.
+#define SVARS_CHECK_RET_CANCEL \
+       SVARS_CHECK_RET; \
+       if (check_cancel( svars )) \
+               return
+
 #define SVARS_CHECK_RET_VARS(type) \
        type *vars = (type *)aux; \
        if (check_ret( sts, vars->aux )) { \
@@ -444,7 +451,7 @@ box_confirmed2( sync_vars_t *svars, int t )
 static void
 box_deleted( int sts, void *aux )
 {
-       SVARS_CHECK_RET;
+       SVARS_CHECK_RET_CANCEL;
        delete_state( svars );
        svars->drv[t]->finish_delete_box( svars->ctx[t] );
        sync_bail( svars );
@@ -453,7 +460,7 @@ box_deleted( int sts, void *aux )
 static void
 box_created( int sts, void *aux )
 {
-       SVARS_CHECK_RET;
+       SVARS_CHECK_RET_CANCEL;
        svars->drv[t]->open_box( svars->ctx[t], box_opened, AUX );
 }
 
@@ -767,7 +774,7 @@ box_loaded( int sts, message_t *msgs, int total_msgs, int 
recent_msgs, void *aux
        uchar sflags, nflags, aflags, dflags;
        uint hashsz, idx;
 
-       SVARS_CHECK_RET;
+       SVARS_CHECK_RET_CANCEL;
        svars->state[t] |= ST_LOADED;
        svars->msgs[t] = msgs;
        info( "%s: %d messages, %d recent\n", str_fn[t], total_msgs, 
recent_msgs );
@@ -1411,6 +1418,8 @@ msg_copied( int sts, uint uid, copy_vars_t *vars )
        new_done[t]++;
        stats();
        svars->new_pending[t]--;
+       if (check_cancel( svars ))
+               return;
        msgs_copied( svars, t );
 }
 
@@ -1484,6 +1493,8 @@ msgs_found_new( int sts, message_t *msgs, void *aux )
        int num_lost = match_tuids( svars, t, msgs );
        if (num_lost)
                warn( "Warning: lost track of %d %sed message(s)\n", num_lost, 
str_hl[t] );
+       if (check_cancel( svars ))
+               return;
        msgs_new_done( svars, t );
 }
 
@@ -1512,6 +1523,8 @@ flags_set( int sts, void *aux )
        flags_done[t]++;
        stats();
        svars->flags_pending[t]--;
+       if (check_cancel( svars ))
+               return;
        msgs_flags_set( svars, t );
 }
 
@@ -1710,6 +1723,8 @@ msg_trashed( int sts, void *aux )
        trash_done[t]++;
        stats();
        svars->trash_pending[t]--;
+       if (check_cancel( svars ))
+               return;
        sync_close( svars, t );
 }
 
@@ -1734,6 +1749,8 @@ msg_rtrashed( int sts, uint uid ATTR_UNUSED, copy_vars_t 
*vars )
        trash_done[t]++;
        stats();
        svars->trash_pending[t]--;
+       if (check_cancel( svars ))
+               return;
        sync_close( svars, t );
 }
 
@@ -1782,7 +1799,7 @@ sync_close( sync_vars_t *svars, int t )
 static void
 box_closed( int sts, int reported, void *aux )
 {
-       SVARS_CHECK_RET;
+       SVARS_CHECK_RET_CANCEL;
        if (!reported) {
                for (sync_rec_t *srec = svars->srecs; srec; srec = srec->next) {
                        if (srec->status & S_DEAD)


_______________________________________________
isync-devel mailing list
isync-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/isync-devel

Reply via email to