xref: /aosp_15_r20/art/runtime/gc/reference_processor.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2014 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_REFERENCE_PROCESSOR_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_GC_REFERENCE_PROCESSOR_H_
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker #include "base/macros.h"
21*795d594fSAndroid Build Coastguard Worker #include "base/locks.h"
22*795d594fSAndroid Build Coastguard Worker #include "jni.h"
23*795d594fSAndroid Build Coastguard Worker #include "reference_queue.h"
24*795d594fSAndroid Build Coastguard Worker #include "runtime_globals.h"
25*795d594fSAndroid Build Coastguard Worker 
26*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
27*795d594fSAndroid Build Coastguard Worker 
28*795d594fSAndroid Build Coastguard Worker class IsMarkedVisitor;
29*795d594fSAndroid Build Coastguard Worker class TimingLogger;
30*795d594fSAndroid Build Coastguard Worker 
31*795d594fSAndroid Build Coastguard Worker namespace mirror {
32*795d594fSAndroid Build Coastguard Worker class Class;
33*795d594fSAndroid Build Coastguard Worker class FinalizerReference;
34*795d594fSAndroid Build Coastguard Worker class Object;
35*795d594fSAndroid Build Coastguard Worker class Reference;
36*795d594fSAndroid Build Coastguard Worker }  // namespace mirror
37*795d594fSAndroid Build Coastguard Worker 
38*795d594fSAndroid Build Coastguard Worker namespace gc {
39*795d594fSAndroid Build Coastguard Worker 
40*795d594fSAndroid Build Coastguard Worker namespace collector {
41*795d594fSAndroid Build Coastguard Worker class GarbageCollector;
42*795d594fSAndroid Build Coastguard Worker }  // namespace collector
43*795d594fSAndroid Build Coastguard Worker 
44*795d594fSAndroid Build Coastguard Worker class Heap;
45*795d594fSAndroid Build Coastguard Worker 
46*795d594fSAndroid Build Coastguard Worker // Used to process java.lang.ref.Reference instances concurrently or paused.
47*795d594fSAndroid Build Coastguard Worker class ReferenceProcessor {
48*795d594fSAndroid Build Coastguard Worker  public:
49*795d594fSAndroid Build Coastguard Worker   ReferenceProcessor();
50*795d594fSAndroid Build Coastguard Worker 
51*795d594fSAndroid Build Coastguard Worker   // Initialize for a reference processing pass. Called before suspending weak
52*795d594fSAndroid Build Coastguard Worker   // access.
53*795d594fSAndroid Build Coastguard Worker   void Setup(Thread* self,
54*795d594fSAndroid Build Coastguard Worker              collector::GarbageCollector* collector,
55*795d594fSAndroid Build Coastguard Worker              bool concurrent,
56*795d594fSAndroid Build Coastguard Worker              bool clear_soft_references)
57*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::reference_processor_lock_);
58*795d594fSAndroid Build Coastguard Worker   // Enqueue all types of java.lang.ref.References, and mark through finalizers.
59*795d594fSAndroid Build Coastguard Worker   // Assumes there is no concurrent mutator-driven marking, i.e. all potentially
60*795d594fSAndroid Build Coastguard Worker   // mutator-accessible objects should be marked before this.
61*795d594fSAndroid Build Coastguard Worker   void ProcessReferences(Thread* self, TimingLogger* timings)
62*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
63*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::heap_bitmap_lock_)
64*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::reference_processor_lock_);
65*795d594fSAndroid Build Coastguard Worker 
66*795d594fSAndroid Build Coastguard Worker   // The slow path bool is contained in the reference class object, can only be set once
67*795d594fSAndroid Build Coastguard Worker   // Only allow setting this with mutators suspended so that we can avoid using a lock in the
68*795d594fSAndroid Build Coastguard Worker   // GetReferent fast path as an optimization.
69*795d594fSAndroid Build Coastguard Worker   void EnableSlowPath() REQUIRES_SHARED(Locks::mutator_lock_);
70*795d594fSAndroid Build Coastguard Worker   void BroadcastForSlowPath(Thread* self);
71*795d594fSAndroid Build Coastguard Worker   // Decode the referent, may block if references are being processed. In the normal
72*795d594fSAndroid Build Coastguard Worker   // no-read-barrier or Baker-read-barrier cases, we assume reference is not a PhantomReference.
73*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Object> GetReferent(Thread* self, ObjPtr<mirror::Reference> reference)
74*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Locks::reference_processor_lock_);
75*795d594fSAndroid Build Coastguard Worker   // Collects the cleared references and returns a task, to be executed after FinishGC, that will
76*795d594fSAndroid Build Coastguard Worker   // enqueue all of them.
77*795d594fSAndroid Build Coastguard Worker   SelfDeletingTask* CollectClearedReferences(Thread* self) REQUIRES(!Locks::mutator_lock_);
78*795d594fSAndroid Build Coastguard Worker   void DelayReferenceReferent(ObjPtr<mirror::Class> klass,
79*795d594fSAndroid Build Coastguard Worker                               ObjPtr<mirror::Reference> ref,
80*795d594fSAndroid Build Coastguard Worker                               collector::GarbageCollector* collector)
81*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
82*795d594fSAndroid Build Coastguard Worker   void UpdateRoots(IsMarkedVisitor* visitor)
83*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_, Locks::heap_bitmap_lock_);
84*795d594fSAndroid Build Coastguard Worker   // Make a circular list with reference if it is not enqueued. Uses the finalizer queue lock.
85*795d594fSAndroid Build Coastguard Worker   bool MakeCircularListIfUnenqueued(ObjPtr<mirror::FinalizerReference> reference)
86*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
87*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::reference_processor_lock_,
88*795d594fSAndroid Build Coastguard Worker                !Locks::reference_queue_finalizer_references_lock_);
89*795d594fSAndroid Build Coastguard Worker   void ClearReferent(ObjPtr<mirror::Reference> ref)
90*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
91*795d594fSAndroid Build Coastguard Worker       REQUIRES(!Locks::reference_processor_lock_);
92*795d594fSAndroid Build Coastguard Worker   uint32_t ForwardSoftReferences(TimingLogger* timings)
93*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
94*795d594fSAndroid Build Coastguard Worker 
95*795d594fSAndroid Build Coastguard Worker  private:
96*795d594fSAndroid Build Coastguard Worker   bool SlowPathEnabled() REQUIRES_SHARED(Locks::mutator_lock_);
97*795d594fSAndroid Build Coastguard Worker   // Called by ProcessReferences.
98*795d594fSAndroid Build Coastguard Worker   void DisableSlowPath(Thread* self) REQUIRES(Locks::reference_processor_lock_)
99*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
100*795d594fSAndroid Build Coastguard Worker   // Wait until reference processing is done.
101*795d594fSAndroid Build Coastguard Worker   void WaitUntilDoneProcessingReferences(Thread* self)
102*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_)
103*795d594fSAndroid Build Coastguard Worker       REQUIRES(Locks::reference_processor_lock_);
104*795d594fSAndroid Build Coastguard Worker   // Collector which is clearing references, used by the GetReferent to return referents which are
105*795d594fSAndroid Build Coastguard Worker   // already marked. Only updated by thread currently running GC.
106*795d594fSAndroid Build Coastguard Worker   // Guarded by reference_processor_lock_ when not read by collector. Only the collector changes
107*795d594fSAndroid Build Coastguard Worker   // it.
108*795d594fSAndroid Build Coastguard Worker   collector::GarbageCollector* collector_;
109*795d594fSAndroid Build Coastguard Worker   // Reference processor state. Only valid while weak reference processing is suspended.
110*795d594fSAndroid Build Coastguard Worker   // Used by GetReferent and friends to return early.
111*795d594fSAndroid Build Coastguard Worker   enum class RpState : uint8_t { kStarting, kInitMarkingDone, kInitClearingDone };
112*795d594fSAndroid Build Coastguard Worker   RpState rp_state_ GUARDED_BY(Locks::reference_processor_lock_);
113*795d594fSAndroid Build Coastguard Worker   bool concurrent_;  // Running concurrently with mutator? Only used by GC thread.
114*795d594fSAndroid Build Coastguard Worker   bool clear_soft_references_;  // Only used by GC thread.
115*795d594fSAndroid Build Coastguard Worker 
116*795d594fSAndroid Build Coastguard Worker   // Condition that people wait on if they attempt to get the referent of a reference while
117*795d594fSAndroid Build Coastguard Worker   // processing is in progress. Broadcast when an empty checkpoint is requested, but not for other
118*795d594fSAndroid Build Coastguard Worker   // checkpoints or thread suspensions. See mutator_gc_coord.md.
119*795d594fSAndroid Build Coastguard Worker   ConditionVariable condition_ GUARDED_BY(Locks::reference_processor_lock_);
120*795d594fSAndroid Build Coastguard Worker   // Reference queues used by the GC.
121*795d594fSAndroid Build Coastguard Worker   ReferenceQueue soft_reference_queue_;
122*795d594fSAndroid Build Coastguard Worker   ReferenceQueue weak_reference_queue_;
123*795d594fSAndroid Build Coastguard Worker   ReferenceQueue finalizer_reference_queue_;
124*795d594fSAndroid Build Coastguard Worker   ReferenceQueue phantom_reference_queue_;
125*795d594fSAndroid Build Coastguard Worker   ReferenceQueue cleared_references_;
126*795d594fSAndroid Build Coastguard Worker 
127*795d594fSAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(ReferenceProcessor);
128*795d594fSAndroid Build Coastguard Worker };
129*795d594fSAndroid Build Coastguard Worker 
130*795d594fSAndroid Build Coastguard Worker }  // namespace gc
131*795d594fSAndroid Build Coastguard Worker }  // namespace art
132*795d594fSAndroid Build Coastguard Worker 
133*795d594fSAndroid Build Coastguard Worker #endif  // ART_RUNTIME_GC_REFERENCE_PROCESSOR_H_
134