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