| Index: Source/platform/heap/CallbackStack.h
|
| diff --git a/Source/platform/heap/CallbackStack.h b/Source/platform/heap/CallbackStack.h
|
| index e7e60ba8d337ee3effa4f57606fa7606f9fbf7e6..49b1f2949f89f98f602d8928e7db7e3e8f5ab13f 100644
|
| --- a/Source/platform/heap/CallbackStack.h
|
| +++ b/Source/platform/heap/CallbackStack.h
|
| @@ -16,6 +16,20 @@ namespace blink {
|
| // multiple chained CallbackStack object instances.
|
| class CallbackStack {
|
| public:
|
| +
|
| + // Callback stacks are extensible, chaining blocks together. However,
|
| + // all but the first block are deleted when 'popped empty', so it
|
| + // is in our interest to not spill over into additional blocks too
|
| + // often. The block sizes used here tries to reflect that -- plentiful
|
| + // for 'typical' GCs, but not wasting too much slop either in the
|
| + // initial block.
|
| + enum BlockSizes {
|
| + MarkingStackBlockSize = 8192,
|
| + WeakCallbackStackBlockSize = 2048,
|
| + PostMarkingStackBlockSize = 1024,
|
| + EphemeronCallbackStackBlockSize = 1024,
|
| + };
|
| +
|
| class Item {
|
| public:
|
| Item() { }
|
| @@ -33,7 +47,7 @@ public:
|
| VisitorCallback m_callback;
|
| };
|
|
|
| - CallbackStack();
|
| + CallbackStack(unsigned blockSize);
|
| ~CallbackStack();
|
|
|
| void clear();
|
| @@ -49,22 +63,15 @@ public:
|
| bool hasCallbackForObject(const void*);
|
| #endif
|
|
|
| - static const size_t blockSize = 8192;
|
| -
|
| private:
|
| class Block {
|
| public:
|
| - explicit Block(Block* next)
|
| - : m_limit(&(m_buffer[blockSize]))
|
| - , m_current(&(m_buffer[0]))
|
| - , m_next(next)
|
| - {
|
| - clearUnused();
|
| - }
|
| + Block(Block* next, unsigned blockSize);
|
|
|
| ~Block()
|
| {
|
| clearUnused();
|
| + delete m_buffer;
|
| }
|
|
|
| void clear();
|
| @@ -77,11 +84,6 @@ private:
|
| return m_current == &(m_buffer[0]);
|
| }
|
|
|
| - size_t size() const
|
| - {
|
| - return blockSize - (m_limit - m_current);
|
| - }
|
| -
|
| Item* allocateEntry()
|
| {
|
| if (LIKELY(m_current < m_limit))
|
| @@ -104,20 +106,23 @@ private:
|
| private:
|
| void clearUnused();
|
|
|
| - Item m_buffer[blockSize];
|
| + Item* m_buffer;
|
| Item* m_limit;
|
| Item* m_current;
|
| Block* m_next;
|
| +#if ENABLE(ASSERT)
|
| + unsigned m_blockSize;
|
| +#endif
|
| };
|
|
|
| Item* popSlow();
|
| Item* allocateEntrySlow();
|
| void invokeOldestCallbacks(Block*, Block*, Visitor*);
|
| bool hasJustOneBlock() const;
|
| - void swap(CallbackStack* other);
|
|
|
| Block* m_first;
|
| Block* m_last;
|
| + unsigned m_blockSize;
|
| };
|
|
|
| ALWAYS_INLINE CallbackStack::Item* CallbackStack::allocateEntry()
|
|
|