diff options
Diffstat (limited to 'Source/JavaScriptCore/heap/MarkStack.h')
-rw-r--r-- | Source/JavaScriptCore/heap/MarkStack.h | 90 |
1 files changed, 3 insertions, 87 deletions
diff --git a/Source/JavaScriptCore/heap/MarkStack.h b/Source/JavaScriptCore/heap/MarkStack.h index c97b6a735..04f19c62c 100644 --- a/Source/JavaScriptCore/heap/MarkStack.h +++ b/Source/JavaScriptCore/heap/MarkStack.h @@ -26,102 +26,18 @@ #ifndef MarkStack_h #define MarkStack_h -#if ENABLE(OBJECT_MARK_LOGGING) -#define MARK_LOG_MESSAGE0(message) dataLogF(message) -#define MARK_LOG_MESSAGE1(message, arg1) dataLogF(message, arg1) -#define MARK_LOG_MESSAGE2(message, arg1, arg2) dataLogF(message, arg1, arg2) -#define MARK_LOG_ROOT(visitor, rootName) \ - dataLogF("\n%s: ", rootName); \ - (visitor).resetChildCount() -#define MARK_LOG_PARENT(visitor, parent) \ - dataLogF("\n%p (%s): ", parent, parent->className() ? parent->className() : "unknown"); \ - (visitor).resetChildCount() -#define MARK_LOG_CHILD(visitor, child) \ - if ((visitor).childCount()) \ - dataLogFString(", "); \ - dataLogF("%p", child); \ - (visitor).incrementChildCount() -#else -#define MARK_LOG_MESSAGE0(message) do { } while (false) -#define MARK_LOG_MESSAGE1(message, arg1) do { } while (false) -#define MARK_LOG_MESSAGE2(message, arg1, arg2) do { } while (false) -#define MARK_LOG_ROOT(visitor, rootName) do { } while (false) -#define MARK_LOG_PARENT(visitor, parent) do { } while (false) -#define MARK_LOG_CHILD(visitor, child) do { } while (false) -#endif - -#include "HeapBlock.h" -#include <wtf/StdLibExtras.h> +#include "GCSegmentedArrayInlines.h" namespace JSC { -class BlockAllocator; -class DeadBlock; class JSCell; -class MarkStackSegment : public HeapBlock<MarkStackSegment> { +class MarkStackArray : public GCSegmentedArray<const JSCell*> { public: - MarkStackSegment(Region* region) - : HeapBlock<MarkStackSegment>(region) -#if !ASSERT_DISABLED - , m_top(0) -#endif - { - } - - static MarkStackSegment* create(DeadBlock*); - - const JSCell** data() - { - return bitwise_cast<const JSCell**>(this + 1); - } - - static const size_t blockSize = 4 * KB; - -#if !ASSERT_DISABLED - size_t m_top; -#endif -}; + MarkStackArray(); -class MarkStackArray { -public: - MarkStackArray(BlockAllocator&); - ~MarkStackArray(); - - void append(const JSCell*); - - bool canRemoveLast(); - const JSCell* removeLast(); - bool refill(); - void donateSomeCellsTo(MarkStackArray& other); void stealSomeCellsFrom(MarkStackArray& other, size_t idleThreadCount); - - size_t size(); - bool isEmpty(); - -private: - template <size_t size> struct CapacityFromSize { - static const size_t value = (size - sizeof(MarkStackSegment)) / sizeof(const JSCell*); - }; - - JS_EXPORT_PRIVATE void expand(); - - size_t postIncTop(); - size_t preDecTop(); - void setTopForFullSegment(); - void setTopForEmptySegment(); - size_t top(); - - void validatePrevious(); - - DoublyLinkedList<MarkStackSegment> m_segments; - BlockAllocator& m_blockAllocator; - - JS_EXPORT_PRIVATE static const size_t s_segmentCapacity = CapacityFromSize<MarkStackSegment::blockSize>::value; - size_t m_top; - size_t m_numberOfSegments; - }; } // namespace JSC |