2012-05-17 Geoffrey Garen <ggaren@apple.com>
+ Refactored the Heap to move more MarkedSpace logic into MarkedSpace
+ https://bugs.webkit.org/show_bug.cgi?id=86790
+
+ Reviewed by Gavin Barraclough.
+
+ * heap/Heap.cpp:
+ (JSC::Heap::lastChanceToFinalize):
+ (JSC::Heap::markRoots):
+ (JSC):
+ (JSC::Heap::objectCount):
+ (JSC::Heap::size):
+ (JSC::Heap::capacity):
+ (JSC::Heap::collect):
+ * heap/Heap.h:
+ (Heap): Took all the functors from here...
+
+ * heap/MarkedBlock.h:
+ (CountFunctor):
+ (JSC::MarkedBlock::CountFunctor::CountFunctor):
+ (JSC::MarkedBlock::CountFunctor::count):
+ (JSC::MarkedBlock::CountFunctor::returnValue):
+ (MarkedBlock):
+ * heap/MarkedSpace.h:
+ (JSC::ClearMarks::operator()):
+ (JSC):
+ (JSC::Sweep::operator()):
+ (JSC::MarkCount::operator()):
+ (JSC::Size::operator()):
+ (JSC::Capacity::operator()):
+ (MarkedSpace):
+ (JSC::MarkedSpace::clearMarks):
+ (JSC::MarkedSpace::sweep):
+ (JSC::MarkedSpace::objectCount):
+ (JSC::MarkedSpace::size):
+ (JSC::MarkedSpace::capacity): and put them here.
+
+2012-05-17 Geoffrey Garen <ggaren@apple.com>
+
Increase the GC allocation trigger
https://bugs.webkit.org/show_bug.cgi?id=86699
return true;
}
-class CountFunctor {
-public:
- typedef size_t ReturnType;
-
- CountFunctor();
- void count(size_t);
- ReturnType returnValue();
-
-private:
- ReturnType m_count;
-};
-
-inline CountFunctor::CountFunctor()
- : m_count(0)
-{
-}
-
-inline void CountFunctor::count(size_t count)
-{
- m_count += count;
-}
-
-inline CountFunctor::ReturnType CountFunctor::returnValue()
-{
- return m_count;
-}
-
-struct ClearMarks : MarkedBlock::VoidFunctor {
- void operator()(MarkedBlock*);
-};
-
-inline void ClearMarks::operator()(MarkedBlock* block)
-{
- block->clearMarks();
-}
-
-struct Sweep : MarkedBlock::VoidFunctor {
- void operator()(MarkedBlock*);
-};
-
-inline void Sweep::operator()(MarkedBlock* block)
-{
- block->sweep();
-}
-
-struct MarkCount : CountFunctor {
- void operator()(MarkedBlock*);
-};
-
-inline void MarkCount::operator()(MarkedBlock* block)
-{
- count(block->markCount());
-}
-
-struct Size : CountFunctor {
- void operator()(MarkedBlock*);
-};
-
-inline void Size::operator()(MarkedBlock* block)
-{
- count(block->markCount() * block->cellSize());
-}
-
-struct Capacity : CountFunctor {
- void operator()(MarkedBlock*);
-};
-
-inline void Capacity::operator()(MarkedBlock* block)
-{
- count(block->capacity());
-}
-
-struct Count : public CountFunctor {
- void operator()(JSCell*);
+struct Count : public MarkedBlock::CountFunctor {
+ void operator()(JSCell*) { count(1); }
};
-inline void Count::operator()(JSCell*)
-{
- count(1);
-}
-
-struct CountIfGlobalObject : CountFunctor {
- void operator()(JSCell*);
+struct CountIfGlobalObject : MarkedBlock::CountFunctor {
+ void operator()(JSCell* cell) {
+ if (!cell->isObject())
+ return;
+ if (!asObject(cell)->isGlobalObject())
+ return;
+ count(1);
+ }
};
-inline void CountIfGlobalObject::operator()(JSCell* cell)
-{
- if (!cell->isObject())
- return;
- if (!asObject(cell)->isGlobalObject())
- return;
- count(1);
-}
-
class RecordType {
public:
typedef PassOwnPtr<TypeCountSet> ReturnType;
WTFLogAlways("ERROR: JavaScriptCore heap deallocated while %ld values were still protected", static_cast<unsigned long>(size));
m_weakSet.finalizeAll();
- canonicalizeCellLivenessData();
- clearMarks();
- sweep();
+ m_objectSpace.canonicalizeCellLivenessData();
+ m_objectSpace.clearMarks();
+ m_objectSpace.sweep();
m_globalData->smallStrings.finalizeSmallStrings();
#if ENABLE(SIMPLE_HEAP_PROFILING)
#endif
{
GCPHASE(clearMarks);
- clearMarks();
+ m_objectSpace.clearMarks();
}
m_storageSpace.startedCopying();
m_operationInProgress = NoOperation;
}
-void Heap::clearMarks()
-{
- m_objectSpace.forEachBlock<ClearMarks>();
-}
-
-void Heap::sweep()
-{
- m_objectSpace.forEachBlock<Sweep>();
-}
-
size_t Heap::objectCount()
{
- return m_objectSpace.forEachBlock<MarkCount>();
+ return m_objectSpace.objectCount();
}
size_t Heap::size()
{
- return m_objectSpace.forEachBlock<Size>() + m_storageSpace.size();
+ return m_objectSpace.size() + m_storageSpace.size();
}
size_t Heap::capacity()
{
- return m_objectSpace.forEachBlock<Capacity>() + m_storageSpace.capacity();
+ return m_objectSpace.capacity() + m_storageSpace.capacity();
}
size_t Heap::protectedGlobalObjectCount()
#endif
{
GCPHASE(Canonicalize);
- canonicalizeCellLivenessData();
+ m_objectSpace.canonicalizeCellLivenessData();
}
markRoots(fullGC);
JAVASCRIPTCORE_GC_MARKED();
{
- GCPHASE(ResetAllocator);
- resetAllocators();
+ GCPHASE(ResetAllocators);
+ m_objectSpace.resetAllocators();
+ m_weakSet.resetAllocator();
}
{
if (sweepToggle == DoSweep) {
SamplingRegion samplingRegion("Garbage Collection: Sweeping");
GCPHASE(Sweeping);
- sweep();
+ m_objectSpace.sweep();
m_objectSpace.shrink();
m_weakSet.shrink();
m_bytesAbandoned = 0;
JAVASCRIPTCORE_GC_END();
}
-void Heap::canonicalizeCellLivenessData()
-{
- m_objectSpace.canonicalizeCellLivenessData();
-}
-
-void Heap::resetAllocators()
-{
- m_objectSpace.resetAllocators();
- m_weakSet.resetAllocator();
-}
-
void Heap::setActivityCallback(PassOwnPtr<GCActivityCallback> activityCallback)
{
m_activityCallback = activityCallback;
JS_EXPORT_PRIVATE bool isValidAllocation(size_t);
JS_EXPORT_PRIVATE void reportExtraMemoryCostSlowCase(size_t);
- // Call this function before any operation that needs to know which cells
- // in the heap are live. (For example, call this function before
- // conservative marking, eager sweeping, or iterating the cells in a MarkedBlock.)
- void canonicalizeCellLivenessData();
-
- void resetAllocators();
-
- void clearMarks();
void markRoots(bool fullGC);
void markProtectedObjects(HeapRootVisitor&);
void markTempSortVectors(HeapRootVisitor&);
void harvestWeakReferences();
void finalizeUnconditionalFinalizers();
- void sweep();
-
RegisterFile& registerFile();
BlockAllocator& blockAllocator();
class WeakGCHandle;
class SlotVisitor;
+struct ClearMarks : MarkedBlock::VoidFunctor {
+ void operator()(MarkedBlock* block) { block->clearMarks(); }
+};
+
+struct Sweep : MarkedBlock::VoidFunctor {
+ void operator()(MarkedBlock* block) { block->sweep(); }
+};
+
+struct MarkCount : MarkedBlock::CountFunctor {
+ void operator()(MarkedBlock* block) { count(block->markCount()); }
+};
+
+struct Size : MarkedBlock::CountFunctor {
+ void operator()(MarkedBlock* block) { count(block->markCount() * block->cellSize()); }
+};
+
+struct Capacity : MarkedBlock::CountFunctor {
+ void operator()(MarkedBlock* block) { count(block->capacity()); }
+};
+
class MarkedSpace {
WTF_MAKE_NONCOPYABLE(MarkedSpace);
public:
template<typename Functor> typename Functor::ReturnType forEachBlock();
void shrink();
+ void freeAllBlocks();
void freeBlocks(MarkedBlock* head);
void didAddBlock(MarkedBlock*);
void didConsumeFreeList(MarkedBlock*);
+ void clearMarks();
+ void sweep();
+ size_t objectCount();
+ size_t size();
+ size_t capacity();
+
bool isPagedOut(double deadline);
private:
m_blocks.add(block);
}
+inline void MarkedSpace::clearMarks()
+{
+ forEachBlock<ClearMarks>();
+}
+
+inline void MarkedSpace::sweep()
+{
+ forEachBlock<Sweep>();
+}
+
+inline size_t MarkedSpace::objectCount()
+{
+ return forEachBlock<MarkCount>();
+}
+
+inline size_t MarkedSpace::size()
+{
+ return forEachBlock<Size>();
+}
+
+inline size_t MarkedSpace::capacity()
+{
+ return forEachBlock<Capacity>();
+}
+
} // namespace JSC
#endif // MarkedSpace_h