[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