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 #pragma warning(push, 0) 31 #include <JavaScriptCore/JSGlobalData.h> 32 #include <JavaScriptCore/collector.h> 33 #include <WebCore/GCController.h> 34 #include <WebCore/JSDOMWindow.h> 35 #include <runtime/JSLock.h> 36 #pragma warning(pop) 37 38 using namespace JSC; 39 using namespace WebCore; 40 41 // WebJavaScriptCollector --------------------------------------------------------------------------- 42 43 WebJavaScriptCollector::WebJavaScriptCollector() 44 : m_refCount(0) 45 { 46 gClassCount++; 47 gClassNameCount.add("WebJavaScriptCollector"); 48 } 49 50 WebJavaScriptCollector::~WebJavaScriptCollector() 51 { 52 gClassCount--; 53 gClassNameCount.remove("WebJavaScriptCollector"); 54 } 55 56 WebJavaScriptCollector* WebJavaScriptCollector::createInstance() 57 { 58 WebJavaScriptCollector* instance = new WebJavaScriptCollector(); 59 instance->AddRef(); 60 return instance; 61 } 62 63 // IUnknown ------------------------------------------------------------------- 64 65 HRESULT STDMETHODCALLTYPE WebJavaScriptCollector::QueryInterface(REFIID riid, void** ppvObject) 66 { 67 *ppvObject = 0; 68 if (IsEqualGUID(riid, IID_IUnknown)) 69 *ppvObject = static_cast<IWebJavaScriptCollector*>(this); 70 else if (IsEqualGUID(riid, IID_IWebJavaScriptCollector)) 71 *ppvObject = static_cast<IWebJavaScriptCollector*>(this); 72 else 73 return E_NOINTERFACE; 74 75 AddRef(); 76 return S_OK; 77 } 78 79 ULONG STDMETHODCALLTYPE WebJavaScriptCollector::AddRef(void) 80 { 81 return ++m_refCount; 82 } 83 84 ULONG STDMETHODCALLTYPE WebJavaScriptCollector::Release(void) 85 { 86 ULONG newRef = --m_refCount; 87 if (!newRef) 88 delete(this); 89 90 return newRef; 91 } 92 93 // IWebJavaScriptCollector ------------------------------------------------------------------------------ 94 95 HRESULT STDMETHODCALLTYPE WebJavaScriptCollector::collect() 96 { 97 gcController().garbageCollectNow(); 98 return S_OK; 99 } 100 101 HRESULT STDMETHODCALLTYPE WebJavaScriptCollector::collectOnAlternateThread( 102 /* [in] */ BOOL waitUntilDone) 103 { 104 gcController().garbageCollectOnAlternateThreadForDebugging(!!waitUntilDone); 105 return S_OK; 106 } 107 108 HRESULT STDMETHODCALLTYPE WebJavaScriptCollector::objectCount( 109 /* [retval][out] */ UINT* count) 110 { 111 if (!count) { 112 ASSERT_NOT_REACHED(); 113 return E_POINTER; 114 } 115 116 JSLock lock(SilenceAssertionsOnly); 117 *count = (UINT)JSDOMWindow::commonJSGlobalData()->heap.objectCount(); 118 return S_OK; 119 } 120