1/* 2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "WebKitDLL.h" 28#include "WebJavaScriptCollector.h" 29 30#include <JavaScriptCore/Heap.h> 31#include <JavaScriptCore/JSGlobalData.h> 32#include <WebCore/GCController.h> 33#include <WebCore/JSDOMWindow.h> 34#include <runtime/JSLock.h> 35 36using namespace JSC; 37using namespace WebCore; 38 39// WebJavaScriptCollector --------------------------------------------------------------------------- 40 41WebJavaScriptCollector::WebJavaScriptCollector() 42: m_refCount(0) 43{ 44 gClassCount++; 45 gClassNameCount.add("WebJavaScriptCollector"); 46} 47 48WebJavaScriptCollector::~WebJavaScriptCollector() 49{ 50 gClassCount--; 51 gClassNameCount.remove("WebJavaScriptCollector"); 52} 53 54WebJavaScriptCollector* WebJavaScriptCollector::createInstance() 55{ 56 WebJavaScriptCollector* instance = new WebJavaScriptCollector(); 57 instance->AddRef(); 58 return instance; 59} 60 61// IUnknown ------------------------------------------------------------------- 62 63HRESULT STDMETHODCALLTYPE WebJavaScriptCollector::QueryInterface(REFIID riid, void** ppvObject) 64{ 65 *ppvObject = 0; 66 if (IsEqualGUID(riid, IID_IUnknown)) 67 *ppvObject = static_cast<IWebJavaScriptCollector*>(this); 68 else if (IsEqualGUID(riid, IID_IWebJavaScriptCollector)) 69 *ppvObject = static_cast<IWebJavaScriptCollector*>(this); 70 else 71 return E_NOINTERFACE; 72 73 AddRef(); 74 return S_OK; 75} 76 77ULONG STDMETHODCALLTYPE WebJavaScriptCollector::AddRef(void) 78{ 79 return ++m_refCount; 80} 81 82ULONG STDMETHODCALLTYPE WebJavaScriptCollector::Release(void) 83{ 84 ULONG newRef = --m_refCount; 85 if (!newRef) 86 delete(this); 87 88 return newRef; 89} 90 91// IWebJavaScriptCollector ------------------------------------------------------------------------------ 92 93HRESULT STDMETHODCALLTYPE WebJavaScriptCollector::collect() 94{ 95 gcController().garbageCollectNow(); 96 return S_OK; 97} 98 99HRESULT STDMETHODCALLTYPE WebJavaScriptCollector::collectOnAlternateThread( 100 /* [in] */ BOOL waitUntilDone) 101{ 102 gcController().garbageCollectOnAlternateThreadForDebugging(!!waitUntilDone); 103 return S_OK; 104} 105 106HRESULT STDMETHODCALLTYPE WebJavaScriptCollector::objectCount( 107 /* [retval][out] */ UINT* count) 108{ 109 if (!count) { 110 ASSERT_NOT_REACHED(); 111 return E_POINTER; 112 } 113 114 JSLock lock(SilenceAssertionsOnly); 115 *count = (UINT)JSDOMWindow::commonJSGlobalData()->heap.objectCount(); 116 return S_OK; 117} 118