⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 100242 in webkit


Ignore:
Timestamp:
Nov 14, 2011, 10:58:19 PM (15 years ago)
Author:
fpizlo@apple.com
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):

Location:
trunk/Source/JavaScriptCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r100227 r100242  
     12011-11-14  Filip Pizlo  <fpizlo@apple.com>
     2
     3        Weak reference harvesters should run to fixpoint
     4        https://bugs.webkit.org/show_bug.cgi?id=72346
     5
     6        Reviewed by Oliver Hunt.
     7
     8        * heap/Heap.cpp:
     9        (JSC::Heap::markRoots):
     10        * heap/ListableHandler.h:
     11        (JSC::ListableHandler::next):
     12        (JSC::ListableHandler::List::head):
     13        (JSC::ListableHandler::List::removeNext):
     14        (JSC::ListableHandler::List::removeAll):
     15        * heap/MarkStack.cpp:
     16        (JSC::MarkStackThreadSharedData::reset):
     17        (JSC::SlotVisitor::harvestWeakReferences):
     18        * heap/MarkStack.h:
     19        (JSC::MarkStack::isEmpty):
     20
    1212011-11-14  Oliver Hunt  <oliver@apple.com>
    222
  • trunk/Source/JavaScriptCore/heap/Heap.cpp

    r99898 r100242  
    685685    {
    686686        GCPHASE(VisitingWeakHandles);
    687         int lastOpaqueRootCount;
    688         do {
    689             lastOpaqueRootCount = visitor.opaqueRootCount();
     687        while (true) {
    690688            m_handleHeap.visitWeakHandles(heapRootVisitor);
     689            harvestWeakReferences();
     690            if (visitor.isEmpty())
     691                break;
    691692            {
    692693                ParallelModeEnabler enabler(visitor);
     
    696697#endif
    697698            }
    698             // If the set of opaque roots has grown, more weak handles may have become reachable.
    699         } while (lastOpaqueRootCount != visitor.opaqueRootCount());
     699        }
    700700    }
    701701    GCCOUNTER(VisitedValueCount, visitor.visitCount());
    702 
    703     {
    704         GCPHASE(HarvestWeakReferences);
    705         harvestWeakReferences();
    706     }
    707702
    708703    visitor.reset();
  • trunk/Source/JavaScriptCore/heap/ListableHandler.h

    r99898 r100242  
    4343   
    4444    virtual ~ListableHandler() { }
     45   
     46    T* next() const
     47    {
     48        return reinterpret_cast<T*>(m_nextAndFlag & ~1);
     49    }
    4550
    4651private:
     
    7378        }
    7479       
     80        T* head()
     81        {
     82            return m_first;
     83        }
     84       
    7585        T* removeNext()
    7686        {
    7787            T* current = m_first;
    78             T* next = reinterpret_cast<T*>(current->m_nextAndFlag & ~1);
     88            T* next = current->next();
    7989            current->m_nextAndFlag = 0;
    8090            m_first = next;
    8191            return current;
     92        }
     93       
     94        void removeAll()
     95        {
     96            while (hasNext())
     97                removeNext();
    8298        }
    8399       
  • trunk/Source/JavaScriptCore/heap/MarkStack.cpp

    r99898 r100242  
    272272    ASSERT(m_opaqueRoots.isEmpty());
    273273#endif
     274   
     275    m_weakReferenceHarvesters.removeAll();
    274276}
    275277
     
    450452void SlotVisitor::harvestWeakReferences()
    451453{
    452     while (m_shared.m_weakReferenceHarvesters.hasNext())
    453         m_shared.m_weakReferenceHarvesters.removeNext()->visitWeakReferences(*this);
     454    for (WeakReferenceHarvester* current = m_shared.m_weakReferenceHarvesters.head(); current; current = current->next())
     455        current->visitWeakReferences(*this);
    454456}
    455457
  • trunk/Source/JavaScriptCore/heap/MarkStack.h

    r99898 r100242  
    220220        bool containsOpaqueRoot(void*);
    221221        int opaqueRootCount();
     222       
     223        bool isEmpty() { return m_stack.isEmpty(); }
    222224
    223225        void reset();
Note: See TracChangeset for help on using the changeset viewer.