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 36 using namespace JSC; 37 using namespace WebCore; 38 39 // WebJavaScriptCollector --------------------------------------------------------------------------- 40 41 WebJavaScriptCollector::WebJavaScriptCollector() 42 : m_refCount(0) 43 { 44 gClassCount++; 45 gClassNameCount.add("WebJavaScriptCollector"); 46 } 47 48 WebJavaScriptCollector::~WebJavaScriptCollector() 49 { 50 gClassCount--; 51 gClassNameCount.remove("WebJavaScriptCollector"); 52 } 53 54 WebJavaScriptCollector* WebJavaScriptCollector::createInstance() 55 { 56 WebJavaScriptCollector* instance = new WebJavaScriptCollector(); 57 instance->AddRef(); 58 return instance; 59 } 60 61 // IUnknown ------------------------------------------------------------------- 62 63 HRESULT 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 77 ULONG STDMETHODCALLTYPE WebJavaScriptCollector::AddRef(void) 78 { 79 return ++m_refCount; 80 } 81 82 ULONG 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 93 HRESULT STDMETHODCALLTYPE WebJavaScriptCollector::collect() 94 { 95 gcController().garbageCollectNow(); 96 return S_OK; 97 } 98 99 HRESULT STDMETHODCALLTYPE WebJavaScriptCollector::collectOnAlternateThread( 100 /* [in] */ BOOL waitUntilDone) 101 { 102 gcController().garbageCollectOnAlternateThreadForDebugging(!!waitUntilDone); 103 return S_OK; 104 } 105 106 HRESULT 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