[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

mjs mjs at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 07:43:35 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit 1ec476a2db9f01086a16ca059a64aedf01e55fe2
Author: mjs <mjs at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Fri May 30 02:55:08 2003 +0000

            Reviewed by Richard.
    
    	- fixed 3270373 - MALLORY: repro crash in +[KWQObjectTimerTarget stopDeferringTimers] while changing folder
    
            * kwq/KWQObject.mm:
            (QObject::killTimer): Remove the timer from the deferred list too - clients expect that a timer
    	will never be delivered after the object was killed.
            (QObject::killTimers): Use killTimer on each timer for this object instead of trying
    	to be tricky.
            (-[KWQObjectTimerTarget timerFired]): Don't add a timer to the deferred list more than once,
    	because there's no benefit in ganging up multiple firings while deferred, and it makes other
    	things simpler.
            (+[KWQObjectTimerTarget stopDeferringTimers]): Make sure to remove the timer before firing it,
    	since it may also cancel itself, and we don't want to remove an extra timer in that case.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@4453 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog-2003-10-25 b/WebCore/ChangeLog-2003-10-25
index d1ddfe7..de93a77 100644
--- a/WebCore/ChangeLog-2003-10-25
+++ b/WebCore/ChangeLog-2003-10-25
@@ -1,3 +1,20 @@
+2003-05-29  Maciej Stachowiak  <mjs at apple.com>
+
+        Reviewed by Richard.
+
+	- fixed 3270373 - MALLORY: repro crash in +[KWQObjectTimerTarget stopDeferringTimers] while changing folder
+
+        * kwq/KWQObject.mm:
+        (QObject::killTimer): Remove the timer from the deferred list too - clients expect that a timer
+	will never be delivered after the object was killed.
+        (QObject::killTimers): Use killTimer on each timer for this object instead of trying
+	to be tricky. 
+        (-[KWQObjectTimerTarget timerFired]): Don't add a timer to the deferred list more than once,
+	because there's no benefit in ganging up multiple firings while deferred, and it makes other
+	things simpler.
+        (+[KWQObjectTimerTarget stopDeferringTimers]): Make sure to remove the timer before firing it, 
+	since it may also cancel itself, and we don't want to remove an extra timer in that case.
+
 2003-05-29  Richard Williamson   <rjw at apple.com>
 
 	Support for the 'estimatedProgress' method on
diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index d1ddfe7..de93a77 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,3 +1,20 @@
+2003-05-29  Maciej Stachowiak  <mjs at apple.com>
+
+        Reviewed by Richard.
+
+	- fixed 3270373 - MALLORY: repro crash in +[KWQObjectTimerTarget stopDeferringTimers] while changing folder
+
+        * kwq/KWQObject.mm:
+        (QObject::killTimer): Remove the timer from the deferred list too - clients expect that a timer
+	will never be delivered after the object was killed.
+        (QObject::killTimers): Use killTimer on each timer for this object instead of trying
+	to be tricky. 
+        (-[KWQObjectTimerTarget timerFired]): Don't add a timer to the deferred list more than once,
+	because there's no benefit in ganging up multiple firings while deferred, and it makes other
+	things simpler.
+        (+[KWQObjectTimerTarget stopDeferringTimers]): Make sure to remove the timer before firing it, 
+	since it may also cancel itself, and we don't want to remove an extra timer in that case.
+
 2003-05-29  Richard Williamson   <rjw at apple.com>
 
 	Support for the 'estimatedProgress' method on
diff --git a/WebCore/kwq/KWQObject.mm b/WebCore/kwq/KWQObject.mm
index 09560c4..1a1fed0 100644
--- a/WebCore/kwq/KWQObject.mm
+++ b/WebCore/kwq/KWQObject.mm
@@ -264,6 +264,7 @@ void QObject::killTimer(int _timerId)
     NSMutableDictionary *timers = (NSMutableDictionary *)CFDictionaryGetValue(timerDictionaries, this);
     NSNumber *timerId = [NSNumber numberWithInt:_timerId];
     NSTimer *timer = (NSTimer *)[timers objectForKey:timerId];
+    [deferredTimers removeObject:(KWQObjectTimerTarget *)[timer userInfo]];
     [timer invalidate];
     [timers removeObjectForKey:timerId];
 }
@@ -277,7 +278,12 @@ void QObject::killTimers()
     if (timers == nil) {
         return;
     }
-    [[timers allValues] makeObjectsPerformSelector:@selector(invalidate)];
+    NSEnumerator *e = [timers keyEnumerator];
+    NSNumber *timerId;
+    while ((timerId = [e nextObject]) != nil) {
+	killTimer([timerId intValue]);
+    }
+
     CFDictionaryRemoveValue(timerDictionaries, this);
 }
 
@@ -320,7 +326,9 @@ void QObject::setDefersTimers(bool defers)
         if (deferredTimers == nil) {
             deferredTimers = [[NSMutableArray alloc] init];
         }
-        [deferredTimers addObject:self];
+	if (![deferredTimers containsObject:self]) {
+	    [deferredTimers addObject:self];
+	}
     } else {
         [self sendTimerEvent];
     }
@@ -330,9 +338,16 @@ void QObject::setDefersTimers(bool defers)
 {
     ASSERT(deferringTimers);
     while ([deferredTimers count] != 0) {
-        [[deferredTimers objectAtIndex:0] sendTimerEvent];
-        [deferredTimers removeObjectAtIndex:0];
+	// remove before sending the timer event, in case the timer
+	// callback cancels the timer - we don't want to remove too
+	// much in that case.
+	KWQObjectTimerTarget *timerTarget = [deferredTimers objectAtIndex:0];
+	[timerTarget retain];
+	[deferredTimers removeObjectAtIndex:0];
+        [timerTarget sendTimerEvent];
+	[timerTarget release];
     }
+
     deferringTimers = false;
 }
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list