[WTF] Use m_suspendCount instead of m_suspended flag in Thread
[WebKit-https.git] / Source / JavaScriptCore / heap / Subspace.h
1 /*
2  * Copyright (C) 2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #pragma once
27
28 #include "AllocationFailureMode.h"
29 #include "AllocatorForMode.h"
30 #include "MarkedBlock.h"
31 #include "MarkedSpace.h"
32 #include <wtf/text/CString.h>
33
34 namespace JSC {
35
36 class AlignedMemoryAllocator;
37 class HeapCellType;
38
39 // The idea of subspaces is that you can provide some custom behavior for your objects if you
40 // allocate them from a custom Subspace in which you override some of the virtual methods. This
41 // class is the baseclass of Subspaces. Usually you will use either Subspace or FixedSizeSubspace.
42 class Subspace {
43     WTF_MAKE_NONCOPYABLE(Subspace);
44     WTF_MAKE_FAST_ALLOCATED;
45 public:
46     JS_EXPORT_PRIVATE Subspace(CString name, Heap&);
47     JS_EXPORT_PRIVATE virtual ~Subspace();
48
49     const char* name() const { return m_name.data(); }
50     MarkedSpace& space() const { return m_space; }
51     
52     const AllocatorAttributes& attributes() const { return m_attributes; }
53     HeapCellType* heapCellType() const { return m_heapCellType; }
54     AlignedMemoryAllocator* alignedMemoryAllocator() const { return m_alignedMemoryAllocator; }
55     
56     void finishSweep(MarkedBlock::Handle&, FreeList*);
57     void destroy(VM&, JSCell*);
58
59     virtual MarkedAllocator* allocatorFor(size_t, AllocatorForMode) = 0;
60     virtual void* allocate(size_t, GCDeferralContext*, AllocationFailureMode) = 0;
61     
62     void prepareForAllocation();
63     
64     void didCreateFirstAllocator(MarkedAllocator* allocator) { m_allocatorForEmptyAllocation = allocator; }
65     
66     // Finds an empty block from any Subspace that agrees to trade blocks with us.
67     MarkedBlock::Handle* findEmptyBlockToSteal();
68     
69     template<typename Func>
70     void forEachAllocator(const Func&);
71     
72     template<typename Func>
73     void forEachMarkedBlock(const Func&);
74     
75     template<typename Func>
76     void forEachNotEmptyMarkedBlock(const Func&);
77     
78     template<typename Func>
79     void forEachLargeAllocation(const Func&);
80     
81     template<typename Func>
82     void forEachMarkedCell(const Func&);
83
84     template<typename Func>
85     void forEachLiveCell(const Func&);
86     
87     Subspace* nextSubspaceInAlignedMemoryAllocator() const { return m_nextSubspaceInAlignedMemoryAllocator; }
88     void setNextSubspaceInAlignedMemoryAllocator(Subspace* subspace) { m_nextSubspaceInAlignedMemoryAllocator = subspace; }
89
90 protected:
91     void initialize(HeapCellType*, AlignedMemoryAllocator*);
92     
93     MarkedSpace& m_space;
94     
95     CString m_name;
96     AllocatorAttributes m_attributes;
97
98     HeapCellType* m_heapCellType { nullptr };
99     AlignedMemoryAllocator* m_alignedMemoryAllocator { nullptr };
100     
101     MarkedAllocator* m_firstAllocator { nullptr };
102     MarkedAllocator* m_allocatorForEmptyAllocation { nullptr }; // Uses the MarkedSpace linked list of blocks.
103     SentinelLinkedList<LargeAllocation, BasicRawSentinelNode<LargeAllocation>> m_largeAllocations;
104     Subspace* m_nextSubspaceInAlignedMemoryAllocator { nullptr };
105 };
106
107 } // namespace JSC
108