xref: /aosp_15_r20/art/runtime/gc/collector/mark_sweep.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2011 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #ifndef ART_RUNTIME_GC_COLLECTOR_MARK_SWEEP_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_GC_COLLECTOR_MARK_SWEEP_H_
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker #include <memory>
21*795d594fSAndroid Build Coastguard Worker 
22*795d594fSAndroid Build Coastguard Worker #include "base/atomic.h"
23*795d594fSAndroid Build Coastguard Worker #include "barrier.h"
24*795d594fSAndroid Build Coastguard Worker #include "base/macros.h"
25*795d594fSAndroid Build Coastguard Worker #include "base/mutex.h"
26*795d594fSAndroid Build Coastguard Worker #include "garbage_collector.h"
27*795d594fSAndroid Build Coastguard Worker #include "gc/accounting/heap_bitmap.h"
28*795d594fSAndroid Build Coastguard Worker #include "gc_root.h"
29*795d594fSAndroid Build Coastguard Worker #include "immune_spaces.h"
30*795d594fSAndroid Build Coastguard Worker #include "offsets.h"
31*795d594fSAndroid Build Coastguard Worker 
32*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
33*795d594fSAndroid Build Coastguard Worker 
34*795d594fSAndroid Build Coastguard Worker namespace mirror {
35*795d594fSAndroid Build Coastguard Worker class Class;
36*795d594fSAndroid Build Coastguard Worker class Object;
37*795d594fSAndroid Build Coastguard Worker class Reference;
38*795d594fSAndroid Build Coastguard Worker }  // namespace mirror
39*795d594fSAndroid Build Coastguard Worker 
40*795d594fSAndroid Build Coastguard Worker class Thread;
41*795d594fSAndroid Build Coastguard Worker enum VisitRootFlags : uint8_t;
42*795d594fSAndroid Build Coastguard Worker 
43*795d594fSAndroid Build Coastguard Worker namespace gc {
44*795d594fSAndroid Build Coastguard Worker class Heap;
45*795d594fSAndroid Build Coastguard Worker 
46*795d594fSAndroid Build Coastguard Worker namespace collector {
47*795d594fSAndroid Build Coastguard Worker class MarkSweep : public GarbageCollector {
48*795d594fSAndroid Build Coastguard Worker  public:
49*795d594fSAndroid Build Coastguard Worker   MarkSweep(Heap* heap, bool is_concurrent, const std::string& name_prefix = "");
50*795d594fSAndroid Build Coastguard Worker 
~MarkSweep()51*795d594fSAndroid Build Coastguard Worker   ~MarkSweep() {}
52*795d594fSAndroid Build Coastguard Worker 
53*795d594fSAndroid Build Coastguard Worker   void RunPhases() override REQUIRES(!mark_stack_lock_);
54*795d594fSAndroid Build Coastguard Worker   void InitializePhase();
55*795d594fSAndroid Build Coastguard Worker   void MarkingPhase() REQUIRES(!mark_stack_lock_) REQUIRES_SHARED(Locks::mutator_lock_);
56*795d594fSAndroid Build Coastguard Worker   void PausePhase() REQUIRES(Locks::mutator_lock_) REQUIRES(!mark_stack_lock_);
57*795d594fSAndroid Build Coastguard Worker   void ReclaimPhase() REQUIRES(!mark_stack_lock_) REQUIRES_SHARED(Locks::mutator_lock_);
58*795d594fSAndroid Build Coastguard Worker   void FinishPhase();
59*795d594fSAndroid Build Coastguard Worker   virtual void MarkReachableObjects()
60*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
61*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
62*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
63*795d594fSAndroid Build Coastguard Worker 
IsConcurrent()64*795d594fSAndroid Build Coastguard Worker   bool IsConcurrent() const {
65*795d594fSAndroid Build Coastguard Worker     return is_concurrent_;
66*795d594fSAndroid Build Coastguard Worker   }
67*795d594fSAndroid Build Coastguard Worker 
GetGcType()68*795d594fSAndroid Build Coastguard Worker   GcType GetGcType() const override {
69*795d594fSAndroid Build Coastguard Worker     return kGcTypeFull;
70*795d594fSAndroid Build Coastguard Worker   }
71*795d594fSAndroid Build Coastguard Worker 
GetCollectorType()72*795d594fSAndroid Build Coastguard Worker   CollectorType GetCollectorType() const override {
73*795d594fSAndroid Build Coastguard Worker     return is_concurrent_ ? kCollectorTypeCMS : kCollectorTypeMS;
74*795d594fSAndroid Build Coastguard Worker   }
75*795d594fSAndroid Build Coastguard Worker 
76*795d594fSAndroid Build Coastguard Worker   // Initializes internal structures.
77*795d594fSAndroid Build Coastguard Worker   void Init();
78*795d594fSAndroid Build Coastguard Worker 
79*795d594fSAndroid Build Coastguard Worker   // Find the default mark bitmap.
80*795d594fSAndroid Build Coastguard Worker   void FindDefaultSpaceBitmap() REQUIRES_SHARED(Locks::mutator_lock_);
81*795d594fSAndroid Build Coastguard Worker 
82*795d594fSAndroid Build Coastguard Worker   // Marks all objects in the root set at the start of a garbage collection.
83*795d594fSAndroid Build Coastguard Worker   void MarkRoots(Thread* self)
84*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
85*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
86*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
87*795d594fSAndroid Build Coastguard Worker 
88*795d594fSAndroid Build Coastguard Worker   void MarkNonThreadRoots()
89*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
90*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
91*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
92*795d594fSAndroid Build Coastguard Worker 
93*795d594fSAndroid Build Coastguard Worker   virtual void MarkConcurrentRoots(VisitRootFlags flags)
94*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
95*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
96*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
97*795d594fSAndroid Build Coastguard Worker 
98*795d594fSAndroid Build Coastguard Worker   void MarkRootsCheckpoint(Thread* self, bool revoke_ros_alloc_thread_local_buffers_at_checkpoint)
99*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
100*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
101*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
102*795d594fSAndroid Build Coastguard Worker 
103*795d594fSAndroid Build Coastguard Worker   // Builds a mark stack and recursively mark until it empties.
104*795d594fSAndroid Build Coastguard Worker   void RecursiveMark()
105*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
106*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
107*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
108*795d594fSAndroid Build Coastguard Worker 
109*795d594fSAndroid Build Coastguard Worker   // Bind the live bits to the mark bits of bitmaps for spaces that are never collected, ie
110*795d594fSAndroid Build Coastguard Worker   // the image. Mark that portion of the heap as immune.
111*795d594fSAndroid Build Coastguard Worker   virtual void BindBitmaps() REQUIRES_SHARED(Locks::mutator_lock_);
112*795d594fSAndroid Build Coastguard Worker 
113*795d594fSAndroid Build Coastguard Worker   // Builds a mark stack with objects on dirty cards and recursively mark until it empties.
114*795d594fSAndroid Build Coastguard Worker   void RecursiveMarkDirtyObjects(bool paused, uint8_t minimum_age)
115*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
116*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
117*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
118*795d594fSAndroid Build Coastguard Worker 
119*795d594fSAndroid Build Coastguard Worker   // Remarks the root set after completing the concurrent mark.
120*795d594fSAndroid Build Coastguard Worker   void ReMarkRoots()
121*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
122*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
123*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
124*795d594fSAndroid Build Coastguard Worker 
125*795d594fSAndroid Build Coastguard Worker   void ProcessReferences(Thread* self)
126*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
127*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
128*795d594fSAndroid Build Coastguard Worker 
129*795d594fSAndroid Build Coastguard Worker   // Update and mark references from immune spaces.
130*795d594fSAndroid Build Coastguard Worker   void UpdateAndMarkModUnion()
131*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
132*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
133*795d594fSAndroid Build Coastguard Worker 
134*795d594fSAndroid Build Coastguard Worker   // Pre clean cards to reduce how much work is needed in the pause.
135*795d594fSAndroid Build Coastguard Worker   void PreCleanCards()
136*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
137*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
138*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
139*795d594fSAndroid Build Coastguard Worker 
140*795d594fSAndroid Build Coastguard Worker   // Sweeps unmarked objects to complete the garbage collection. Virtual as by default it sweeps
141*795d594fSAndroid Build Coastguard Worker   // all allocation spaces. Partial and sticky GCs want to just sweep a subset of the heap.
142*795d594fSAndroid Build Coastguard Worker   virtual void Sweep(bool swap_bitmaps)
143*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
144*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
145*795d594fSAndroid Build Coastguard Worker 
146*795d594fSAndroid Build Coastguard Worker   // Sweeps unmarked objects to complete the garbage collection.
147*795d594fSAndroid Build Coastguard Worker   void SweepLargeObjects(bool swap_bitmaps) REQUIRES(Locks::heap_bitmap_lock_);
148*795d594fSAndroid Build Coastguard Worker 
149*795d594fSAndroid Build Coastguard Worker   void SweepArray(accounting::ObjectStack* obj_arr, bool swap_bitmaps)
150*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_) REQUIRES_SHARED(Locks::mutator_lock_);
151*795d594fSAndroid Build Coastguard Worker 
152*795d594fSAndroid Build Coastguard Worker   // Blackens an object.
153*795d594fSAndroid Build Coastguard Worker   void ScanObject(mirror::Object* obj)
154*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
155*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
156*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
157*795d594fSAndroid Build Coastguard Worker 
158*795d594fSAndroid Build Coastguard Worker   // No thread safety analysis due to lambdas.
159*795d594fSAndroid Build Coastguard Worker   template<typename MarkVisitor, typename ReferenceVisitor>
160*795d594fSAndroid Build Coastguard Worker   void ScanObjectVisit(mirror::Object* obj,
161*795d594fSAndroid Build Coastguard Worker                        const MarkVisitor& visitor,
162*795d594fSAndroid Build Coastguard Worker                        const ReferenceVisitor& ref_visitor)
163*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
164*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
165*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
166*795d594fSAndroid Build Coastguard Worker 
167*795d594fSAndroid Build Coastguard Worker   void SweepSystemWeaks(Thread* self)
168*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::heap_bitmap_lock_)
169*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
170*795d594fSAndroid Build Coastguard Worker 
171*795d594fSAndroid Build Coastguard Worker   static mirror::Object* VerifySystemWeakIsLiveCallback(mirror::Object* obj, void* arg)
172*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::heap_bitmap_lock_, Locks::mutator_lock_);
173*795d594fSAndroid Build Coastguard Worker 
174*795d594fSAndroid Build Coastguard Worker   void VerifySystemWeaks()
175*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::mutator_lock_) REQUIRES_SHARED(Locks::heap_bitmap_lock_);
176*795d594fSAndroid Build Coastguard Worker 
177*795d594fSAndroid Build Coastguard Worker   // Verify that an object is live, either in a live bitmap or in the allocation stack.
178*795d594fSAndroid Build Coastguard Worker   void VerifyIsLive(const mirror::Object* obj)
179*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_, Locks::heap_bitmap_lock_);
180*795d594fSAndroid Build Coastguard Worker 
181*795d594fSAndroid Build Coastguard Worker   bool IsNullOrMarkedHeapReference(mirror::HeapReference<mirror::Object>* ref,
182*795d594fSAndroid Build Coastguard Worker                                    bool do_atomic_update) override
183*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
184*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
185*795d594fSAndroid Build Coastguard Worker 
186*795d594fSAndroid Build Coastguard Worker   void VisitRoots(mirror::Object*** roots, size_t count, const RootInfo& info) override
187*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
188*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
189*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
190*795d594fSAndroid Build Coastguard Worker 
191*795d594fSAndroid Build Coastguard Worker   void VisitRoots(mirror::CompressedReference<mirror::Object>** roots,
192*795d594fSAndroid Build Coastguard Worker                   size_t count,
193*795d594fSAndroid Build Coastguard Worker                   const RootInfo& info) override
194*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
195*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
196*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
197*795d594fSAndroid Build Coastguard Worker 
198*795d594fSAndroid Build Coastguard Worker   // Marks an object.
199*795d594fSAndroid Build Coastguard Worker   mirror::Object* MarkObject(mirror::Object* obj) override
200*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
201*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
202*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
203*795d594fSAndroid Build Coastguard Worker 
204*795d594fSAndroid Build Coastguard Worker   void MarkObject(mirror::Object* obj, mirror::Object* holder, MemberOffset offset)
205*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
206*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
207*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
208*795d594fSAndroid Build Coastguard Worker 
209*795d594fSAndroid Build Coastguard Worker   void MarkHeapReference(mirror::HeapReference<mirror::Object>* ref,
210*795d594fSAndroid Build Coastguard Worker                          bool do_atomic_update) override
211*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
212*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
213*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
214*795d594fSAndroid Build Coastguard Worker 
GetBarrier()215*795d594fSAndroid Build Coastguard Worker   Barrier& GetBarrier() {
216*795d594fSAndroid Build Coastguard Worker     return *gc_barrier_;
217*795d594fSAndroid Build Coastguard Worker   }
218*795d594fSAndroid Build Coastguard Worker 
219*795d594fSAndroid Build Coastguard Worker   // Schedules an unmarked object for reference processing.
220*795d594fSAndroid Build Coastguard Worker   void DelayReferenceReferent(ObjPtr<mirror::Class> klass, ObjPtr<mirror::Reference> reference)
221*795d594fSAndroid Build Coastguard Worker       override REQUIRES_SHARED(Locks::heap_bitmap_lock_, Locks::mutator_lock_);
222*795d594fSAndroid Build Coastguard Worker 
223*795d594fSAndroid Build Coastguard Worker  protected:
224*795d594fSAndroid Build Coastguard Worker   // Returns object if the object is marked in the heap bitmap, otherwise null.
225*795d594fSAndroid Build Coastguard Worker   mirror::Object* IsMarked(mirror::Object* object) override
226*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::heap_bitmap_lock_, Locks::mutator_lock_);
227*795d594fSAndroid Build Coastguard Worker 
228*795d594fSAndroid Build Coastguard Worker   void MarkObjectNonNull(mirror::Object* obj,
229*795d594fSAndroid Build Coastguard Worker                          mirror::Object* holder = nullptr,
230*795d594fSAndroid Build Coastguard Worker                          MemberOffset offset = MemberOffset(0))
231*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
232*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
233*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
234*795d594fSAndroid Build Coastguard Worker 
235*795d594fSAndroid Build Coastguard Worker   // Marks an object atomically, safe to use from multiple threads.
236*795d594fSAndroid Build Coastguard Worker   void MarkObjectNonNullParallel(mirror::Object* obj)
237*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
238*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
239*795d594fSAndroid Build Coastguard Worker 
240*795d594fSAndroid Build Coastguard Worker   // Returns true if we need to add obj to a mark stack.
241*795d594fSAndroid Build Coastguard Worker   bool MarkObjectParallel(mirror::Object* obj) NO_THREAD_SAFETY_ANALYSIS;
242*795d594fSAndroid Build Coastguard Worker 
243*795d594fSAndroid Build Coastguard Worker   // Verify the roots of the heap and print out information related to any invalid roots.
244*795d594fSAndroid Build Coastguard Worker   // Called in MarkObject, so may we may not hold the mutator lock.
245*795d594fSAndroid Build Coastguard Worker   void VerifySuspendedThreadRoots(std::ostream& os)
246*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
247*795d594fSAndroid Build Coastguard Worker 
248*795d594fSAndroid Build Coastguard Worker   // Expand mark stack to 2x its current size.
249*795d594fSAndroid Build Coastguard Worker   void ExpandMarkStack()
250*795d594fSAndroid Build Coastguard Worker       REQUIRES(mark_stack_lock_)
251*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
252*795d594fSAndroid Build Coastguard Worker 
253*795d594fSAndroid Build Coastguard Worker   void ResizeMarkStack(size_t new_size)
254*795d594fSAndroid Build Coastguard Worker       REQUIRES(mark_stack_lock_)
255*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
256*795d594fSAndroid Build Coastguard Worker 
257*795d594fSAndroid Build Coastguard Worker   // Returns how many threads we should use for the current GC phase based on if we are paused,
258*795d594fSAndroid Build Coastguard Worker   // whether or not we care about pauses.
259*795d594fSAndroid Build Coastguard Worker   size_t GetThreadCount(bool paused) const;
260*795d594fSAndroid Build Coastguard Worker 
261*795d594fSAndroid Build Coastguard Worker   // Push a single reference on a mark stack.
262*795d594fSAndroid Build Coastguard Worker   void PushOnMarkStack(mirror::Object* obj)
263*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
264*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
265*795d594fSAndroid Build Coastguard Worker 
266*795d594fSAndroid Build Coastguard Worker   // Blackens objects grayed during a garbage collection.
267*795d594fSAndroid Build Coastguard Worker   void ScanGrayObjects(bool paused, uint8_t minimum_age)
268*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
269*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
270*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
271*795d594fSAndroid Build Coastguard Worker 
ProcessMarkStack()272*795d594fSAndroid Build Coastguard Worker   void ProcessMarkStack() override
273*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
274*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
275*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) {
276*795d594fSAndroid Build Coastguard Worker     ProcessMarkStack(false);
277*795d594fSAndroid Build Coastguard Worker   }
278*795d594fSAndroid Build Coastguard Worker 
279*795d594fSAndroid Build Coastguard Worker   // Recursively blackens objects on the mark stack.
280*795d594fSAndroid Build Coastguard Worker   void ProcessMarkStack(bool paused)
281*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
282*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
283*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
284*795d594fSAndroid Build Coastguard Worker 
285*795d594fSAndroid Build Coastguard Worker   void ProcessMarkStackParallel(size_t thread_count)
286*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
287*795d594fSAndroid Build Coastguard Worker       REQUIRES(!mark_stack_lock_)
288*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
289*795d594fSAndroid Build Coastguard Worker 
290*795d594fSAndroid Build Coastguard Worker   // Used to Get around thread safety annotations. The call is from MarkingPhase and is guarded by
291*795d594fSAndroid Build Coastguard Worker   // IsExclusiveHeld.
292*795d594fSAndroid Build Coastguard Worker   void RevokeAllThreadLocalAllocationStacks(Thread* self) NO_THREAD_SAFETY_ANALYSIS;
293*795d594fSAndroid Build Coastguard Worker 
294*795d594fSAndroid Build Coastguard Worker   // Revoke all the thread-local buffers.
295*795d594fSAndroid Build Coastguard Worker   void RevokeAllThreadLocalBuffers() override;
296*795d594fSAndroid Build Coastguard Worker 
297*795d594fSAndroid Build Coastguard Worker   // Whether or not we count how many of each type of object were scanned.
298*795d594fSAndroid Build Coastguard Worker   static constexpr bool kCountScannedTypes = false;
299*795d594fSAndroid Build Coastguard Worker 
300*795d594fSAndroid Build Coastguard Worker   // Current space, we check this space first to avoid searching for the appropriate space for an
301*795d594fSAndroid Build Coastguard Worker   // object.
302*795d594fSAndroid Build Coastguard Worker   accounting::ContinuousSpaceBitmap* current_space_bitmap_;
303*795d594fSAndroid Build Coastguard Worker   // Cache the heap's mark bitmap to prevent having to do 2 loads during slow path marking.
304*795d594fSAndroid Build Coastguard Worker   accounting::HeapBitmap* mark_bitmap_;
305*795d594fSAndroid Build Coastguard Worker 
306*795d594fSAndroid Build Coastguard Worker   accounting::ObjectStack* mark_stack_;
307*795d594fSAndroid Build Coastguard Worker 
308*795d594fSAndroid Build Coastguard Worker   // Every object inside the immune spaces is assumed to be marked. Immune spaces that aren't in the
309*795d594fSAndroid Build Coastguard Worker   // immune region are handled by the normal marking logic.
310*795d594fSAndroid Build Coastguard Worker   ImmuneSpaces immune_spaces_;
311*795d594fSAndroid Build Coastguard Worker 
312*795d594fSAndroid Build Coastguard Worker   // Parallel finger.
313*795d594fSAndroid Build Coastguard Worker   AtomicInteger atomic_finger_;
314*795d594fSAndroid Build Coastguard Worker 
315*795d594fSAndroid Build Coastguard Worker   AtomicInteger no_reference_class_count_;
316*795d594fSAndroid Build Coastguard Worker   AtomicInteger normal_count_;
317*795d594fSAndroid Build Coastguard Worker   // Number of classes scanned, if kCountScannedTypes.
318*795d594fSAndroid Build Coastguard Worker   AtomicInteger class_count_;
319*795d594fSAndroid Build Coastguard Worker   // Number of object arrays scanned, if kCountScannedTypes.
320*795d594fSAndroid Build Coastguard Worker   AtomicInteger object_array_count_;
321*795d594fSAndroid Build Coastguard Worker   // Number of non-class/arrays scanned, if kCountScannedTypes.
322*795d594fSAndroid Build Coastguard Worker   AtomicInteger other_count_;
323*795d594fSAndroid Build Coastguard Worker   // Number of java.lang.ref.Reference instances.
324*795d594fSAndroid Build Coastguard Worker   AtomicInteger reference_count_;
325*795d594fSAndroid Build Coastguard Worker 
326*795d594fSAndroid Build Coastguard Worker   AtomicInteger large_object_test_;
327*795d594fSAndroid Build Coastguard Worker   AtomicInteger large_object_mark_;
328*795d594fSAndroid Build Coastguard Worker   AtomicInteger overhead_time_;
329*795d594fSAndroid Build Coastguard Worker   AtomicInteger work_chunks_created_;
330*795d594fSAndroid Build Coastguard Worker   AtomicInteger work_chunks_deleted_;
331*795d594fSAndroid Build Coastguard Worker   AtomicInteger mark_null_count_;
332*795d594fSAndroid Build Coastguard Worker   AtomicInteger mark_immune_count_;
333*795d594fSAndroid Build Coastguard Worker   AtomicInteger mark_fastpath_count_;
334*795d594fSAndroid Build Coastguard Worker   AtomicInteger mark_slowpath_count_;
335*795d594fSAndroid Build Coastguard Worker 
336*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<Barrier> gc_barrier_;
337*795d594fSAndroid Build Coastguard Worker   Mutex mark_stack_lock_ ACQUIRED_AFTER(Locks::classlinker_classes_lock_);
338*795d594fSAndroid Build Coastguard Worker 
339*795d594fSAndroid Build Coastguard Worker   const bool is_concurrent_;
340*795d594fSAndroid Build Coastguard Worker 
341*795d594fSAndroid Build Coastguard Worker   // Verification.
342*795d594fSAndroid Build Coastguard Worker   size_t live_stack_freeze_size_;
343*795d594fSAndroid Build Coastguard Worker 
344*795d594fSAndroid Build Coastguard Worker  private:
345*795d594fSAndroid Build Coastguard Worker   class CardScanTask;
346*795d594fSAndroid Build Coastguard Worker   class CheckpointMarkThreadRoots;
347*795d594fSAndroid Build Coastguard Worker   class DelayReferenceReferentVisitor;
348*795d594fSAndroid Build Coastguard Worker   template<bool kUseFinger> class MarkStackTask;
349*795d594fSAndroid Build Coastguard Worker   class MarkObjectSlowPath;
350*795d594fSAndroid Build Coastguard Worker   class RecursiveMarkTask;
351*795d594fSAndroid Build Coastguard Worker   class ScanObjectParallelVisitor;
352*795d594fSAndroid Build Coastguard Worker   class ScanObjectVisitor;
353*795d594fSAndroid Build Coastguard Worker   class VerifyRootMarkedVisitor;
354*795d594fSAndroid Build Coastguard Worker   class VerifyRootVisitor;
355*795d594fSAndroid Build Coastguard Worker   class VerifySystemWeakVisitor;
356*795d594fSAndroid Build Coastguard Worker 
357*795d594fSAndroid Build Coastguard Worker   DISALLOW_IMPLICIT_CONSTRUCTORS(MarkSweep);
358*795d594fSAndroid Build Coastguard Worker };
359*795d594fSAndroid Build Coastguard Worker 
360*795d594fSAndroid Build Coastguard Worker }  // namespace collector
361*795d594fSAndroid Build Coastguard Worker }  // namespace gc
362*795d594fSAndroid Build Coastguard Worker }  // namespace art
363*795d594fSAndroid Build Coastguard Worker 
364*795d594fSAndroid Build Coastguard Worker #endif  // ART_RUNTIME_GC_COLLECTOR_MARK_SWEEP_H_
365