1 /* 2 * Copyright (C) 2009 Google 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 are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include "config.h" 32 #include "DOMData.h" 33 34 #include "ChildThreadDOMData.h" 35 #include "MainThreadDOMData.h" 36 #include "WebGLContextAttributes.h" 37 #include "WebGLUniformLocation.h" 38 39 namespace WebCore { 40 41 DOMData::DOMData() 42 : m_delayedProcessingScheduled(false) 43 , m_isMainThread(WTF::isMainThread()) 44 , m_owningThread(WTF::currentThread()) 45 { 46 } 47 48 DOMData::~DOMData() 49 { 50 } 51 52 DOMData* DOMData::getCurrent() 53 { 54 if (WTF::isMainThread()) 55 return MainThreadDOMData::getCurrent(); 56 57 DEFINE_STATIC_LOCAL(WTF::ThreadSpecific<ChildThreadDOMData>, childThreadDOMData, ()); 58 return childThreadDOMData; 59 } 60 61 void DOMData::ensureDeref(V8ClassIndex::V8WrapperType type, void* domObject) 62 { 63 if (m_owningThread == WTF::currentThread()) { 64 // No need to delay the work. We can deref right now. 65 derefObject(type, domObject); 66 return; 67 } 68 69 // We need to do the deref on the correct thread. 70 m_delayedObjectMap.set(domObject, type); 71 72 // Post a task to the owning thread in order to process the delayed queue. 73 // FIXME: For now, we can only post to main thread due to WTF task posting limitation. We will fix this when we work on nested worker. 74 if (!m_delayedProcessingScheduled) { 75 m_delayedProcessingScheduled = true; 76 if (isMainThread()) 77 WTF::callOnMainThread(&derefDelayedObjectsInCurrentThread, 0); 78 } 79 } 80 81 void DOMData::derefObject(V8ClassIndex::V8WrapperType type, void* domObject) 82 { 83 switch (type) { 84 case V8ClassIndex::NODE: 85 static_cast<Node*>(domObject)->deref(); 86 break; 87 88 #define MakeCase(type, name) \ 89 case V8ClassIndex::type: static_cast<name*>(domObject)->deref(); break; 90 DOM_OBJECT_TYPES(MakeCase) // This includes both active and non-active. 91 #undef MakeCase 92 93 #if ENABLE(SVG) 94 #define MakeCase(type, name) \ 95 case V8ClassIndex::type: static_cast<name*>(domObject)->deref(); break; 96 SVG_OBJECT_TYPES(MakeCase) // This also includes SVGElementInstance. 97 #undef MakeCase 98 99 #define MakeCase(type, name) \ 100 case V8ClassIndex::type: \ 101 static_cast<V8SVGPODTypeWrapper<name>*>(domObject)->deref(); break; 102 SVG_POD_NATIVE_TYPES(MakeCase) 103 #undef MakeCase 104 #endif 105 106 default: 107 ASSERT_NOT_REACHED(); 108 break; 109 } 110 } 111 112 void DOMData::derefDelayedObjects() 113 { 114 WTF::MutexLocker locker(DOMDataStore::allStoresMutex()); 115 116 m_delayedProcessingScheduled = false; 117 118 for (DelayedObjectMap::iterator iter(m_delayedObjectMap.begin()); iter != m_delayedObjectMap.end(); ++iter) 119 derefObject(iter->second, iter->first); 120 121 m_delayedObjectMap.clear(); 122 } 123 124 void DOMData::derefDelayedObjectsInCurrentThread(void*) 125 { 126 getCurrent()->derefDelayedObjects(); 127 } 128 129 } // namespace WebCore 130