MarkedAllocator.h 2.89 KB
Newer Older
mhahnenberg@apple.com's avatar
mhahnenberg@apple.com committed
1 2 3 4 5 6 7 8 9 10
#ifndef MarkedAllocator_h
#define MarkedAllocator_h

#include "MarkedBlock.h"
#include <wtf/DoublyLinkedList.h>

namespace JSC {

class Heap;
class MarkedSpace;
11
class LLIntOffsetsExtractor;
mhahnenberg@apple.com's avatar
mhahnenberg@apple.com committed
12 13 14 15 16 17 18 19 20 21 22 23 24 25

namespace DFG {
class SpeculativeJIT;
}

class MarkedAllocator {
    friend class JIT;
    friend class DFG::SpeculativeJIT;

public:
    MarkedAllocator();
    void reset();
    void zapFreeList();
    size_t cellSize() { return m_cellSize; }
26
    bool cellsNeedDestruction() { return m_cellsNeedDestruction; }
27
    bool onlyContainsStructures() { return m_onlyContainsStructures; }
mhahnenberg@apple.com's avatar
mhahnenberg@apple.com committed
28 29 30 31 32 33 34
    void* allocate();
    Heap* heap() { return m_heap; }
    
    template<typename Functor> void forEachBlock(Functor&);
    
    void addBlock(MarkedBlock*);
    void removeBlock(MarkedBlock*);
35
    void init(Heap*, MarkedSpace*, size_t cellSize, bool cellsNeedDestruction, bool onlyContainsStructures);
36 37 38

    bool isPagedOut(double deadline);
   
mhahnenberg@apple.com's avatar
mhahnenberg@apple.com committed
39
private:
40 41
    friend class LLIntOffsetsExtractor;
    
mhahnenberg@apple.com's avatar
mhahnenberg@apple.com committed
42 43 44
    JS_EXPORT_PRIVATE void* allocateSlowCase();
    void* tryAllocate();
    void* tryAllocateHelper();
45
    MarkedBlock* allocateBlock();
mhahnenberg@apple.com's avatar
mhahnenberg@apple.com committed
46
    
47
    MarkedBlock::FreeList m_freeList;
mhahnenberg@apple.com's avatar
mhahnenberg@apple.com committed
48
    MarkedBlock* m_currentBlock;
49
    MarkedBlock* m_blocksToSweep;
mhahnenberg@apple.com's avatar
mhahnenberg@apple.com committed
50 51
    DoublyLinkedList<HeapBlock> m_blockList;
    size_t m_cellSize;
52
    bool m_cellsNeedDestruction;
53
    bool m_onlyContainsStructures;
mhahnenberg@apple.com's avatar
mhahnenberg@apple.com committed
54 55 56 57 58
    Heap* m_heap;
    MarkedSpace* m_markedSpace;
};

inline MarkedAllocator::MarkedAllocator()
59
    : m_currentBlock(0)
60
    , m_blocksToSweep(0)
mhahnenberg@apple.com's avatar
mhahnenberg@apple.com committed
61
    , m_cellSize(0)
62
    , m_cellsNeedDestruction(true)
63
    , m_onlyContainsStructures(false)
mhahnenberg@apple.com's avatar
mhahnenberg@apple.com committed
64 65 66 67
    , m_heap(0)
    , m_markedSpace(0)
{
}
68

69
inline void MarkedAllocator::init(Heap* heap, MarkedSpace* markedSpace, size_t cellSize, bool cellsNeedDestruction, bool onlyContainsStructures)
70 71 72 73 74
{
    m_heap = heap;
    m_markedSpace = markedSpace;
    m_cellSize = cellSize;
    m_cellsNeedDestruction = cellsNeedDestruction;
75
    m_onlyContainsStructures = onlyContainsStructures;
76 77
}

mhahnenberg@apple.com's avatar
mhahnenberg@apple.com committed
78 79
inline void* MarkedAllocator::allocate()
{
80
    MarkedBlock::FreeCell* head = m_freeList.head;
mhahnenberg@apple.com's avatar
mhahnenberg@apple.com committed
81
    // This is a light-weight fast path to cover the most common case.
82
    if (UNLIKELY(!head))
mhahnenberg@apple.com's avatar
mhahnenberg@apple.com committed
83 84
        return allocateSlowCase();
    
85 86
    m_freeList.head = head->next;
    return head;
mhahnenberg@apple.com's avatar
mhahnenberg@apple.com committed
87 88 89 90
}

inline void MarkedAllocator::reset()
{
91 92 93
    m_currentBlock = 0;
    m_freeList = MarkedBlock::FreeList();
    m_blocksToSweep = static_cast<MarkedBlock*>(m_blockList.head());
mhahnenberg@apple.com's avatar
mhahnenberg@apple.com committed
94 95 96 97 98
}

inline void MarkedAllocator::zapFreeList()
{
    if (!m_currentBlock) {
99
        ASSERT(!m_freeList.head);
mhahnenberg@apple.com's avatar
mhahnenberg@apple.com committed
100 101 102
        return;
    }
    
103
    m_currentBlock->zapFreeList(m_freeList);
104
    m_freeList = MarkedBlock::FreeList();
mhahnenberg@apple.com's avatar
mhahnenberg@apple.com committed
105 106 107 108 109 110 111 112 113 114 115 116 117 118
}

template <typename Functor> inline void MarkedAllocator::forEachBlock(Functor& functor)
{
    HeapBlock* next;
    for (HeapBlock* block = m_blockList.head(); block; block = next) {
        next = block->next();
        functor(static_cast<MarkedBlock*>(block));
    }
}
    
} // namespace JSC

#endif