Commit 218a16a3 authored by ggaren@apple.com's avatar ggaren@apple.com

Unreviewed, rolling back in part1 of r118646.

This patch includes everything necessary for lazy finalization, but
keeps eager finalization enabled for the time being.

Weak pointer finalization should be lazy
https://bugs.webkit.org/show_bug.cgi?id=87599

Reviewed by Sam Weinig.

* heap/MarkedBlock.cpp:
* heap/MarkedBlock.h:
(JSC::MarkedBlock::resetAllocator):
* heap/MarkedSpace.cpp:
(JSC::MarkedSpace::resetAllocators):
* heap/MarkedSpace.h:
(JSC::MarkedSpace::resetAllocators): Don't force allocator reset anymore.
It will happen automatically when a weak set is swept. It's simpler to
have only one canonical way for this to happen, and it wasn't buying
us anything to do it eagerly.
* heap/WeakBlock.cpp:
(JSC::WeakBlock::sweep): Don't short-circuit a sweep unless we know
the sweep would be a no-op. If even one finalizer is pending, we need to
run it, since we won't get another chance.
* heap/WeakSet.cpp:
(JSC::WeakSet::sweep): This loop can be simpler now that
WeakBlock::sweep() does what we mean.
Reset our allocator after a sweep because this is the optimal time to
start trying to recycle old weak pointers.
(JSC::WeakSet::tryFindAllocator): Don't sweep when searching for an
allocator because we've swept already, and forcing a new sweep would be
wasteful.
* heap/WeakSet.h:
(JSC::WeakSet::shrink): Be sure to reset our allocator after a shrink
because the shrink may have removed the block the allocator was going to
allocate out of.



git-svn-id: http://svn.webkit.org/repository/webkit/trunk@119878 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent d6c0df08
2012-06-02 Geoffrey Garen <ggaren@apple.com>
Unreviewed, rolling back in part1 of r118646.
This patch includes everything necessary for lazy finalization, but
keeps eager finalization enabled for the time being.
Weak pointer finalization should be lazy
https://bugs.webkit.org/show_bug.cgi?id=87599
Reviewed by Sam Weinig.
* heap/MarkedBlock.cpp:
* heap/MarkedBlock.h:
(JSC::MarkedBlock::resetAllocator):
* heap/MarkedSpace.cpp:
(JSC::MarkedSpace::resetAllocators):
* heap/MarkedSpace.h:
(JSC::MarkedSpace::resetAllocators): Don't force allocator reset anymore.
It will happen automatically when a weak set is swept. It's simpler to
have only one canonical way for this to happen, and it wasn't buying
us anything to do it eagerly.
* heap/WeakBlock.cpp:
(JSC::WeakBlock::sweep): Don't short-circuit a sweep unless we know
the sweep would be a no-op. If even one finalizer is pending, we need to
run it, since we won't get another chance.
* heap/WeakSet.cpp:
(JSC::WeakSet::sweep): This loop can be simpler now that
WeakBlock::sweep() does what we mean.
Reset our allocator after a sweep because this is the optimal time to
start trying to recycle old weak pointers.
(JSC::WeakSet::tryFindAllocator): Don't sweep when searching for an
allocator because we've swept already, and forcing a new sweep would be
wasteful.
* heap/WeakSet.h:
(JSC::WeakSet::shrink): Be sure to reset our allocator after a shrink
because the shrink may have removed the block the allocator was going to
allocate out of.
2012-06-08 Gavin Barraclough <barraclough@apple.com>
Unreviewed roll out r119795.
......
......@@ -129,7 +129,6 @@ namespace JSC {
FreeList sweep(SweepMode = SweepOnly);
void shrink();
void resetAllocator();
void visitWeakSet(HeapRootVisitor&);
void reapWeakSet();
......@@ -274,11 +273,6 @@ namespace JSC {
m_weakSet.shrink();
}
inline void MarkedBlock::resetAllocator()
{
m_weakSet.resetAllocator();
}
inline void MarkedBlock::visitWeakSet(HeapRootVisitor& heapRootVisitor)
{
m_weakSet.visit(heapRootVisitor);
......
......@@ -112,10 +112,6 @@ void MarkedSpace::lastChanceToFinalize()
forEachBlock<LastChanceToFinalize>();
}
struct ResetAllocator : MarkedBlock::VoidFunctor {
void operator()(MarkedBlock* block) { block->resetAllocator(); }
};
void MarkedSpace::resetAllocators()
{
for (size_t cellSize = preciseStep; cellSize <= preciseCutoff; cellSize += preciseStep) {
......@@ -127,8 +123,6 @@ void MarkedSpace::resetAllocators()
allocatorFor(cellSize).reset();
destructorAllocatorFor(cellSize).reset();
}
forEachBlock<ResetAllocator>();
}
void MarkedSpace::visitWeakSets(HeapRootVisitor& heapRootVisitor)
......
......@@ -69,7 +69,8 @@ void WeakBlock::lastChanceToFinalize()
void WeakBlock::sweep()
{
if (!m_sweepResult.isNull())
// If a block is completely empty, a sweep won't have any effect.
if (isEmpty())
return;
SweepResult sweepResult;
......
......@@ -42,17 +42,10 @@ WeakSet::~WeakSet()
void WeakSet::sweep()
{
WeakBlock* next;
for (WeakBlock* block = m_blocks.head(); block; block = next) {
next = block->next();
// If a block is completely empty, a new sweep won't have any effect.
if (block->isEmpty())
continue;
block->takeSweepResult(); // Force a new sweep by discarding the last sweep.
for (WeakBlock* block = m_blocks.head(); block; block = block->next())
block->sweep();
}
resetAllocator();
}
WeakBlock::FreeCell* WeakSet::findAllocator()
......@@ -69,7 +62,6 @@ WeakBlock::FreeCell* WeakSet::tryFindAllocator()
WeakBlock* block = m_nextAllocator;
m_nextAllocator = m_nextAllocator->next();
block->sweep();
WeakBlock::SweepResult sweepResult = block->takeSweepResult();
if (sweepResult.freeList)
return sweepResult.freeList;
......
......@@ -118,6 +118,8 @@ inline void WeakSet::shrink()
if (block->isEmpty())
removeAllocator(block);
}
resetAllocator();
}
inline void WeakSet::resetAllocator()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment