Title: [100242] trunk/Source/_javascript_Core
Revision
100242
Author
[email protected]
Date
2011-11-14 22:58:19 -0800 (Mon, 14 Nov 2011)

Log Message

Weak reference harvesters should run to fixpoint
https://bugs.webkit.org/show_bug.cgi?id=72346

Reviewed by Oliver Hunt.

* heap/Heap.cpp:
(JSC::Heap::markRoots):
* heap/ListableHandler.h:
(JSC::ListableHandler::next):
(JSC::ListableHandler::List::head):
(JSC::ListableHandler::List::removeNext):
(JSC::ListableHandler::List::removeAll):
* heap/MarkStack.cpp:
(JSC::MarkStackThreadSharedData::reset):
(JSC::SlotVisitor::harvestWeakReferences):
* heap/MarkStack.h:
(JSC::MarkStack::isEmpty):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (100241 => 100242)


--- trunk/Source/_javascript_Core/ChangeLog	2011-11-15 06:43:01 UTC (rev 100241)
+++ trunk/Source/_javascript_Core/ChangeLog	2011-11-15 06:58:19 UTC (rev 100242)
@@ -1,3 +1,23 @@
+2011-11-14  Filip Pizlo  <[email protected]>
+
+        Weak reference harvesters should run to fixpoint
+        https://bugs.webkit.org/show_bug.cgi?id=72346
+
+        Reviewed by Oliver Hunt.
+
+        * heap/Heap.cpp:
+        (JSC::Heap::markRoots):
+        * heap/ListableHandler.h:
+        (JSC::ListableHandler::next):
+        (JSC::ListableHandler::List::head):
+        (JSC::ListableHandler::List::removeNext):
+        (JSC::ListableHandler::List::removeAll):
+        * heap/MarkStack.cpp:
+        (JSC::MarkStackThreadSharedData::reset):
+        (JSC::SlotVisitor::harvestWeakReferences):
+        * heap/MarkStack.h:
+        (JSC::MarkStack::isEmpty):
+
 2011-11-14  Oliver Hunt  <[email protected]>
 
         Start migrating typed array impl types to WTF

Modified: trunk/Source/_javascript_Core/heap/Heap.cpp (100241 => 100242)


--- trunk/Source/_javascript_Core/heap/Heap.cpp	2011-11-15 06:43:01 UTC (rev 100241)
+++ trunk/Source/_javascript_Core/heap/Heap.cpp	2011-11-15 06:58:19 UTC (rev 100242)
@@ -684,10 +684,11 @@
     // opaque roots to determine reachability.
     {
         GCPHASE(VisitingWeakHandles);
-        int lastOpaqueRootCount;
-        do {
-            lastOpaqueRootCount = visitor.opaqueRootCount();
+        while (true) {
             m_handleHeap.visitWeakHandles(heapRootVisitor);
+            harvestWeakReferences();
+            if (visitor.isEmpty())
+                break;
             {
                 ParallelModeEnabler enabler(visitor);
                 visitor.donateAndDrain();
@@ -695,16 +696,10 @@
                 visitor.drainFromShared(SlotVisitor::MasterDrain);
 #endif
             }
-            // If the set of opaque roots has grown, more weak handles may have become reachable.
-        } while (lastOpaqueRootCount != visitor.opaqueRootCount());
+        }
     }
     GCCOUNTER(VisitedValueCount, visitor.visitCount());
 
-    {
-        GCPHASE(HarvestWeakReferences);
-        harvestWeakReferences();
-    }
-
     visitor.reset();
     m_sharedData.reset();
 

Modified: trunk/Source/_javascript_Core/heap/ListableHandler.h (100241 => 100242)


--- trunk/Source/_javascript_Core/heap/ListableHandler.h	2011-11-15 06:43:01 UTC (rev 100241)
+++ trunk/Source/_javascript_Core/heap/ListableHandler.h	2011-11-15 06:58:19 UTC (rev 100242)
@@ -42,6 +42,11 @@
     }
     
     virtual ~ListableHandler() { }
+    
+    T* next() const
+    {
+        return reinterpret_cast<T*>(m_nextAndFlag & ~1);
+    }
 
 private:
     // Allow these classes to use ListableHandler::List.
@@ -72,15 +77,26 @@
             return !!m_first;
         }
         
+        T* head()
+        {
+            return m_first;
+        }
+        
         T* removeNext()
         {
             T* current = m_first;
-            T* next = reinterpret_cast<T*>(current->m_nextAndFlag & ~1);
+            T* next = current->next();
             current->m_nextAndFlag = 0;
             m_first = next;
             return current;
         }
         
+        void removeAll()
+        {
+            while (hasNext())
+                removeNext();
+        }
+        
     private:
         void addNotThreadSafe(T* handler)
         {

Modified: trunk/Source/_javascript_Core/heap/MarkStack.cpp (100241 => 100242)


--- trunk/Source/_javascript_Core/heap/MarkStack.cpp	2011-11-15 06:43:01 UTC (rev 100241)
+++ trunk/Source/_javascript_Core/heap/MarkStack.cpp	2011-11-15 06:58:19 UTC (rev 100242)
@@ -271,6 +271,8 @@
 #else
     ASSERT(m_opaqueRoots.isEmpty());
 #endif
+    
+    m_weakReferenceHarvesters.removeAll();
 }
 
 void MarkStack::reset()
@@ -449,8 +451,8 @@
 
 void SlotVisitor::harvestWeakReferences()
 {
-    while (m_shared.m_weakReferenceHarvesters.hasNext())
-        m_shared.m_weakReferenceHarvesters.removeNext()->visitWeakReferences(*this);
+    for (WeakReferenceHarvester* current = m_shared.m_weakReferenceHarvesters.head(); current; current = current->next())
+        current->visitWeakReferences(*this);
 }
 
 void SlotVisitor::finalizeUnconditionalFinalizers()

Modified: trunk/Source/_javascript_Core/heap/MarkStack.h (100241 => 100242)


--- trunk/Source/_javascript_Core/heap/MarkStack.h	2011-11-15 06:43:01 UTC (rev 100241)
+++ trunk/Source/_javascript_Core/heap/MarkStack.h	2011-11-15 06:58:19 UTC (rev 100242)
@@ -219,6 +219,8 @@
         void addOpaqueRoot(void*);
         bool containsOpaqueRoot(void*);
         int opaqueRootCount();
+        
+        bool isEmpty() { return m_stack.isEmpty(); }
 
         void reset();
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to