Use WTF::Lock and WTF::Condition instead of WTF::Mutex, WTF::ThreadCondition, std...
[WebKit-https.git] / Source / JavaScriptCore / heap / GCThreadSharedData.h
1 /*
2  * Copyright (C) 2009, 2011, 2015 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 #ifndef GCThreadSharedData_h
27 #define GCThreadSharedData_h
28
29 #include "ListableHandler.h"
30 #include "MarkStack.h"
31 #include "MarkedBlock.h"
32 #include "UnconditionalFinalizer.h"
33 #include "WeakReferenceHarvester.h"
34 #include <condition_variable>
35 #include <wtf/Condition.h>
36 #include <wtf/HashSet.h>
37 #include <wtf/Lock.h>
38 #include <wtf/Vector.h>
39
40 namespace JSC {
41
42 class CopiedBlock;
43 class CopiedSpace;
44 class CopyVisitor;
45 class GCThread;
46 class VM;
47
48 enum GCPhase {
49     NoPhase,
50     Mark,
51     Copy,
52     Exit
53 };
54
55 class GCThreadSharedData {
56     WTF_MAKE_FAST_ALLOCATED;
57 public:
58     GCThreadSharedData(VM*);
59     ~GCThreadSharedData();
60     
61     void reset();
62
63     void didStartMarking();
64     void didFinishMarking();
65     void didStartCopying();
66     void didFinishCopying();
67
68 #if ENABLE(PARALLEL_GC)
69     void resetChildren();
70     size_t childVisitCount();
71     size_t childBytesVisited();
72     size_t childBytesCopied();
73     size_t childDupStrings();
74 #endif
75     
76 private:
77     friend class GCThread;
78     friend class SlotVisitor;
79     friend class CopyVisitor;
80
81     void getNextBlocksToCopy(size_t&, size_t&);
82     void startNextPhase(GCPhase);
83     void endCurrentPhase();
84
85     VM* m_vm;
86     CopiedSpace* m_copiedSpace;
87     
88     bool m_shouldHashCons;
89
90     Vector<GCThread*> m_gcThreads;
91
92     Lock m_markingMutex;
93     Condition m_markingConditionVariable;
94     MarkStackArray m_sharedMarkStack;
95     unsigned m_numberOfActiveParallelMarkers;
96     bool m_parallelMarkersShouldExit;
97
98     Lock m_opaqueRootsMutex;
99     HashSet<void*> m_opaqueRoots;
100
101     Lock m_copyLock;
102     Vector<CopiedBlock*> m_blocksToCopy;
103     size_t m_copyIndex;
104     static const size_t s_blockFragmentLength = 32;
105
106     Lock m_phaseMutex;
107     Condition m_phaseConditionVariable;
108     Condition m_activityConditionVariable;
109     unsigned m_numberOfActiveGCThreads;
110     bool m_gcThreadsShouldWait;
111     GCPhase m_currentPhase;
112
113     ListableHandler<WeakReferenceHarvester>::List m_weakReferenceHarvesters;
114     ListableHandler<UnconditionalFinalizer>::List m_unconditionalFinalizers;
115 };
116
117 inline void GCThreadSharedData::getNextBlocksToCopy(size_t& start, size_t& end)
118 {
119     LockHolder locker(&m_copyLock);
120     start = m_copyIndex;
121     end = std::min(m_blocksToCopy.size(), m_copyIndex + s_blockFragmentLength);
122     m_copyIndex = end;
123 }
124
125 } // namespace JSC
126
127 #endif