[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

andersca at apple.com andersca at apple.com
Wed Dec 22 13:59:05 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit b99fca7df9387d428807e4649f80f4c5c703eec0
Author: andersca at apple.com <andersca at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Sep 30 22:00:23 2010 +0000

    WebCore uses the main thread to process sleep notifications
    https://bugs.webkit.org/show_bug.cgi?id=46935
    
    Reviewed by Dan Bernstein and Darin Adler.
    
    Rewrite the old WebCorePowerNotifier to use IOKit directly.
    
    On Snow Leopard, set up power notifications to arrive on a dispatch queue,
    so that we can handle them quickly even if the main thread is hung.
    
    (Tiger and Leopard will still get the old behavior).
    
    * WebCore.xcodeproj/project.pbxproj:
    Link with IOKit.
    
    * platform/mac/SharedTimerMac.mm:
    (WebCore::PowerObserver::PowerObserver):
    Initialize the IOKit machinery.
    
    (WebCore::PowerObserver::~PowerObserver):
    Tear down the IOKit notifications.
    
    (WebCore::PowerObserver::didReceiveSystemPowerNotification):
    Acknowledge the event immediately and then call the shared timer functions. On Snow Leopard, we
    make sure to call the shared timer functions on the main thread.
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@68836 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 4ae9dcb..3b77b71 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,31 @@
+2010-09-30  Anders Carlsson  <andersca at apple.com>
+
+        Reviewed by Dan Bernstein and Darin Adler.
+
+        WebCore uses the main thread to process sleep notifications
+        https://bugs.webkit.org/show_bug.cgi?id=46935
+
+        Rewrite the old WebCorePowerNotifier to use IOKit directly. 
+        
+        On Snow Leopard, set up power notifications to arrive on a dispatch queue,
+        so that we can handle them quickly even if the main thread is hung.
+
+        (Tiger and Leopard will still get the old behavior).
+
+        * WebCore.xcodeproj/project.pbxproj:
+        Link with IOKit.
+
+        * platform/mac/SharedTimerMac.mm:
+        (WebCore::PowerObserver::PowerObserver):
+        Initialize the IOKit machinery.
+
+        (WebCore::PowerObserver::~PowerObserver):
+        Tear down the IOKit notifications.
+
+        (WebCore::PowerObserver::didReceiveSystemPowerNotification):
+        Acknowledge the event immediately and then call the shared timer functions. On Snow Leopard, we
+        make sure to call the shared timer functions on the main thread.
+    
 2010-09-30  James Simonsen  <simonjam at chromium.org>
 
         Reviewed by Adam Barth.
diff --git a/WebCore/WebCore.xcodeproj/project.pbxproj b/WebCore/WebCore.xcodeproj/project.pbxproj
index 74e61b7..5e3ea11 100644
--- a/WebCore/WebCore.xcodeproj/project.pbxproj
+++ b/WebCore/WebCore.xcodeproj/project.pbxproj
@@ -467,6 +467,7 @@
 		1AA8799011CBE846003C664F /* PluginStrategy.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AA8798F11CBE846003C664F /* PluginStrategy.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		1AB1AE7A0C051FDE00139F4F /* zoomInCursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 1AB1AE780C051FDE00139F4F /* zoomInCursor.png */; };
 		1AB1AE7B0C051FDE00139F4F /* zoomOutCursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 1AB1AE790C051FDE00139F4F /* zoomOutCursor.png */; };
+		1AB33DA512551E320024457A /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AB33DA412551E320024457A /* IOKit.framework */; };
 		1AB7FC680A8B92EC00D9D37B /* XPathEvaluator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1AB7FC470A8B92EC00D9D37B /* XPathEvaluator.cpp */; };
 		1AB7FC690A8B92EC00D9D37B /* XPathEvaluator.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AB7FC480A8B92EC00D9D37B /* XPathEvaluator.h */; };
 		1AB7FC6B0A8B92EC00D9D37B /* XPathExpression.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1AB7FC4A0A8B92EC00D9D37B /* XPathExpression.cpp */; };
@@ -6421,6 +6422,7 @@
 		1AA8798F11CBE846003C664F /* PluginStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PluginStrategy.h; sourceTree = "<group>"; };
 		1AB1AE780C051FDE00139F4F /* zoomInCursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = zoomInCursor.png; sourceTree = "<group>"; };
 		1AB1AE790C051FDE00139F4F /* zoomOutCursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = zoomOutCursor.png; sourceTree = "<group>"; };
+		1AB33DA412551E320024457A /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = "<absolute>"; };
 		1AB7FC470A8B92EC00D9D37B /* XPathEvaluator.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = XPathEvaluator.cpp; sourceTree = "<group>"; };
 		1AB7FC480A8B92EC00D9D37B /* XPathEvaluator.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = XPathEvaluator.h; sourceTree = "<group>"; };
 		1AB7FC490A8B92EC00D9D37B /* XPathEvaluator.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = XPathEvaluator.idl; sourceTree = "<group>"; };
@@ -11546,6 +11548,7 @@
 				49C7BA791042EFAE0009D447 /* OpenGL.framework in Frameworks */,
 				A88AD52F09524B92001DD196 /* QuartzCore.framework in Frameworks */,
 				1A7FA7CC0DDA4B770028F8A5 /* SystemConfiguration.framework in Frameworks */,
+				1AB33DA512551E320024457A /* IOKit.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -11609,6 +11612,7 @@
 				F5C2869302846DCD018635CA /* ApplicationServices.framework */,
 				F5C2869402846DCD018635CA /* Carbon.framework */,
 				F5C2869502846DCD018635CA /* Cocoa.framework */,
+				1AB33DA412551E320024457A /* IOKit.framework */,
 				F8216299029F4FB501000131 /* JavaScriptCore.framework */,
 				93F1D31A0558CC5C00821BC0 /* libicucore.dylib */,
 				1CFAE3220A6D6A3F0032593D /* libobjc.dylib */,
diff --git a/WebCore/platform/mac/SharedTimerMac.mm b/WebCore/platform/mac/SharedTimerMac.mm
index b9eaaef..cc9ff17 100644
--- a/WebCore/platform/mac/SharedTimerMac.mm
+++ b/WebCore/platform/mac/SharedTimerMac.mm
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -26,51 +26,131 @@
 #import "config.h"
 #import "SharedTimer.h"
 
+#import <IOKit/IOMessage.h>
+#import <IOKit/pwr_mgt/IOPMLib.h>
 #import <wtf/Assertions.h>
+#import <wtf/Noncopyable.h>
+#import <wtf/PassOwnPtr.h>
 #import <wtf/UnusedParam.h>
 
- at class WebCorePowerNotifier;
+#include <stdio.h>
+
+// On Snow Leopard and newer we'll ask IOKit to deliver notifications on a queue.
+#if defined(BUILDING_ON_TIGER) || defined(BUILDING_ON_LEOPARD)
+#define IOKIT_WITHOUT_LIBDISPATCH 1
+#endif
 
 namespace WebCore {
 
-static WebCorePowerNotifier *powerNotifier;
 static CFRunLoopTimerRef sharedTimer;
 static void (*sharedTimerFiredFunction)();
 static void timerFired(CFRunLoopTimerRef, void*);
 
+#if !defined(IOKIT_WITHOUT_LIBDISPATCH) && defined(BUILDING_ON_SNOW_LEOPARD)
+extern "C" void IONotificationPortSetDispatchQueue(IONotificationPortRef notify, dispatch_queue_t queue);
+#endif
+
+class PowerObserver {
+    WTF_MAKE_NONCOPYABLE(PowerObserver);
+    
+public:
+    static PassOwnPtr<PowerObserver> create()
+    {
+        return adoptPtr(new PowerObserver);
+    }
+    ~PowerObserver();
+
+private:
+    PowerObserver();
+
+    static void didReceiveSystemPowerNotification(void* context, io_service_t, uint32_t messageType, void* messageArgument);
+    void didReceiveSystemPowerNotification(io_service_t, uint32_t messageType, void* messageArgument);
+
+    void restartSharedTimer();
+
+    io_connect_t m_powerConnection;
+    IONotificationPortRef m_notificationPort;
+    io_object_t m_notifierReference;
+#ifdef IOKIT_WITHOUT_LIBDISPATCH
+    CFRunLoopSourceRef m_runLoopSource;
+#else
+    dispatch_queue_t m_dispatchQueue;
+#endif
+};
+
+PowerObserver::PowerObserver()
+    : m_powerConnection(0)
+    , m_notificationPort(0)
+    , m_notifierReference(0)
+#ifdef IOKIT_WITHOUT_LIBDISPATCH
+    , m_runLoopSource(0)    
+#else
+    , m_dispatchQueue(dispatch_queue_create("com.apple.WebKit.PowerObserver", 0))
+#endif
+{
+    m_powerConnection = IORegisterForSystemPower(this, &m_notificationPort, didReceiveSystemPowerNotification, &m_notifierReference);
+    if (!m_powerConnection)
+        return;
+
+#ifdef IOKIT_WITHOUT_LIBDISPATCH
+    m_runLoopSource = IONotificationPortGetRunLoopSource(m_notificationPort);
+    CFRunLoopAddSource(CFRunLoopGetMain(), m_runLoopSource, kCFRunLoopCommonModes);
+#else
+    IONotificationPortSetDispatchQueue(m_notificationPort, m_dispatchQueue);
+#endif
 }
 
- at interface WebCorePowerNotifier : NSObject
- at end
+PowerObserver::~PowerObserver()
+{
+    if (!m_powerConnection)
+        return;
+
+#ifdef IOKIT_WITHOUT_LIBDISPATCH
+    CFRunLoopRemoveSource(CFRunLoopGetMain(), m_runLoopSource, kCFRunLoopCommonModes);
+#else
+    dispatch_release(m_dispatchQueue);
+#endif
+
+    IODeregisterForSystemPower(&m_notifierReference);
+    IOServiceClose(m_powerConnection);
+    IONotificationPortDestroy(m_notificationPort);
+}
 
- at implementation WebCorePowerNotifier
+void PowerObserver::didReceiveSystemPowerNotification(void* context, io_service_t service, uint32_t messageType, void* messageArgument)
+{
+    static_cast<PowerObserver*>(context)->didReceiveSystemPowerNotification(service, messageType, messageArgument);
+}
 
-- (id)init
+void PowerObserver::didReceiveSystemPowerNotification(io_service_t, uint32_t messageType, void* messageArgument)
 {
-    self = [super init];
-    
-    if (self)
-        [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self
-                                                               selector:@selector(didWake:)
-                                                                   name:NSWorkspaceDidWakeNotification 
-                                                                 object:nil];
-    
-    return self;
+    IOAllowPowerChange(m_powerConnection, reinterpret_cast<long>(messageArgument));
+
+    // We only care about the "wake from sleep" message.
+    if (messageType != kIOMessageSystemWillPowerOn)
+        return;
+
+#ifdef IOKIT_WITHOUT_LIBDISPATCH
+    restartSharedTimer();
+#else
+    // We need to restart the timer on the main thread.
+    CFRunLoopPerformBlock(CFRunLoopGetMain(), kCFRunLoopCommonModes, ^() {
+        restartSharedTimer();
+    });
+#endif
 }
 
-- (void)didWake:(NSNotification *)unusedNotification
+void PowerObserver::restartSharedTimer()
 {
-    UNUSED_PARAM(unusedNotification);
+    ASSERT(CFRunLoopGetCurrent() == CFRunLoopGetMain());
 
-    if (WebCore::sharedTimer) {
-        WebCore::stopSharedTimer();
-        WebCore::timerFired(0, 0);
-    }
-}
+    if (!sharedTimer)
+        return;
 
- at end
+    stopSharedTimer();
+    timerFired(0, 0);
+}
 
-namespace WebCore {
+static PowerObserver* PowerObserver;
 
 void setSharedTimerFiredFunction(void (*f)())
 {
@@ -100,11 +180,8 @@ void setSharedTimerFireTime(double fireTime)
     sharedTimer = CFRunLoopTimerCreate(0, fireDate, 0, 0, 0, timerFired, 0);
     CFRunLoopAddTimer(CFRunLoopGetCurrent(), sharedTimer, kCFRunLoopCommonModes);
     
-    if (!powerNotifier) {
-        powerNotifier = [[WebCorePowerNotifier alloc] init];
-        CFRetain(powerNotifier);
-        [powerNotifier release];
-    }
+    if (!PowerObserver)
+        PowerObserver = PowerObserver::create().leakPtr();
 }
 
 void stopSharedTimer()
@@ -116,4 +193,4 @@ void stopSharedTimer()
     }
 }
 
-}
+} // namespace WebCore

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list