[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