1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ART_RUNTIME_GC_REFERENCE_PROCESSOR_H_ 18 #define ART_RUNTIME_GC_REFERENCE_PROCESSOR_H_ 19 20 #include "base/mutex.h" 21 #include "globals.h" 22 #include "jni.h" 23 #include "object_callbacks.h" 24 #include "reference_queue.h" 25 26 namespace art { 27 28 class TimingLogger; 29 30 namespace mirror { 31 class Class; 32 class FinalizerReference; 33 class Object; 34 class Reference; 35 } // namespace mirror 36 37 namespace gc { 38 39 namespace collector { 40 class GarbageCollector; 41 } // namespace collector 42 43 class Heap; 44 45 // Used to process java.lang.ref.Reference instances concurrently or paused. 46 class ReferenceProcessor { 47 public: 48 explicit ReferenceProcessor(); 49 void ProcessReferences(bool concurrent, 50 TimingLogger* timings, 51 bool clear_soft_references, 52 gc::collector::GarbageCollector* collector) 53 REQUIRES_SHARED(Locks::mutator_lock_) 54 REQUIRES(Locks::heap_bitmap_lock_) 55 REQUIRES(!Locks::reference_processor_lock_); 56 // The slow path bool is contained in the reference class object, can only be set once 57 // Only allow setting this with mutators suspended so that we can avoid using a lock in the 58 // GetReferent fast path as an optimization. 59 void EnableSlowPath() REQUIRES_SHARED(Locks::mutator_lock_); 60 void BroadcastForSlowPath(Thread* self); 61 // Decode the referent, may block if references are being processed. 62 ObjPtr<mirror::Object> GetReferent(Thread* self, ObjPtr<mirror::Reference> reference) 63 REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Locks::reference_processor_lock_); 64 void EnqueueClearedReferences(Thread* self) REQUIRES(!Locks::mutator_lock_); 65 void DelayReferenceReferent(ObjPtr<mirror::Class> klass, 66 ObjPtr<mirror::Reference> ref, 67 collector::GarbageCollector* collector) 68 REQUIRES_SHARED(Locks::mutator_lock_); 69 void UpdateRoots(IsMarkedVisitor* visitor) 70 REQUIRES_SHARED(Locks::mutator_lock_, Locks::heap_bitmap_lock_); 71 // Make a circular list with reference if it is not enqueued. Uses the finalizer queue lock. 72 bool MakeCircularListIfUnenqueued(ObjPtr<mirror::FinalizerReference> reference) 73 REQUIRES_SHARED(Locks::mutator_lock_) 74 REQUIRES(!Locks::reference_processor_lock_, 75 !Locks::reference_queue_finalizer_references_lock_); 76 void ClearReferent(ObjPtr<mirror::Reference> ref) 77 REQUIRES_SHARED(Locks::mutator_lock_) 78 REQUIRES(!Locks::reference_processor_lock_); 79 80 private: 81 bool SlowPathEnabled() REQUIRES_SHARED(Locks::mutator_lock_); 82 // Called by ProcessReferences. 83 void DisableSlowPath(Thread* self) REQUIRES(Locks::reference_processor_lock_) 84 REQUIRES_SHARED(Locks::mutator_lock_); 85 // If we are preserving references it means that some dead objects may become live, we use start 86 // and stop preserving to block mutators using GetReferrent from getting access to these 87 // referents. 88 void StartPreservingReferences(Thread* self) REQUIRES(!Locks::reference_processor_lock_); 89 void StopPreservingReferences(Thread* self) REQUIRES(!Locks::reference_processor_lock_); 90 // Wait until reference processing is done. 91 void WaitUntilDoneProcessingReferences(Thread* self) 92 REQUIRES_SHARED(Locks::mutator_lock_) 93 REQUIRES(Locks::reference_processor_lock_); 94 // Collector which is clearing references, used by the GetReferent to return referents which are 95 // already marked. 96 collector::GarbageCollector* collector_ GUARDED_BY(Locks::reference_processor_lock_); 97 // Boolean for whether or not we are preserving references (either soft references or finalizers). 98 // If this is true, then we cannot return a referent (see comment in GetReferent). 99 bool preserving_references_ GUARDED_BY(Locks::reference_processor_lock_); 100 // Condition that people wait on if they attempt to get the referent of a reference while 101 // processing is in progress. 102 ConditionVariable condition_ GUARDED_BY(Locks::reference_processor_lock_); 103 // Reference queues used by the GC. 104 ReferenceQueue soft_reference_queue_; 105 ReferenceQueue weak_reference_queue_; 106 ReferenceQueue finalizer_reference_queue_; 107 ReferenceQueue phantom_reference_queue_; 108 ReferenceQueue cleared_references_; 109 110 DISALLOW_COPY_AND_ASSIGN(ReferenceProcessor); 111 }; 112 113 } // namespace gc 114 } // namespace art 115 116 #endif // ART_RUNTIME_GC_REFERENCE_PROCESSOR_H_ 117