diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-05-18 14:03:11 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-05-18 14:03:11 +0200 |
commit | 8d473cf9743f1d30a16a27114e93bd5af5648d23 (patch) | |
tree | cdca40d0353886b3ca52f33a2d7b8f1c0011aafc /Source/JavaScriptCore/heap/Heap.cpp | |
parent | 1b914638db989aaa98631a1c1e02c7b2d44805d8 (diff) | |
download | qtwebkit-8d473cf9743f1d30a16a27114e93bd5af5648d23.tar.gz |
Imported WebKit commit 1350e72f7345ced9da2bd9980deeeb5a8d62fab4 (http://svn.webkit.org/repository/webkit/trunk@117578)
Weekly snapshot
Diffstat (limited to 'Source/JavaScriptCore/heap/Heap.cpp')
-rw-r--r-- | Source/JavaScriptCore/heap/Heap.cpp | 152 |
1 files changed, 27 insertions, 125 deletions
diff --git a/Source/JavaScriptCore/heap/Heap.cpp b/Source/JavaScriptCore/heap/Heap.cpp index d43ec1242..2254b5b01 100644 --- a/Source/JavaScriptCore/heap/Heap.cpp +++ b/Source/JavaScriptCore/heap/Heap.cpp @@ -178,100 +178,20 @@ static inline bool isValidThreadState(JSGlobalData* globalData) 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*); +struct Count : public MarkedBlock::CountFunctor { + void operator()(JSCell*) { count(1); } }; -inline void Capacity::operator()(MarkedBlock* block) -{ - count(block->capacity()); -} - -struct Count : public CountFunctor { - void operator()(JSCell*); -}; - -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; @@ -363,9 +283,9 @@ void Heap::lastChanceToFinalize() 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) @@ -540,7 +460,7 @@ void Heap::markRoots(bool fullGC) #endif { GCPHASE(clearMarks); - clearMarks(); + m_objectSpace.clearMarks(); } m_storageSpace.startedCopying(); @@ -656,37 +576,24 @@ void Heap::markRoots(bool fullGC) visitor.doneCopying(); visitor.reset(); m_sharedData.reset(); -#if ENABLE(PARALLEL_GC) - m_sharedData.resetChildren(); -#endif m_storageSpace.doneCopying(); 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() @@ -761,7 +668,7 @@ void Heap::collect(SweepToggle sweepToggle) #endif { GCPHASE(Canonicalize); - canonicalizeCellLivenessData(); + m_objectSpace.canonicalizeCellLivenessData(); } markRoots(fullGC); @@ -780,8 +687,9 @@ void Heap::collect(SweepToggle sweepToggle) JAVASCRIPTCORE_GC_MARKED(); { - GCPHASE(ResetAllocator); - resetAllocators(); + GCPHASE(ResetAllocators); + m_objectSpace.resetAllocators(); + m_weakSet.resetAllocator(); } { @@ -792,7 +700,7 @@ void Heap::collect(SweepToggle sweepToggle) if (sweepToggle == DoSweep) { SamplingRegion samplingRegion("Garbage Collection: Sweeping"); GCPHASE(Sweeping); - sweep(); + m_objectSpace.sweep(); m_objectSpace.shrink(); m_weakSet.shrink(); m_bytesAbandoned = 0; @@ -814,17 +722,6 @@ void Heap::collect(SweepToggle sweepToggle) 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; @@ -835,6 +732,11 @@ GCActivityCallback* Heap::activityCallback() return m_activityCallback.get(); } +void Heap::setGarbageCollectionTimerEnabled(bool enable) +{ + activityCallback()->setEnabled(enable); +} + void Heap::didAllocate(size_t bytes) { m_activityCallback->didAllocate(m_bytesAllocated + m_bytesAbandoned); |