reference_processor.h revision 308351ada0008b0cbe1a5afc31c302c975554ee4
178f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier/* 278f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * Copyright (C) 2014 The Android Open Source Project 378f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * 478f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * Licensed under the Apache License, Version 2.0 (the "License"); 578f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * you may not use this file except in compliance with the License. 678f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * You may obtain a copy of the License at 778f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * 878f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * http://www.apache.org/licenses/LICENSE-2.0 978f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * 1078f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * Unless required by applicable law or agreed to in writing, software 1178f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * distributed under the License is distributed on an "AS IS" BASIS, 1278f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1378f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * See the License for the specific language governing permissions and 1478f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * limitations under the License. 1578f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier */ 1678f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier 1778f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier#ifndef ART_RUNTIME_GC_REFERENCE_PROCESSOR_H_ 1878f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier#define ART_RUNTIME_GC_REFERENCE_PROCESSOR_H_ 1978f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier 2078f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier#include "base/mutex.h" 2178f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier#include "globals.h" 2278f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier#include "jni.h" 2378f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier#include "object_callbacks.h" 2478f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier#include "reference_queue.h" 2578f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier 2678f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartiernamespace art { 2778f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier 2878f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartierclass TimingLogger; 2978f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier 3078f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartiernamespace mirror { 3178f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartierclass Object; 3278f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartierclass Reference; 3378f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier} // namespace mirror 3478f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier 3578f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartiernamespace gc { 3678f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier 3778f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartierclass Heap; 3878f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier 3978f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier// Used to process java.lang.References concurrently or paused. 4078f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartierclass ReferenceProcessor { 4178f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier public: 4278f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier explicit ReferenceProcessor(); 43308351ada0008b0cbe1a5afc31c302c975554ee4Mathieu Chartier static bool PreserveSoftReferenceCallback(mirror::HeapReference<mirror::Object>* obj, void* arg) 44308351ada0008b0cbe1a5afc31c302c975554ee4Mathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4578f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier void ProcessReferences(bool concurrent, TimingLogger* timings, bool clear_soft_references, 46308351ada0008b0cbe1a5afc31c302c975554ee4Mathieu Chartier IsHeapReferenceMarkedCallback* is_marked_callback, 4778f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier MarkObjectCallback* mark_object_callback, 4878f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier ProcessMarkStackCallback* process_mark_stack_callback, void* arg) 4978f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) 5078f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_) 5178f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier LOCKS_EXCLUDED(lock_); 5278f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier // Only allow setting this with mutators suspended so that we can avoid using a lock in the 5378f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier // GetReferent fast path as an optimization. 5478f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier void EnableSlowPath() EXCLUSIVE_LOCKS_REQUIRED(Locks::mutator_lock_); 5578f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier // Decode the referent, may block if references are being processed. 5678f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier mirror::Object* GetReferent(Thread* self, mirror::Reference* reference) 5778f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) LOCKS_EXCLUDED(lock_); 58308351ada0008b0cbe1a5afc31c302c975554ee4Mathieu Chartier void EnqueueClearedReferences(Thread* self) LOCKS_EXCLUDED(Locks::mutator_lock_); 5978f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier void DelayReferenceReferent(mirror::Class* klass, mirror::Reference* ref, 60308351ada0008b0cbe1a5afc31c302c975554ee4Mathieu Chartier IsHeapReferenceMarkedCallback* is_marked_callback, void* arg) 6178f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6278f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier 6378f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier private: 6478f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier class ProcessReferencesArgs { 6578f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier public: 66308351ada0008b0cbe1a5afc31c302c975554ee4Mathieu Chartier ProcessReferencesArgs(IsHeapReferenceMarkedCallback* is_marked_callback, 6778f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier MarkObjectCallback* mark_callback, void* arg) 6878f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier : is_marked_callback_(is_marked_callback), mark_callback_(mark_callback), arg_(arg) { 6978f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier } 7078f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier 7178f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier // The is marked callback is null when the args aren't set up. 72308351ada0008b0cbe1a5afc31c302c975554ee4Mathieu Chartier IsHeapReferenceMarkedCallback* is_marked_callback_; 7378f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier MarkObjectCallback* mark_callback_; 7478f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier void* arg_; 7578f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier }; 7678f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier // Called by ProcessReferences. 7778f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier void DisableSlowPath(Thread* self) EXCLUSIVE_LOCKS_REQUIRED(lock_); 7878f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier // If we are preserving references it means that some dead objects may become live, we use start 7978f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier // and stop preserving to block mutators using GetReferrent from getting access to these 8078f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier // referents. 8178f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier void StartPreservingReferences(Thread* self) LOCKS_EXCLUDED(lock_); 8278f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier void StopPreservingReferences(Thread* self) LOCKS_EXCLUDED(lock_); 8378f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier // Process args, used by the GetReferent to return referents which are already marked. 8478f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier ProcessReferencesArgs process_references_args_ GUARDED_BY(lock_); 8578f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier // Boolean for whether or not we need to go slow path in GetReferent. 8678f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier volatile bool slow_path_enabled_; 8778f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier // Boolean for whether or not we are preserving references (either soft references or finalizers). 8878f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier // If this is true, then we cannot return a referent (see comment in GetReferent). 8978f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier bool preserving_references_ GUARDED_BY(lock_); 9078f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier // Lock that guards the reference processing. 9178f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier Mutex lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 9278f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier // Condition that people wait on if they attempt to get the referent of a reference while 9378f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier // processing is in progress. 9478f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier ConditionVariable condition_ GUARDED_BY(lock_); 9578f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier // Reference queues used by the GC. 9678f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier ReferenceQueue soft_reference_queue_; 9778f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier ReferenceQueue weak_reference_queue_; 9878f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier ReferenceQueue finalizer_reference_queue_; 9978f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier ReferenceQueue phantom_reference_queue_; 10078f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier ReferenceQueue cleared_references_; 10178f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier}; 10278f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier 10378f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier} // namespace gc 10478f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier} // namespace art 10578f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier 10678f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier#endif // ART_RUNTIME_GC_REFERENCE_PROCESSOR_H_ 107