From: Chris Hanson Date: Thu, 25 May 2000 04:53:25 +0000 (+0000) Subject: Fix bug: must read message UIDs _before_ signalling folder event, as X-Git-Tag: 20090517-FFI~3683 X-Git-Url: https://birchwood-abbey.net/git?a=commitdiff_plain;h=d0d7df5496a12c424c120c2db457531d8fa7cfd6;p=mit-scheme.git Fix bug: must read message UIDs _before_ signalling folder event, as the event handler will usually access the folder, causing extra unnecessary traffic. --- diff --git a/v7/src/imail/imail-imap.scm b/v7/src/imail/imail-imap.scm index 52a315d8d..45067d65a 100644 --- a/v7/src/imail/imail-imap.scm +++ b/v7/src/imail/imail-imap.scm @@ -1,6 +1,6 @@ ;;; -*-Scheme-*- ;;; -;;; $Id: imail-imap.scm,v 1.88 2000/05/23 21:39:58 cph Exp $ +;;; $Id: imail-imap.scm,v 1.89 2000/05/25 04:53:25 cph Exp $ ;;; ;;; Copyright (c) 1999-2000 Massachusetts Institute of Technology ;;; @@ -570,75 +570,72 @@ ;;; operation atomically. (define (set-imap-folder-length! folder count) - (if (or (imap-folder-messages-synchronized? folder) - (= 0 (imap-folder-n-messages folder))) - (let ((n - (without-interrupts - (lambda () - (let ((v (imap-folder-messages folder)) - (n (imap-folder-n-messages folder))) - (cond ((> count n) - (let ((new-length (compute-messages-length v count))) - (if new-length - (set-imap-folder-messages! - folder - (vector-grow v new-length #f)))) - (set-imap-folder-n-messages! folder count) - (fill-messages-vector! folder n) - (set-imap-folder-messages-synchronized?! folder #t) - (folder-modified! folder 'INCREASE-LENGTH) - n) - ((= count n) - (set-imap-folder-messages-synchronized?! folder #t) - #f) - (else - (error "EXISTS response decreased folder length:" - folder)))))))) - (if n - (read-message-headers! folder n))) - (let ((v.n - (without-interrupts - (lambda () - (detach-all-messages! folder) - (let ((v (imap-folder-messages folder)) - (n (imap-folder-n-messages folder))) - (set-imap-folder-n-messages! folder count) - (set-imap-folder-messages! - folder - (make-vector (or (compute-messages-length v count) - (vector-length v)) - #f)) - (fill-messages-vector! folder 0) - (set-imap-folder-messages-synchronized?! folder #t) - (folder-modified! folder 'SET-LENGTH) - (cons v n)))))) - ((imail-message-wrapper "Reading message UIDs") - (lambda () - (imap:command:fetch-all (imap-folder-connection folder) '(UID)))) - (without-interrupts - (lambda () - (let ((v (car v.n)) - (n (cdr v.n)) - (v* (imap-folder-messages folder)) - (n* (imap-folder-n-messages folder))) - (let loop ((i 0) (i* 0)) - (if (and (fix:< i n) (fix:< i* n*)) - (let ((m (vector-ref v i)) - (m* (vector-ref v* i*))) - (if (= (imap-message-uid m) (imap-message-uid m*)) - (begin - ;; Flags might have been updated while - ;; reading the UIDs. - (if (%message-flags-initialized? m*) - (%set-message-flags! m (message-flags m*))) - (detach-message! m*) - (attach-message! m folder i*) - (vector-set! v* i* m) - (loop (fix:+ i 1) (fix:+ i* 1))) - (begin - (if (> (imap-message-uid m) (imap-message-uid m*)) - (error "Message inserted into folder:" m*)) - (loop (fix:+ i 1) i*)))))))))))) + (with-interrupt-mask interrupt-mask/gc-ok + (lambda (interrupt-mask) + (if (or (imap-folder-messages-synchronized? folder) + (= 0 (imap-folder-n-messages folder))) + (let ((v (imap-folder-messages folder)) + (n (imap-folder-n-messages folder))) + (cond ((> count n) + (let ((new-length (compute-messages-length v count))) + (if new-length + (set-imap-folder-messages! + folder + (vector-grow v new-length #f)))) + (set-imap-folder-n-messages! folder count) + (fill-messages-vector! folder n) + (set-imap-folder-messages-synchronized?! folder #t) + (with-interrupt-mask interrupt-mask + (lambda (interrupt-mask) + interrupt-mask + (read-message-headers! folder n))) + (folder-modified! folder 'INCREASE-LENGTH)) + ((= count n) + (set-imap-folder-messages-synchronized?! folder #t)) + (else + (error "EXISTS response decreased folder length:" + folder)))) + (begin + (detach-all-messages! folder) + (let ((v (imap-folder-messages folder)) + (n (imap-folder-n-messages folder))) + (set-imap-folder-n-messages! folder count) + (set-imap-folder-messages! + folder + (make-vector (or (compute-messages-length v count) + (vector-length v)) + #f)) + (fill-messages-vector! folder 0) + (set-imap-folder-messages-synchronized?! folder #t) + (with-interrupt-mask interrupt-mask + (lambda (interrupt-mask) + interrupt-mask + ((imail-message-wrapper "Reading message UIDs") + (lambda () + (imap:command:fetch-all (imap-folder-connection folder) + '(UID)))))) + (folder-modified! folder 'SET-LENGTH) + (let ((v* (imap-folder-messages folder)) + (n* (imap-folder-n-messages folder))) + (let loop ((i 0) (i* 0)) + (if (and (fix:< i n) (fix:< i* n*)) + (let ((m (vector-ref v i)) + (m* (vector-ref v* i*))) + (if (= (imap-message-uid m) (imap-message-uid m*)) + (begin + ;; Flags might have been updated while + ;; reading the UIDs. + (if (%message-flags-initialized? m*) + (%set-message-flags! m (message-flags m*))) + (detach-message! m*) + (attach-message! m folder i*) + (vector-set! v* i* m) + (loop (fix:+ i 1) (fix:+ i* 1))) + (begin + (if (> (imap-message-uid m) + (imap-message-uid m*)) + (error "Message inserted into folder:" m*)) + (loop (fix:+ i 1) i*))))))))))))) ;;;; Message datatype