Title: [209812] trunk/Source
Revision
209812
Author
[email protected]
Date
2016-12-14 09:50:20 -0800 (Wed, 14 Dec 2016)

Log Message

Unreviewed, rolling out r209766.

Regressed Dromaeo JSLib by ~50%

Reverted changeset:

"Make opaque root scanning truly constraint-based"
https://bugs.webkit.org/show_bug.cgi?id=165760
http://trac.webkit.org/changeset/209766

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (209811 => 209812)


--- trunk/Source/_javascript_Core/ChangeLog	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/_javascript_Core/ChangeLog	2016-12-14 17:50:20 UTC (rev 209812)
@@ -1,3 +1,15 @@
+2016-12-14  Chris Dumez  <[email protected]>
+
+        Unreviewed, rolling out r209766.
+
+        Regressed Dromaeo JSLib by ~50%
+
+        Reverted changeset:
+
+        "Make opaque root scanning truly constraint-based"
+        https://bugs.webkit.org/show_bug.cgi?id=165760
+        http://trac.webkit.org/changeset/209766
+
 2016-12-14  Commit Queue  <[email protected]>
 
         Unreviewed, rolling out r209795.

Modified: trunk/Source/_javascript_Core/heap/Heap.cpp (209811 => 209812)


--- trunk/Source/_javascript_Core/heap/Heap.cpp	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/_javascript_Core/heap/Heap.cpp	2016-12-14 17:50:20 UTC (rev 209812)
@@ -519,7 +519,6 @@
     
     if (m_collectionScope == CollectionScope::Full) {
         m_opaqueRoots.clear();
-        m_constraints.clear();
         m_collectorSlotVisitor->clearMarkStacks();
         m_mutatorMarkStack->clear();
     }
@@ -618,15 +617,11 @@
                 
         m_jitStubRoutines->traceMarkedStubRoutines(*m_collectorSlotVisitor);
 
-        m_collectorSlotVisitor->mergeIfNecessary();
+        m_collectorSlotVisitor->mergeOpaqueRootsIfNecessary();
         for (auto& parallelVisitor : m_parallelSlotVisitors)
-            parallelVisitor->mergeIfNecessary();
-        
-        for (JSCell* cell : m_constraints)
-            m_collectorSlotVisitor->visitSubsequently(cell);
-        m_collectorSlotVisitor->mergeIfNecessary();
+            parallelVisitor->mergeOpaqueRootsIfNecessary();
 
-        size_t weakSetCount = m_objectSpace.visitWeakSets(heapRootVisitor);
+        m_objectSpace.visitWeakSets(heapRootVisitor);
         harvestWeakReferences();
         visitCompilerWorklistWeakReferences();
         DFG::markCodeBlocks(*m_vm, *m_collectorSlotVisitor);
@@ -633,7 +628,7 @@
         bool shouldTerminate = m_collectorSlotVisitor->isEmpty() && m_mutatorMarkStack->isEmpty();
         
         if (Options::logGC()) {
-            dataLog(m_collectorSlotVisitor->collectorMarkStack().size(), "+", m_mutatorMarkStack->size() + m_collectorSlotVisitor->mutatorMarkStack().size(), ", a=", m_bytesAllocatedThisCycle / 1024, " kb, b=", m_barriersExecuted, ", mu=", scheduler.currentDecision().targetMutatorUtilization(), ", ws=", weakSetCount, ", cs=", m_constraints.size(), " ");
+            dataLog(m_collectorSlotVisitor->collectorMarkStack().size(), "+", m_mutatorMarkStack->size() + m_collectorSlotVisitor->mutatorMarkStack().size(), ", a=", m_bytesAllocatedThisCycle / 1024, " kb, b=", m_barriersExecuted, ", mu=", scheduler.currentDecision().targetMutatorUtilization(), " ");
         }
         
         // We want to do this to conservatively ensure that we rescan any code blocks that are
@@ -2225,10 +2220,27 @@
         func(*slotVisitor);
 }
 
+void Heap::writeBarrierOpaqueRootSlow(void* root)
+{
+    ASSERT(mutatorShouldBeFenced());
+    
+    auto locker = holdLock(m_opaqueRootsMutex);
+    m_opaqueRoots.add(root);
+}
+
+void Heap::addMutatorShouldBeFencedCache(bool& cache)
+{
+    ASSERT(hasHeapAccess());
+    cache = m_mutatorShouldBeFenced;
+    m_mutatorShouldBeFencedCaches.append(&cache);
+}
+
 void Heap::setMutatorShouldBeFenced(bool value)
 {
     m_mutatorShouldBeFenced = value;
     m_barrierThreshold = value ? tautologicalThreshold : blackThreshold;
+    for (bool* cache : m_mutatorShouldBeFencedCaches)
+        *cache = value;
 }
     
 } // namespace JSC

Modified: trunk/Source/_javascript_Core/heap/Heap.h (209811 => 209812)


--- trunk/Source/_javascript_Core/heap/Heap.h	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/_javascript_Core/heap/Heap.h	2016-12-14 17:50:20 UTC (rev 209812)
@@ -127,6 +127,8 @@
     WriteBarrierBuffer& writeBarrierBuffer() { return m_writeBarrierBuffer; }
     void flushWriteBarrierBuffer(JSCell*);
     
+    void writeBarrierOpaqueRoot(void*);
+
     Heap(VM*, HeapType);
     ~Heap();
     void lastChanceToFinalize();
@@ -350,6 +352,8 @@
     void preventCollection();
     void allowCollection();
     
+    JS_EXPORT_PRIVATE void addMutatorShouldBeFencedCache(bool&);
+    
 #if USE(CF)
     CFRunLoopRef runLoop() const { return m_runLoop.get(); }
     JS_EXPORT_PRIVATE void setRunLoop(CFRunLoopRef);
@@ -493,6 +497,8 @@
     
     void forEachCodeBlockImpl(const ScopedLambda<bool(CodeBlock*)>&);
     
+    JS_EXPORT_PRIVATE void writeBarrierOpaqueRootSlow(void*);
+    
     void setMutatorShouldBeFenced(bool value);
 
     const HeapType m_heapType;
@@ -553,6 +559,7 @@
     WriteBarrierBuffer m_writeBarrierBuffer;
     bool m_mutatorShouldBeFenced { Options::forceFencedBarrier() };
     unsigned m_barrierThreshold { Options::forceFencedBarrier() ? tautologicalThreshold : blackThreshold };
+    Vector<bool*> m_mutatorShouldBeFencedCaches;
 
     VM* m_vm;
     double m_lastFullGCLength;
@@ -596,8 +603,7 @@
     bool m_parallelMarkersShouldExit { false };
 
     Lock m_opaqueRootsMutex;
-    HashSet<const void*> m_opaqueRoots;
-    HashSet<JSCell*> m_constraints;
+    HashSet<void*> m_opaqueRoots;
 
     static const size_t s_blockFragmentLength = 32;
 

Modified: trunk/Source/_javascript_Core/heap/HeapInlines.h (209811 => 209812)


--- trunk/Source/_javascript_Core/heap/HeapInlines.h	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/_javascript_Core/heap/HeapInlines.h	2016-12-14 17:50:20 UTC (rev 209812)
@@ -370,4 +370,10 @@
     stopIfNecessarySlow();
 }
 
+inline void Heap::writeBarrierOpaqueRoot(void* root)
+{
+    if (mutatorShouldBeFenced())
+        writeBarrierOpaqueRootSlow(root);
+}
+
 } // namespace JSC

Modified: trunk/Source/_javascript_Core/heap/MarkedSpace.cpp (209811 => 209812)


--- trunk/Source/_javascript_Core/heap/MarkedSpace.cpp	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/_javascript_Core/heap/MarkedSpace.cpp	2016-12-14 17:50:20 UTC (rev 209812)
@@ -359,11 +359,10 @@
     m_allocatorForEmptyAllocation = m_firstAllocator;
 }
 
-size_t MarkedSpace::visitWeakSets(HeapRootVisitor& heapRootVisitor)
+void MarkedSpace::visitWeakSets(HeapRootVisitor& heapRootVisitor)
 {
-    size_t count = 0;
     auto visit = [&] (WeakSet* weakSet) {
-        count += weakSet->visit(heapRootVisitor);
+        weakSet->visit(heapRootVisitor);
     };
     
     m_newActiveWeakSets.forEach(visit);
@@ -370,7 +369,6 @@
     
     if (m_heap->collectionScope() == CollectionScope::Full)
         m_activeWeakSets.forEach(visit);
-    return count;
 }
 
 void MarkedSpace::reapWeakSets()

Modified: trunk/Source/_javascript_Core/heap/MarkedSpace.h (209811 => 209812)


--- trunk/Source/_javascript_Core/heap/MarkedSpace.h	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/_javascript_Core/heap/MarkedSpace.h	2016-12-14 17:50:20 UTC (rev 209812)
@@ -129,7 +129,7 @@
     
     void prepareForAllocation();
 
-    size_t visitWeakSets(HeapRootVisitor&);
+    void visitWeakSets(HeapRootVisitor&);
     void reapWeakSets();
 
     MarkedBlockSet& blocks() { return m_blocks; }

Modified: trunk/Source/_javascript_Core/heap/SlotVisitor.cpp (209811 => 209812)


--- trunk/Source/_javascript_Core/heap/SlotVisitor.cpp	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/_javascript_Core/heap/SlotVisitor.cpp	2016-12-14 17:50:20 UTC (rev 209812)
@@ -356,8 +356,8 @@
     
     if (false) {
         dataLog("Visiting ", RawPointer(cell));
-        if (!m_isFirstVisit)
-            dataLog(" (subsequent)");
+        if (m_isVisitingMutatorStack)
+            dataLog(" (mutator)");
         dataLog("\n");
     }
     
@@ -391,17 +391,11 @@
     }
     
     if (UNLIKELY(m_heapSnapshotBuilder)) {
-        if (m_isFirstVisit)
+        if (!m_isVisitingMutatorStack)
             m_heapSnapshotBuilder->appendNode(const_cast<JSCell*>(cell));
     }
 }
 
-void SlotVisitor::visitSubsequently(JSCell* cell)
-{
-    m_isFirstVisit = false;
-    visitChildren(cell);
-}
-
 void SlotVisitor::donateKnownParallel(MarkStackArray& from, MarkStackArray& to)
 {
     // NOTE: Because we re-try often, we can afford to be conservative, and
@@ -471,7 +465,7 @@
         updateMutatorIsStopped(locker);
         if (!m_collectorStack.isEmpty()) {
             m_collectorStack.refill();
-            m_isFirstVisit = true;
+            m_isVisitingMutatorStack = false;
             for (unsigned countdown = Options::minimumNumberOfScansBetweenRebalance(); m_collectorStack.canRemoveLast() && countdown--;)
                 visitChildren(m_collectorStack.removeLast());
         } else if (!m_mutatorStack.isEmpty()) {
@@ -479,7 +473,7 @@
             // We know for sure that we are visiting objects because of the barrier, not because of
             // marking. Marking will visit an object exactly once. The barrier will visit it
             // possibly many times, and always after it was already marked.
-            m_isFirstVisit = false;
+            m_isVisitingMutatorStack = true;
             for (unsigned countdown = Options::minimumNumberOfScansBetweenRebalance(); m_mutatorStack.canRemoveLast() && countdown--;)
                 visitChildren(m_mutatorStack.removeLast());
         }
@@ -487,7 +481,7 @@
         donateKnownParallel();
     }
     
-    mergeIfNecessary();
+    mergeOpaqueRootsIfNecessary();
 }
 
 bool SlotVisitor::didReachTermination()
@@ -606,7 +600,6 @@
     if (Options::numberOfGCMarkers() == 1) {
         // Put directly into the shared HashSet.
         m_heap.m_opaqueRoots.add(root);
-        m_heap.m_constraints.add(m_currentCell);
         return;
     }
     // Put into the local set, but merge with the shared one every once in
@@ -613,19 +606,8 @@
     // a while to make sure that the local sets don't grow too large.
     mergeOpaqueRootsIfProfitable();
     m_opaqueRoots.add(root);
-    m_constraints.add(m_currentCell);
 }
 
-void SlotVisitor::rescanAsConstraint()
-{
-    if (Options::numberOfGCMarkers() == 1) {
-        m_heap.m_constraints.add(m_currentCell);
-        return;
-    }
-    
-    m_constraints.add(m_currentCell);
-}
-
 bool SlotVisitor::containsOpaqueRoot(void* root) const
 {
     if (!root)
@@ -648,13 +630,13 @@
     return MixedTriState;
 }
 
-void SlotVisitor::mergeIfNecessary()
+void SlotVisitor::mergeOpaqueRootsIfNecessary()
 {
-    if (m_opaqueRoots.isEmpty() && m_constraints.isEmpty())
+    if (m_opaqueRoots.isEmpty())
         return;
-    mergeOpaqueRootsAndConstraints();
+    mergeOpaqueRoots();
 }
-
+    
 void SlotVisitor::mergeOpaqueRootsIfProfitable()
 {
     if (static_cast<unsigned>(m_opaqueRoots.size()) < Options::opaqueRootMergeThreshold())
@@ -687,19 +669,6 @@
     m_opaqueRoots.clear();
 }
 
-void SlotVisitor::mergeOpaqueRootsAndConstraints()
-{
-    {
-        std::lock_guard<Lock> lock(m_heap.m_opaqueRootsMutex);
-        for (const void* root : m_opaqueRoots)
-            m_heap.m_opaqueRoots.add(root);
-        for (JSCell* constraint : m_constraints)
-            m_heap.m_constraints.add(constraint);
-    }
-    m_opaqueRoots.clear();
-    m_constraints.clear();
-}
-
 void SlotVisitor::addWeakReferenceHarvester(WeakReferenceHarvester* weakReferenceHarvester)
 {
     m_heap.m_weakReferenceHarvesters.addThreadSafe(weakReferenceHarvester);

Modified: trunk/Source/_javascript_Core/heap/SlotVisitor.h (209811 => 209812)


--- trunk/Source/_javascript_Core/heap/SlotVisitor.h	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/_javascript_Core/heap/SlotVisitor.h	2016-12-14 17:50:20 UTC (rev 209812)
@@ -85,18 +85,7 @@
     void appendUnbarrieredReadOnlyPointer(T*);
     void appendUnbarrieredReadOnlyValue(JSValue);
     
-    void visitSubsequently(JSCell*);
-    
-    // Does your visitChildren do logic that depends on non-JS-object state that can
-    // change during the course of a GC, or in between GCs? Then you should call this
-    // method! It will cause the GC to invoke your visitChildren method again just before
-    // terminating with the world stopped.
-    JS_EXPORT_PRIVATE void rescanAsConstraint();
-    
-    // Implies rescanAsConstraint, so you don't have to call rescanAsConstraint() if you
-    // call this unconditionally.
     JS_EXPORT_PRIVATE void addOpaqueRoot(void*);
-    
     JS_EXPORT_PRIVATE bool containsOpaqueRoot(void*) const;
     TriState containsOpaqueRootTriState(void*) const;
 
@@ -119,8 +108,6 @@
 
     SharedDrainResult drainInParallel(MonotonicTime timeout = MonotonicTime::infinity());
     SharedDrainResult drainInParallelPassively(MonotonicTime timeout = MonotonicTime::infinity());
-    
-    void mergeIfNecessary();
 
     // This informs the GC about auxiliary of some size that we are keeping alive. If you don't do
     // this then the space will be freed at end of GC.
@@ -140,6 +127,8 @@
     
     HeapVersion markingVersion() const { return m_markingVersion; }
 
+    void mergeOpaqueRootsIfNecessary();
+    
     bool mutatorIsStopped() const { return m_mutatorIsStopped; }
     
     Lock& rightToRun() { return m_rightToRun; }
@@ -178,9 +167,7 @@
     
     void noteLiveAuxiliaryCell(HeapCell*);
     
-    void mergeOpaqueRoots();
-    void mergeOpaqueRootsAndConstraints();
-
+    JS_EXPORT_PRIVATE void mergeOpaqueRoots();
     void mergeOpaqueRootsIfProfitable();
 
     void visitChildren(const JSCell*);
@@ -194,7 +181,6 @@
     MarkStackArray m_collectorStack;
     MarkStackArray m_mutatorStack;
     OpaqueRootSet m_opaqueRoots; // Handle-owning data structures not visible to the garbage collector.
-    HashSet<JSCell*> m_constraints;
     
     size_t m_bytesVisited;
     size_t m_visitCount;
@@ -206,7 +192,7 @@
 
     HeapSnapshotBuilder* m_heapSnapshotBuilder { nullptr };
     JSCell* m_currentCell { nullptr };
-    bool m_isFirstVisit { false };
+    bool m_isVisitingMutatorStack { false };
     bool m_mutatorIsStopped { false };
     bool m_canOptimizeForStoppedMutator { false };
     Lock m_rightToRun;

Modified: trunk/Source/_javascript_Core/heap/SlotVisitorInlines.h (209811 => 209812)


--- trunk/Source/_javascript_Core/heap/SlotVisitorInlines.h	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/_javascript_Core/heap/SlotVisitorInlines.h	2016-12-14 17:50:20 UTC (rev 209812)
@@ -95,7 +95,7 @@
 
 inline void SlotVisitor::reportExtraMemoryVisited(size_t size)
 {
-    if (m_isFirstVisit)
+    if (!m_isVisitingMutatorStack)
         heap()->reportExtraMemoryVisited(size);
 }
 
@@ -102,7 +102,7 @@
 #if ENABLE(RESOURCE_USAGE)
 inline void SlotVisitor::reportExternalMemoryVisited(size_t size)
 {
-    if (m_isFirstVisit)
+    if (!m_isVisitingMutatorStack)
         heap()->reportExternalMemoryVisited(size);
 }
 #endif
@@ -127,7 +127,7 @@
     if (ASSERT_DISABLED)
         return;
     
-    if (m_isFirstVisit) {
+    if (!m_isVisitingMutatorStack) {
         // This is the first visit so we don't need to remove anything.
         return;
     }

Modified: trunk/Source/_javascript_Core/heap/WeakBlock.cpp (209811 => 209812)


--- trunk/Source/_javascript_Core/heap/WeakBlock.cpp	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/_javascript_Core/heap/WeakBlock.cpp	2016-12-14 17:50:20 UTC (rev 209812)
@@ -97,14 +97,13 @@
 }
 
 template<typename ContainerType>
-size_t WeakBlock::specializedVisit(ContainerType& container, HeapRootVisitor& heapRootVisitor)
+void WeakBlock::specializedVisit(ContainerType& container, HeapRootVisitor& heapRootVisitor)
 {
     SlotVisitor& visitor = heapRootVisitor.visitor();
     
     HeapVersion markingVersion = visitor.markingVersion();
 
-    size_t count = weakImplCount();
-    for (size_t i = 0; i < count; ++i) {
+    for (size_t i = 0; i < weakImplCount(); ++i) {
         WeakImpl* weakImpl = &weakImpls()[i];
         if (weakImpl->state() != WeakImpl::Live)
             continue;
@@ -122,22 +121,21 @@
 
         heapRootVisitor.visit(&const_cast<JSValue&>(jsValue));
     }
-    
-    return count;
 }
 
-size_t WeakBlock::visit(HeapRootVisitor& heapRootVisitor)
+void WeakBlock::visit(HeapRootVisitor& heapRootVisitor)
 {
     // If a block is completely empty, a visit won't have any effect.
     if (isEmpty())
-        return 0;
+        return;
 
     // If this WeakBlock doesn't belong to a CellContainer, we won't even be here.
     ASSERT(m_container);
     
     if (m_container.isLargeAllocation())
-        return specializedVisit(m_container.largeAllocation(), heapRootVisitor);
-    return specializedVisit(m_container.markedBlock(), heapRootVisitor);
+        specializedVisit(m_container.largeAllocation(), heapRootVisitor);
+    else
+        specializedVisit(m_container.markedBlock(), heapRootVisitor);
 }
 
 void WeakBlock::reap()

Modified: trunk/Source/_javascript_Core/heap/WeakBlock.h (209811 => 209812)


--- trunk/Source/_javascript_Core/heap/WeakBlock.h	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/_javascript_Core/heap/WeakBlock.h	2016-12-14 17:50:20 UTC (rev 209812)
@@ -63,7 +63,7 @@
     void sweep();
     SweepResult takeSweepResult();
 
-    size_t visit(HeapRootVisitor&);
+    void visit(HeapRootVisitor&);
     void reap();
 
     void lastChanceToFinalize();
@@ -73,7 +73,7 @@
     static FreeCell* asFreeCell(WeakImpl*);
     
     template<typename ContainerType>
-    size_t specializedVisit(ContainerType&, HeapRootVisitor&);
+    void specializedVisit(ContainerType&, HeapRootVisitor&);
 
     explicit WeakBlock(CellContainer);
     void finalize(WeakImpl*);

Modified: trunk/Source/_javascript_Core/heap/WeakSet.h (209811 => 209812)


--- trunk/Source/_javascript_Core/heap/WeakSet.h	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/_javascript_Core/heap/WeakSet.h	2016-12-14 17:50:20 UTC (rev 209812)
@@ -53,7 +53,7 @@
 
     bool isEmpty() const;
 
-    size_t visit(HeapRootVisitor&);
+    unsigned visit(HeapRootVisitor&);
     void reap();
     void sweep();
     void shrink();
@@ -106,11 +106,13 @@
         block->lastChanceToFinalize();
 }
 
-inline size_t WeakSet::visit(HeapRootVisitor& visitor)
+inline unsigned WeakSet::visit(HeapRootVisitor& visitor)
 {
-    size_t count = 0;
-    for (WeakBlock* block = m_blocks.head(); block; block = block->next())
-        count += block->visit(visitor);
+    unsigned count = 0;
+    for (WeakBlock* block = m_blocks.head(); block; block = block->next()) {
+        count++;
+        block->visit(visitor);
+    }
     return count;
 }
 

Modified: trunk/Source/WebCore/ChangeLog (209811 => 209812)


--- trunk/Source/WebCore/ChangeLog	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/WebCore/ChangeLog	2016-12-14 17:50:20 UTC (rev 209812)
@@ -1,3 +1,15 @@
+2016-12-14  Chris Dumez  <[email protected]>
+
+        Unreviewed, rolling out r209766.
+
+        Regressed Dromaeo JSLib by ~50%
+
+        Reverted changeset:
+
+        "Make opaque root scanning truly constraint-based"
+        https://bugs.webkit.org/show_bug.cgi?id=165760
+        http://trac.webkit.org/changeset/209766
+
 2016-12-14  Andy Estes  <[email protected]>
 
         EventDispatcher::dispatchEvent() should take its Node by reference

Modified: trunk/Source/WebCore/bindings/js/CommonVM.cpp (209811 => 209812)


--- trunk/Source/WebCore/bindings/js/CommonVM.cpp	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/WebCore/bindings/js/CommonVM.cpp	2016-12-14 17:50:20 UTC (rev 209812)
@@ -38,6 +38,7 @@
 namespace WebCore {
 
 VM* g_commonVMOrNull;
+bool g_opaqueRootWriteBarrierEnabled;
 
 VM& commonVMSlow()
 {
@@ -55,6 +56,7 @@
 #endif
     
     g_commonVMOrNull->setGlobalConstRedeclarationShouldThrow(Settings::globalConstRedeclarationShouldThrow());
+    g_commonVMOrNull->heap.addMutatorShouldBeFencedCache(g_opaqueRootWriteBarrierEnabled);
     
     initNormalWorldClientData(g_commonVMOrNull);
     
@@ -61,5 +63,11 @@
     return *g_commonVMOrNull;
 }
 
+void writeBarrierOpaqueRootSlow(void* root)
+{
+    if (VM* vm = g_commonVMOrNull)
+        vm->heap.writeBarrierOpaqueRoot(root);
+}
+
 } // namespace WebCore
 

Modified: trunk/Source/WebCore/bindings/js/CommonVM.h (209811 => 209812)


--- trunk/Source/WebCore/bindings/js/CommonVM.h	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/WebCore/bindings/js/CommonVM.h	2016-12-14 17:50:20 UTC (rev 209812)
@@ -32,8 +32,10 @@
 namespace WebCore {
 
 WEBCORE_EXPORT extern JSC::VM* g_commonVMOrNull;
+WEBCORE_EXPORT extern bool g_opaqueRootWriteBarrierEnabled;
 
 WEBCORE_EXPORT JSC::VM& commonVMSlow();
+WEBCORE_EXPORT void writeBarrierOpaqueRootSlow(void*);
 
 inline JSC::VM& commonVM()
 {
@@ -42,5 +44,12 @@
     return commonVMSlow();
 }
 
+template<typename Func>
+void writeBarrierOpaqueRoot(const Func& rootThunk)
+{
+    if (g_opaqueRootWriteBarrierEnabled)
+        writeBarrierOpaqueRootSlow(rootThunk());
+}
+
 } // namespace WebCore
 

Modified: trunk/Source/WebCore/bindings/js/JSAttrCustom.cpp (209811 => 209812)


--- trunk/Source/WebCore/bindings/js/JSAttrCustom.cpp	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/WebCore/bindings/js/JSAttrCustom.cpp	2016-12-14 17:50:20 UTC (rev 209812)
@@ -35,7 +35,6 @@
 
 void JSAttr::visitAdditionalChildren(JSC::SlotVisitor& visitor)
 {
-    visitor.rescanAsConstraint();
     if (Element* element = wrapped().ownerElement())
         visitor.addOpaqueRoot(root(element));
 }

Modified: trunk/Source/WebCore/bindings/js/JSDOMWindowCustom.cpp (209811 => 209812)


--- trunk/Source/WebCore/bindings/js/JSDOMWindowCustom.cpp	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/WebCore/bindings/js/JSDOMWindowCustom.cpp	2016-12-14 17:50:20 UTC (rev 209812)
@@ -51,7 +51,6 @@
 
 void JSDOMWindow::visitAdditionalChildren(SlotVisitor& visitor)
 {
-    visitor.rescanAsConstraint();
     if (Frame* frame = wrapped().frame())
         visitor.addOpaqueRoot(frame);
 }

Modified: trunk/Source/WebCore/bindings/js/JSIDBCursorCustom.cpp (209811 => 209812)


--- trunk/Source/WebCore/bindings/js/JSIDBCursorCustom.cpp	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/WebCore/bindings/js/JSIDBCursorCustom.cpp	2016-12-14 17:50:20 UTC (rev 209812)
@@ -39,7 +39,6 @@
 
 void JSIDBCursor::visitAdditionalChildren(SlotVisitor& visitor)
 {
-    visitor.rescanAsConstraint();
     auto& cursor = wrapped();
     if (auto* request = cursor.request())
         visitor.addOpaqueRoot(request);

Modified: trunk/Source/WebCore/bindings/js/JSMessageChannelCustom.cpp (209811 => 209812)


--- trunk/Source/WebCore/bindings/js/JSMessageChannelCustom.cpp	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/WebCore/bindings/js/JSMessageChannelCustom.cpp	2016-12-14 17:50:20 UTC (rev 209812)
@@ -35,8 +35,6 @@
 
 void JSMessageChannel::visitAdditionalChildren(JSC::SlotVisitor& visitor)
 {
-    visitor.rescanAsConstraint();
-    
     if (MessagePort* port = wrapped().port1())
         visitor.addOpaqueRoot(port);
 

Modified: trunk/Source/WebCore/bindings/js/JSMessagePortCustom.cpp (209811 => 209812)


--- trunk/Source/WebCore/bindings/js/JSMessagePortCustom.cpp	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/WebCore/bindings/js/JSMessagePortCustom.cpp	2016-12-14 17:50:20 UTC (rev 209812)
@@ -33,8 +33,6 @@
 
 void JSMessagePort::visitAdditionalChildren(SlotVisitor& visitor)
 {
-    visitor.rescanAsConstraint();
-    
     // If we have a locally entangled port, we can directly mark it as reachable. Ports that are remotely entangled are marked in-use by markActiveObjectsForContext().
     if (MessagePort* port = wrapped().locallyEntangledPort())
         visitor.addOpaqueRoot(port);

Modified: trunk/Source/WebCore/bindings/js/JSNodeIteratorCustom.cpp (209811 => 209812)


--- trunk/Source/WebCore/bindings/js/JSNodeIteratorCustom.cpp	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/WebCore/bindings/js/JSNodeIteratorCustom.cpp	2016-12-14 17:50:20 UTC (rev 209812)
@@ -27,8 +27,6 @@
 
 void JSNodeIterator::visitAdditionalChildren(JSC::SlotVisitor& visitor)
 {
-    visitor.rescanAsConstraint();
-    
     if (NodeFilter* filter = wrapped().filter())
         visitor.addOpaqueRoot(filter);
 }

Modified: trunk/Source/WebCore/bindings/js/JSTextTrackCueCustom.cpp (209811 => 209812)


--- trunk/Source/WebCore/bindings/js/JSTextTrackCueCustom.cpp	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/WebCore/bindings/js/JSTextTrackCueCustom.cpp	2016-12-14 17:50:20 UTC (rev 209812)
@@ -77,8 +77,6 @@
 
 void JSTextTrackCue::visitAdditionalChildren(SlotVisitor& visitor)
 {
-    visitor.rescanAsConstraint();
-    
     if (TextTrack* textTrack = wrapped().track())
         visitor.addOpaqueRoot(root(textTrack));
 }

Modified: trunk/Source/WebCore/bindings/js/JSTreeWalkerCustom.cpp (209811 => 209812)


--- trunk/Source/WebCore/bindings/js/JSTreeWalkerCustom.cpp	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/WebCore/bindings/js/JSTreeWalkerCustom.cpp	2016-12-14 17:50:20 UTC (rev 209812)
@@ -27,8 +27,6 @@
 
 void JSTreeWalker::visitAdditionalChildren(JSC::SlotVisitor& visitor)
 {
-    visitor.rescanAsConstraint();
-    
     if (NodeFilter* filter = wrapped().filter())
         visitor.addOpaqueRoot(filter);
 }

Modified: trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeCustom.cpp (209811 => 209812)


--- trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeCustom.cpp	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeCustom.cpp	2016-12-14 17:50:20 UTC (rev 209812)
@@ -36,8 +36,6 @@
 
 void JSWorkerGlobalScope::visitAdditionalChildren(SlotVisitor& visitor)
 {
-    visitor.rescanAsConstraint();
-    
     if (auto* location = wrapped().optionalLocation())
         visitor.addOpaqueRoot(location);
     if (auto* navigator = wrapped().optionalNavigator())

Modified: trunk/Source/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp (209811 => 209812)


--- trunk/Source/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp	2016-12-14 17:50:20 UTC (rev 209812)
@@ -58,8 +58,6 @@
 
 void JSXMLHttpRequest::visitAdditionalChildren(SlotVisitor& visitor)
 {
-    visitor.rescanAsConstraint();
-    
     if (XMLHttpRequestUpload* upload = wrapped().optionalUpload())
         visitor.addOpaqueRoot(upload);
 

Modified: trunk/Source/WebCore/bindings/js/JSXPathResultCustom.cpp (209811 => 209812)


--- trunk/Source/WebCore/bindings/js/JSXPathResultCustom.cpp	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/WebCore/bindings/js/JSXPathResultCustom.cpp	2016-12-14 17:50:20 UTC (rev 209812)
@@ -33,8 +33,6 @@
 
 void JSXPathResult::visitAdditionalChildren(JSC::SlotVisitor& visitor)
 {
-    visitor.rescanAsConstraint();
-    
     auto& value = wrapped().value();
     if (value.isNodeSet()) {
         // FIXME: This looks like it might race, but I'm not sure.

Modified: trunk/Source/WebCore/dom/ContainerNodeAlgorithms.cpp (209811 => 209812)


--- trunk/Source/WebCore/dom/ContainerNodeAlgorithms.cpp	2016-12-14 17:41:28 UTC (rev 209811)
+++ trunk/Source/WebCore/dom/ContainerNodeAlgorithms.cpp	2016-12-14 17:50:20 UTC (rev 209812)
@@ -26,6 +26,7 @@
 #include "config.h"
 #include "ContainerNodeAlgorithms.h"
 
+#include "CommonVM.h"
 #include "HTMLFrameOwnerElement.h"
 #include "InspectorInstrumentation.h"
 #include "NoEventDispatchAssertion.h"
@@ -101,6 +102,8 @@
         notifyNodeInsertedIntoDocument(insertionPoint, node, postInsertionNotificationTargets);
     else if (is<ContainerNode>(node))
         notifyNodeInsertedIntoTree(insertionPoint, downcast<ContainerNode>(node), postInsertionNotificationTargets);
+
+    writeBarrierOpaqueRoot([&insertionPoint] () -> void* { return insertionPoint.opaqueRoot(); });
 }
 
 void notifyNodeRemovedFromDocument(ContainerNode& insertionPoint, Node& node)
@@ -152,6 +155,8 @@
 
 void notifyChildNodeRemoved(ContainerNode& insertionPoint, Node& child)
 {
+    writeBarrierOpaqueRoot([&child] () -> void* { return &child; });
+
     if (!child.inDocument()) {
         if (is<ContainerNode>(child))
             notifyNodeRemovedFromTree(insertionPoint, downcast<ContainerNode>(child));
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to