Reviewed by Darin.
authortomernic <tomernic@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 15 May 2006 19:05:27 +0000 (19:05 +0000)
committertomernic <tomernic@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 15 May 2006 19:05:27 +0000 (19:05 +0000)
        Safari's Page Load Test (PLT) saturates the runloop with so many sources that timers are not allowed to fire
        as frequently as they should.  This is a general problem with the PLT -- because of this, it does not measure
        work done in timer callbacks during/after the page load process.

        Unfortunately, this aspect of the PLT interferes with our window display throttle hack.  Because we throttle
        display using timers, and the PLT starves timers, most of the pages loaded by the PLT do not actually display.
        This makes the PLT run "too fast", yielding ridiculously fast numbers compared to when throttling is disabled.

        I've added a new method that the PLT can call after each page load to force any starved display throttle timers
        to fire.  By doing this, Safari's PLT will be guaranteed to display each page at least once.

        * Misc/WebNSWindowExtras.h:
        * Misc/WebNSWindowExtras.m:
        Added a special internal runloop mode for the throttle timers.
        (+[NSWindow _webkit_displayThrottledWindows]):
        Run the runloop in our special internal mode until there are no more sources to handle.
        (requestWindowDisplay):
        Schedule the timer in the new mode as well as the standard modes.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@14379 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/ChangeLog
WebKit/Misc/WebNSWindowExtras.h
WebKit/Misc/WebNSWindowExtras.m

index 1597368177312112e007fa7cdaad766f6a61b112..e4d6c9371e2d61bebcf1481ef4b959e05ff37734 100644 (file)
@@ -1,3 +1,26 @@
+2006-05-15  Tim Omernick  <timo@apple.com>
+
+        Reviewed by Darin.
+
+        Safari's Page Load Test (PLT) saturates the runloop with so many sources that timers are not allowed to fire 
+        as frequently as they should.  This is a general problem with the PLT -- because of this, it does not measure
+        work done in timer callbacks during/after the page load process.
+
+        Unfortunately, this aspect of the PLT interferes with our window display throttle hack.  Because we throttle
+        display using timers, and the PLT starves timers, most of the pages loaded by the PLT do not actually display.
+        This makes the PLT run "too fast", yielding ridiculously fast numbers compared to when throttling is disabled.
+
+        I've added a new method that the PLT can call after each page load to force any starved display throttle timers
+        to fire.  By doing this, Safari's PLT will be guaranteed to display each page at least once.
+
+        * Misc/WebNSWindowExtras.h:
+        * Misc/WebNSWindowExtras.m:
+        Added a special internal runloop mode for the throttle timers.
+        (+[NSWindow _webkit_displayThrottledWindows]):
+        Run the runloop in our special internal mode until there are no more sources to handle.
+        (requestWindowDisplay):
+        Schedule the timer in the new mode as well as the standard modes.
+        
 2006-05-15  Anders Carlsson  <acarlsson@apple.com>
 
         Reviewed by Maciej.
index 10051de0042d628ea8a3c73d163783c46f531ec3..8b950f804a940150cc193e859580e93c39d70f21 100644 (file)
 // immediately when window throttling is disabled.
 + (void)_webkit_disableWindowDisplayThrottle;
 
+// Force all throttle timers to fire by running the runloop in WebKitDisplayThrottleRunLoopMode until there are
+// no more runloop timers/sources for that mode.
++ (void)_webkit_displayThrottledWindows;
+
 // centers "visually", putting 1/3 of the remaining space above, and 2/3 below
 - (void)centerOverMainWindow; 
 @end
index 7c940d080e0a925eb2ad26ab39c33dce88583488..3b8a6393f6f3cc6f0e420758ffe91608962d327c 100644 (file)
@@ -34,6 +34,8 @@
 
 #define DISPLAY_REFRESH_INTERVAL (1.0 / 60.0)
 
+static NSString *WebKitDisplayThrottleRunLoopMode = @"WebKitDisplayThrottleRunLoopMode";
+
 static BOOL throttlingWindowDisplay;
 static CFMutableDictionaryRef windowDisplayInfoDictionary;
 static IMP oldNSWindowPostWindowNeedsDisplayIMP;
@@ -102,6 +104,16 @@ static void disableWindowDisplayThrottleApplierFunction(const void *key, const v
     free(displayInfo);
 }
 
++ (void)_webkit_displayThrottledWindows
+{
+    if (!throttlingWindowDisplay)
+        return;
+
+    // Force all throttle timers to fire by running the runloop in WebKitDisplayThrottleRunLoopMode until there are
+    // no more runloop timers/sources for that mode.
+    while (CFRunLoopRunInMode((CFStringRef)WebKitDisplayThrottleRunLoopMode, 0, true) == kCFRunLoopRunHandledSource) {}
+}
+
 + (void)_webkit_disableWindowDisplayThrottle
 {
     if (!throttlingWindowDisplay)
@@ -250,6 +262,10 @@ static BOOL requestWindowDisplay(NSWindow *window)
         [runLoop addTimer:displayInfo->displayTimer forMode:NSEventTrackingRunLoopMode];
         [runLoop addTimer:displayInfo->displayTimer forMode:NSModalPanelRunLoopMode];
         
+        // Schedule the timer in WebKitDisplayThrottleRunLoopMode so that +_webkit_displayThrottledWindows can
+        // force all window throttle timers to fire by running in just that mode
+        [runLoop addTimer:displayInfo->displayTimer forMode:WebKitDisplayThrottleRunLoopMode];
+        
         return NO;
     }