/* * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) * Copyright (C) 2001 Peter Kelly (pmk@post.com) * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ #ifndef Heap_h #define Heap_h #include "HandleHeap.h" #include "HandleStack.h" #include "MarkStack.h" #include "MarkedSpace.h" #include #include #include namespace JSC { class GCActivityCallback; class GlobalCodeBlock; class HeapRootMarker; class JSCell; class JSGlobalData; class JSValue; class LiveObjectIterator; class MarkStack; class MarkedArgumentBuffer; class RegisterFile; class UString; class WeakGCHandlePool; typedef std::pair ValueStringPair; typedef HashCountedSet ProtectCountSet; typedef HashCountedSet TypeCountSet; enum OperationInProgress { NoOperation, Allocation, Collection }; class Heap { WTF_MAKE_NONCOPYABLE(Heap); public: static Heap* heap(JSValue); // 0 for immediate values static Heap* heap(JSCell*); static bool isMarked(const JSCell*); static bool testAndSetMarked(const JSCell*); static void setMarked(JSCell*); Heap(JSGlobalData*); ~Heap(); void destroy(); // JSGlobalData must call destroy() before ~Heap(). JSGlobalData* globalData() const { return m_globalData; } MarkedSpace& markedSpace() { return m_markedSpace; } MachineThreads& machineThreads() { return m_machineThreads; } GCActivityCallback* activityCallback(); void setActivityCallback(PassOwnPtr); bool isBusy(); // true if an allocation or collection is in progress void* allocate(size_t); void collectAllGarbage(); void reportExtraMemoryCost(size_t cost); void protect(JSValue); bool unprotect(JSValue); // True when the protect count drops to 0. bool contains(void*); size_t size() const; size_t capacity() const; size_t objectCount() const; size_t globalObjectCount(); size_t protectedObjectCount(); size_t protectedGlobalObjectCount(); PassOwnPtr protectedObjectTypeCounts(); PassOwnPtr objectTypeCounts(); void pushTempSortVector(Vector*); void popTempSortVector(Vector*); HashSet& markListSet() { if (!m_markListSet) m_markListSet = new HashSet; return *m_markListSet; } template void forEach(Functor&); HandleSlot allocateGlobalHandle() { return m_handleHeap.allocate(); } HandleSlot allocateLocalHandle() { return m_handleStack.push(); } HandleStack* handleStack() { return &m_handleStack; } private: friend class JSGlobalData; static const size_t minExtraCost = 256; static const size_t maxExtraCost = 1024 * 1024; void* allocateSlowCase(size_t); void reportExtraMemoryCostSlowCase(size_t); void markRoots(); void markProtectedObjects(HeapRootMarker&); void markTempSortVectors(HeapRootMarker&); enum SweepToggle { DoNotSweep, DoSweep }; void reset(SweepToggle); RegisterFile& registerFile(); OperationInProgress m_operationInProgress; MarkedSpace m_markedSpace; ProtectCountSet m_protectedValues; Vector* > m_tempSortingVectors; HashSet* m_markListSet; OwnPtr m_activityCallback; JSGlobalData* m_globalData; MachineThreads m_machineThreads; MarkStack m_markStack; HandleHeap m_handleHeap; HandleStack m_handleStack; size_t m_extraCost; }; inline bool Heap::isMarked(const JSCell* cell) { return MarkedSpace::isMarked(cell); } inline bool Heap::testAndSetMarked(const JSCell* cell) { return MarkedSpace::testAndSetMarked(cell); } inline void Heap::setMarked(JSCell* cell) { MarkedSpace::setMarked(cell); } inline bool Heap::contains(void* p) { return m_markedSpace.contains(p); } inline void Heap::reportExtraMemoryCost(size_t cost) { if (cost > minExtraCost) reportExtraMemoryCostSlowCase(cost); } template inline void Heap::forEach(Functor& functor) { m_markedSpace.forEach(functor); } } // namespace JSC #endif // Heap_h