Changeset 86594 in webkit
- Timestamp:
- May 16, 2011 11:54:40 AM (13 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r86560 r86594 1 2011-05-16 Oliver Hunt <oliver@apple.com> 2 3 Reviewed by Geoffrey Garen. 4 5 JSWeakObjectMap finalisation may occur while gc is in inconsistent state 6 https://bugs.webkit.org/show_bug.cgi?id=60908 7 <rdar://problem/9409491> 8 9 We need to ensure that we have called all the weak map finalizers while 10 the global object (and hence global context) is still in a consistent 11 state. The best way to achieve this is to simply use a weak handle and 12 finalizer on the global object. 13 14 * JavaScriptCore.exp: 15 * runtime/JSGlobalObject.cpp: 16 (JSC::JSGlobalObject::WeakMapFinalizer::finalize): 17 * runtime/JSGlobalObject.h: 18 (JSC::JSGlobalObject::registerWeakMap): 19 1 20 2011-05-16 Siddharth Mathur <siddharth.mathur@nokia.com> 2 21 -
trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp
r86499 r86594 445 445 } 446 446 447 void JSGlobalObject::WeakMapsFinalizer::finalize(Handle<Unknown> handle, void*) 448 { 449 JSGlobalObject* globalObject = asGlobalObject(handle.get()); 450 globalObject->m_weakMaps.clear(); 451 } 452 453 JSGlobalObject::WeakMapsFinalizer* JSGlobalObject::weakMapsFinalizer() 454 { 455 static WeakMapsFinalizer* finalizer = new WeakMapsFinalizer(); 456 return finalizer; 457 } 458 447 459 DynamicGlobalObjectScope::DynamicGlobalObjectScope(JSGlobalData& globalData, JSGlobalObject* dynamicGlobalObject) 448 460 : m_dynamicGlobalObjectSlot(globalData.dynamicGlobalObject) -
trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h
r85388 r86594 109 109 110 110 WeakMapSet m_weakMaps; 111 Weak<JSGlobalObject> m_weakMapsFinalizer; 112 class WeakMapsFinalizer : public WeakHandleOwner { 113 public: 114 virtual void finalize(Handle<Unknown>, void* context); 115 }; 116 static WeakMapsFinalizer* weakMapsFinalizer(); 117 111 118 WeakRandom m_weakRandom; 112 119 … … 257 264 void registerWeakMap(OpaqueJSWeakObjectMap* map) 258 265 { 266 if (!m_weakMapsFinalizer) 267 m_weakMapsFinalizer.set(globalData(), this, weakMapsFinalizer()); 259 268 m_weakMaps.add(map); 260 269 }
Note: See TracChangeset
for help on using the changeset viewer.