47bae945158108d2c9f6da111561d2112409963b
[WebKit-https.git] / Source / JavaScriptCore / heap / MarkedAllocator.h
1 #ifndef MarkedAllocator_h
2 #define MarkedAllocator_h
3
4 #include "MarkedBlock.h"
5 #include <wtf/DoublyLinkedList.h>
6
7 namespace JSC {
8
9 class Heap;
10 class MarkedSpace;
11 class LLIntOffsetsExtractor;
12
13 namespace DFG {
14 class SpeculativeJIT;
15 }
16
17 class MarkedAllocator {
18     friend class JIT;
19     friend class DFG::SpeculativeJIT;
20
21 public:
22     MarkedAllocator();
23     void reset();
24     void zapFreeList();
25     size_t cellSize() { return m_cellSize; }
26     bool cellsNeedDestruction() { return m_cellsNeedDestruction; }
27     bool onlyContainsStructures() { return m_onlyContainsStructures; }
28     void* allocate();
29     Heap* heap() { return m_heap; }
30     
31     template<typename Functor> void forEachBlock(Functor&);
32     
33     void addBlock(MarkedBlock*);
34     void removeBlock(MarkedBlock*);
35     void init(Heap*, MarkedSpace*, size_t cellSize, bool cellsNeedDestruction, bool onlyContainsStructures);
36
37     bool isPagedOut(double deadline);
38    
39 private:
40     friend class LLIntOffsetsExtractor;
41     
42     JS_EXPORT_PRIVATE void* allocateSlowCase();
43     void* tryAllocate();
44     void* tryAllocateHelper();
45     MarkedBlock* allocateBlock();
46     
47     MarkedBlock::FreeList m_freeList;
48     MarkedBlock* m_currentBlock;
49     MarkedBlock* m_blocksToSweep;
50     DoublyLinkedList<HeapBlock> m_blockList;
51     size_t m_cellSize;
52     bool m_cellsNeedDestruction;
53     bool m_onlyContainsStructures;
54     Heap* m_heap;
55     MarkedSpace* m_markedSpace;
56 };
57
58 inline MarkedAllocator::MarkedAllocator()
59     : m_currentBlock(0)
60     , m_blocksToSweep(0)
61     , m_cellSize(0)
62     , m_cellsNeedDestruction(true)
63     , m_onlyContainsStructures(false)
64     , m_heap(0)
65     , m_markedSpace(0)
66 {
67 }
68
69 inline void MarkedAllocator::init(Heap* heap, MarkedSpace* markedSpace, size_t cellSize, bool cellsNeedDestruction, bool onlyContainsStructures)
70 {
71     m_heap = heap;
72     m_markedSpace = markedSpace;
73     m_cellSize = cellSize;
74     m_cellsNeedDestruction = cellsNeedDestruction;
75     m_onlyContainsStructures = onlyContainsStructures;
76 }
77
78 inline void* MarkedAllocator::allocate()
79 {
80     MarkedBlock::FreeCell* head = m_freeList.head;
81     // This is a light-weight fast path to cover the most common case.
82     if (UNLIKELY(!head))
83         return allocateSlowCase();
84     
85     m_freeList.head = head->next;
86     return head;
87 }
88
89 inline void MarkedAllocator::reset()
90 {
91     m_currentBlock = 0;
92     m_freeList = MarkedBlock::FreeList();
93     m_blocksToSweep = static_cast<MarkedBlock*>(m_blockList.head());
94 }
95
96 inline void MarkedAllocator::zapFreeList()
97 {
98     if (!m_currentBlock) {
99         ASSERT(!m_freeList.head);
100         return;
101     }
102     
103     m_currentBlock->zapFreeList(m_freeList);
104     m_freeList = MarkedBlock::FreeList();
105 }
106
107 template <typename Functor> inline void MarkedAllocator::forEachBlock(Functor& functor)
108 {
109     HeapBlock* next;
110     for (HeapBlock* block = m_blockList.head(); block; block = next) {
111         next = block->next();
112         functor(static_cast<MarkedBlock*>(block));
113     }
114 }
115     
116 } // namespace JSC
117
118 #endif