xref: /aosp_15_r20/art/runtime/gc/reference_queue.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2013 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_QUEUE_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_GC_REFERENCE_QUEUE_H_
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker #include <iosfwd>
21*795d594fSAndroid Build Coastguard Worker #include <string>
22*795d594fSAndroid Build Coastguard Worker #include <vector>
23*795d594fSAndroid Build Coastguard Worker 
24*795d594fSAndroid Build Coastguard Worker #include "base/atomic.h"
25*795d594fSAndroid Build Coastguard Worker #include "base/locks.h"
26*795d594fSAndroid Build Coastguard Worker #include "base/macros.h"
27*795d594fSAndroid Build Coastguard Worker #include "base/timing_logger.h"
28*795d594fSAndroid Build Coastguard Worker #include "jni.h"
29*795d594fSAndroid Build Coastguard Worker #include "obj_ptr.h"
30*795d594fSAndroid Build Coastguard Worker #include "offsets.h"
31*795d594fSAndroid Build Coastguard Worker #include "runtime_globals.h"
32*795d594fSAndroid Build Coastguard Worker #include "thread_pool.h"
33*795d594fSAndroid Build Coastguard Worker 
34*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
35*795d594fSAndroid Build Coastguard Worker 
36*795d594fSAndroid Build Coastguard Worker class Mutex;
37*795d594fSAndroid Build Coastguard Worker 
38*795d594fSAndroid Build Coastguard Worker namespace mirror {
39*795d594fSAndroid Build Coastguard Worker class Reference;
40*795d594fSAndroid Build Coastguard Worker }  // namespace mirror
41*795d594fSAndroid Build Coastguard Worker 
42*795d594fSAndroid Build Coastguard Worker class IsMarkedVisitor;
43*795d594fSAndroid Build Coastguard Worker class MarkObjectVisitor;
44*795d594fSAndroid Build Coastguard Worker 
45*795d594fSAndroid Build Coastguard Worker namespace gc {
46*795d594fSAndroid Build Coastguard Worker 
47*795d594fSAndroid Build Coastguard Worker namespace collector {
48*795d594fSAndroid Build Coastguard Worker class GarbageCollector;
49*795d594fSAndroid Build Coastguard Worker }  // namespace collector
50*795d594fSAndroid Build Coastguard Worker 
51*795d594fSAndroid Build Coastguard Worker class Heap;
52*795d594fSAndroid Build Coastguard Worker 
53*795d594fSAndroid Build Coastguard Worker struct FinalizerStats {
FinalizerStatsFinalizerStats54*795d594fSAndroid Build Coastguard Worker   FinalizerStats(size_t num_refs, size_t num_enqueued)
55*795d594fSAndroid Build Coastguard Worker       : num_refs_(num_refs), num_enqueued_(num_enqueued) {}
56*795d594fSAndroid Build Coastguard Worker   const uint32_t num_refs_;
57*795d594fSAndroid Build Coastguard Worker   const uint32_t num_enqueued_;
58*795d594fSAndroid Build Coastguard Worker };
59*795d594fSAndroid Build Coastguard Worker 
60*795d594fSAndroid Build Coastguard Worker // Used to temporarily store java.lang.ref.Reference(s) during GC and prior to queueing on the
61*795d594fSAndroid Build Coastguard Worker // appropriate java.lang.ref.ReferenceQueue. The linked list is maintained as an unordered,
62*795d594fSAndroid Build Coastguard Worker // circular, and singly-linked list using the pendingNext fields of the java.lang.ref.Reference
63*795d594fSAndroid Build Coastguard Worker // objects.
64*795d594fSAndroid Build Coastguard Worker class ReferenceQueue {
65*795d594fSAndroid Build Coastguard Worker  public:
66*795d594fSAndroid Build Coastguard Worker   explicit ReferenceQueue(Mutex* lock);
67*795d594fSAndroid Build Coastguard Worker 
68*795d594fSAndroid Build Coastguard Worker   // Enqueue a reference if it is unprocessed. Thread safe to call from multiple
69*795d594fSAndroid Build Coastguard Worker   // threads since it uses a lock to avoid a race between checking for the references presence and
70*795d594fSAndroid Build Coastguard Worker   // adding it.
71*795d594fSAndroid Build Coastguard Worker   void AtomicEnqueueIfNotEnqueued(Thread* self, ObjPtr<mirror::Reference> ref)
72*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!*lock_);
73*795d594fSAndroid Build Coastguard Worker 
74*795d594fSAndroid Build Coastguard Worker   // Enqueue a reference. The reference must be unprocessed.
75*795d594fSAndroid Build Coastguard Worker   // Not thread safe, used when mutators are paused to minimize lock overhead.
76*795d594fSAndroid Build Coastguard Worker   void EnqueueReference(ObjPtr<mirror::Reference> ref) REQUIRES_SHARED(Locks::mutator_lock_);
77*795d594fSAndroid Build Coastguard Worker 
78*795d594fSAndroid Build Coastguard Worker   // Dequeue a reference from the queue and return that dequeued reference.
79*795d594fSAndroid Build Coastguard Worker   // Call DisableReadBarrierForReference for the reference that's returned from this function.
80*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Reference> DequeuePendingReference() REQUIRES_SHARED(Locks::mutator_lock_);
81*795d594fSAndroid Build Coastguard Worker 
82*795d594fSAndroid Build Coastguard Worker   // If applicable, disable the read barrier for the reference after its referent is handled (see
83*795d594fSAndroid Build Coastguard Worker   // ConcurrentCopying::ProcessMarkStackRef.) This must be called for a reference that's dequeued
84*795d594fSAndroid Build Coastguard Worker   // from pending queue (DequeuePendingReference). 'order' is expected to be
85*795d594fSAndroid Build Coastguard Worker   // 'release' if called outside 'weak-ref access disabled' critical section.
86*795d594fSAndroid Build Coastguard Worker   // Otherwise 'relaxed' order will suffice.
87*795d594fSAndroid Build Coastguard Worker   void DisableReadBarrierForReference(ObjPtr<mirror::Reference> ref, std::memory_order order)
88*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
89*795d594fSAndroid Build Coastguard Worker 
90*795d594fSAndroid Build Coastguard Worker   // Enqueues finalizer references with white referents.  White referents are blackened, moved to
91*795d594fSAndroid Build Coastguard Worker   // the zombie field, and the referent field is cleared.
92*795d594fSAndroid Build Coastguard Worker   FinalizerStats EnqueueFinalizerReferences(ReferenceQueue* cleared_references,
93*795d594fSAndroid Build Coastguard Worker                                   collector::GarbageCollector* collector)
94*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
95*795d594fSAndroid Build Coastguard Worker 
96*795d594fSAndroid Build Coastguard Worker   // Walks the reference list marking and dequeuing any references subject to the reference
97*795d594fSAndroid Build Coastguard Worker   // clearing policy.  References with a black referent are removed from the list.  References
98*795d594fSAndroid Build Coastguard Worker   // with white referents biased toward saving are blackened and also removed from the list.
99*795d594fSAndroid Build Coastguard Worker   // Returns the number of non-null soft references. May be called concurrently with
100*795d594fSAndroid Build Coastguard Worker   // AtomicEnqueueIfNotEnqueued().
101*795d594fSAndroid Build Coastguard Worker   uint32_t ForwardSoftReferences(MarkObjectVisitor* visitor)
102*795d594fSAndroid Build Coastguard Worker       REQUIRES(!*lock_)
103*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
104*795d594fSAndroid Build Coastguard Worker 
105*795d594fSAndroid Build Coastguard Worker   // Unlink the reference list clearing references objects with white referents. Cleared references
106*795d594fSAndroid Build Coastguard Worker   // registered to a reference queue are scheduled for appending by the heap worker thread.
107*795d594fSAndroid Build Coastguard Worker   void ClearWhiteReferences(ReferenceQueue* cleared_references,
108*795d594fSAndroid Build Coastguard Worker                             collector::GarbageCollector* collector,
109*795d594fSAndroid Build Coastguard Worker                             bool report_cleared = false)
110*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
111*795d594fSAndroid Build Coastguard Worker 
112*795d594fSAndroid Build Coastguard Worker   void Dump(std::ostream& os) const REQUIRES_SHARED(Locks::mutator_lock_);
113*795d594fSAndroid Build Coastguard Worker   size_t GetLength() const REQUIRES_SHARED(Locks::mutator_lock_);
114*795d594fSAndroid Build Coastguard Worker 
IsEmpty()115*795d594fSAndroid Build Coastguard Worker   bool IsEmpty() const {
116*795d594fSAndroid Build Coastguard Worker     return list_ == nullptr;
117*795d594fSAndroid Build Coastguard Worker   }
118*795d594fSAndroid Build Coastguard Worker 
119*795d594fSAndroid Build Coastguard Worker   // Clear this queue. Only safe after handing off the contents elsewhere for further processing.
Clear()120*795d594fSAndroid Build Coastguard Worker   void Clear() {
121*795d594fSAndroid Build Coastguard Worker     list_ = nullptr;
122*795d594fSAndroid Build Coastguard Worker   }
123*795d594fSAndroid Build Coastguard Worker 
GetList()124*795d594fSAndroid Build Coastguard Worker   mirror::Reference* GetList() REQUIRES_SHARED(Locks::mutator_lock_) {
125*795d594fSAndroid Build Coastguard Worker     return list_;
126*795d594fSAndroid Build Coastguard Worker   }
127*795d594fSAndroid Build Coastguard Worker 
128*795d594fSAndroid Build Coastguard Worker   // Visits list_, currently only used for the mark compact GC.
129*795d594fSAndroid Build Coastguard Worker   void UpdateRoots(IsMarkedVisitor* visitor)
130*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_);
131*795d594fSAndroid Build Coastguard Worker 
132*795d594fSAndroid Build Coastguard Worker  private:
133*795d594fSAndroid Build Coastguard Worker   // Lock, used for parallel GC reference enqueuing. It allows for multiple threads simultaneously
134*795d594fSAndroid Build Coastguard Worker   // calling AtomicEnqueueIfNotEnqueued.
135*795d594fSAndroid Build Coastguard Worker   Mutex* const lock_;
136*795d594fSAndroid Build Coastguard Worker   // The actual reference list. Only a root for the mark compact GC since it
137*795d594fSAndroid Build Coastguard Worker   // will be null during root marking for other GC types. Not an ObjPtr since it
138*795d594fSAndroid Build Coastguard Worker   // is accessed from multiple threads.  Points to a singly-linked circular list
139*795d594fSAndroid Build Coastguard Worker   // using the pendingNext field.
140*795d594fSAndroid Build Coastguard Worker   mirror::Reference* list_;
141*795d594fSAndroid Build Coastguard Worker 
142*795d594fSAndroid Build Coastguard Worker   DISALLOW_IMPLICIT_CONSTRUCTORS(ReferenceQueue);
143*795d594fSAndroid Build Coastguard Worker };
144*795d594fSAndroid Build Coastguard Worker 
145*795d594fSAndroid Build Coastguard Worker }  // namespace gc
146*795d594fSAndroid Build Coastguard Worker }  // namespace art
147*795d594fSAndroid Build Coastguard Worker 
148*795d594fSAndroid Build Coastguard Worker #endif  // ART_RUNTIME_GC_REFERENCE_QUEUE_H_
149