diff options
Diffstat (limited to 'Source/WebKit2/Platform/mac')
-rw-r--r-- | Source/WebKit2/Platform/mac/Logging.mac.mm | 49 | ||||
-rw-r--r-- | Source/WebKit2/Platform/mac/ModuleMac.mm | 17 | ||||
-rw-r--r-- | Source/WebKit2/Platform/mac/RunLoopMac.mm | 19 |
3 files changed, 83 insertions, 2 deletions
diff --git a/Source/WebKit2/Platform/mac/Logging.mac.mm b/Source/WebKit2/Platform/mac/Logging.mac.mm new file mode 100644 index 0000000..6e45828 --- /dev/null +++ b/Source/WebKit2/Platform/mac/Logging.mac.mm @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2011 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "Logging.h" + +namespace WebKit { + +#ifndef NDEBUG + +void initializeLogChannel(WTFLogChannel* channel) +{ + channel->state = WTFLogChannelOff; + NSString *logLevelString = [[NSUserDefaults standardUserDefaults] objectForKey:[NSString stringWithUTF8String:channel->defaultName]]; + if (!logLevelString) + return; + + unsigned logLevel; + if (![[NSScanner scannerWithString:logLevelString] scanHexInt:&logLevel]) + NSLog(@"unable to parse hex value for %s (%@), logging is off", channel->defaultName, logLevelString); + if ((logLevel & channel->mask) == channel->mask) + channel->state = WTFLogChannelOn; +} + +#endif + +} // namespace WebKit diff --git a/Source/WebKit2/Platform/mac/ModuleMac.mm b/Source/WebKit2/Platform/mac/ModuleMac.mm index 078e7ee..1ec60f3 100644 --- a/Source/WebKit2/Platform/mac/ModuleMac.mm +++ b/Source/WebKit2/Platform/mac/ModuleMac.mm @@ -48,6 +48,13 @@ bool Module::load() void Module::unload() { + ASSERT(m_bundle); + +#if !defined(__LP64__) + if (m_bundleResourceMap != -1) + CFBundleCloseBundleResourceMap(m_bundle.get(), m_bundleResourceMap); +#endif + // See the comment in Module.h for why we leak the bundle here. m_bundle.releaseRef(); } @@ -60,4 +67,14 @@ void* Module::platformFunctionPointer(const char* functionName) const return CFBundleGetFunctionPointerForName(m_bundle.get(), functionNameString.get()); } +#if !defined(__LP64__) +CFBundleRefNum Module::bundleResourceMap() +{ + if (m_bundleResourceMap == -1) + m_bundleResourceMap = CFBundleOpenBundleResourceMap(m_bundle.get()); + + return m_bundleResourceMap; +} +#endif + } diff --git a/Source/WebKit2/Platform/mac/RunLoopMac.mm b/Source/WebKit2/Platform/mac/RunLoopMac.mm index 8258550..828c57f 100644 --- a/Source/WebKit2/Platform/mac/RunLoopMac.mm +++ b/Source/WebKit2/Platform/mac/RunLoopMac.mm @@ -30,7 +30,14 @@ void RunLoop::performWork(void* context) { - static_cast<RunLoop*>(context)->performWork(); + // Wrap main thread in an Autorelease pool. Sending messages can call + // into objc code and accumulate memory. + if (current() == main()) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + static_cast<RunLoop*>(context)->performWork(); + [pool drain]; + } else + static_cast<RunLoop*>(context)->performWork(); } RunLoop::RunLoop() @@ -91,7 +98,15 @@ void RunLoop::wakeUp() void RunLoop::TimerBase::timerFired(CFRunLoopTimerRef, void* context) { TimerBase* timer = static_cast<TimerBase*>(context); - timer->fired(); + + // Wrap main thread in an Autorelease pool. The timer can call + // into objc code and accumulate memory outside of the main event loop. + if (current() == main()) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + timer->fired(); + [pool drain]; + } else + timer->fired(); } RunLoop::TimerBase::TimerBase(RunLoop* runLoop) |