diff options
Diffstat (limited to 'runtime/mirror/reference.h')
-rw-r--r-- | runtime/mirror/reference.h | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/runtime/mirror/reference.h b/runtime/mirror/reference.h index 9c9d87be01..15e0145baf 100644 --- a/runtime/mirror/reference.h +++ b/runtime/mirror/reference.h @@ -17,7 +17,10 @@ #ifndef ART_RUNTIME_MIRROR_REFERENCE_H_ #define ART_RUNTIME_MIRROR_REFERENCE_H_ +#include "class.h" #include "object.h" +#include "object_callbacks.h" +#include "thread.h" namespace art { @@ -29,9 +32,11 @@ class ReferenceQueue; } // namespace gc struct ReferenceOffsets; +struct ReferenceClassOffsets; struct FinalizerReferenceOffsets; namespace mirror { +class ReferenceClass; // C++ mirror of java.lang.ref.Reference class MANAGED Reference : public Object { @@ -80,6 +85,15 @@ class MANAGED Reference : public Object { bool IsEnqueuable() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + static ReferenceClass* GetJavaLangRefReference() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + CHECK(java_lang_ref_Reference_ != nullptr); + return ReadBarrier::BarrierForRoot<mirror::ReferenceClass, kWithReadBarrier>( + &java_lang_ref_Reference_); + } + static void SetClass(ReferenceClass* klass); + static void ResetClass(void); + static void VisitRoots(RootCallback* callback, void* arg); + private: // Note: This avoids a read barrier, it should only be used by the GC. HeapReference<Object>* GetReferentReferenceAddr() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { @@ -92,12 +106,46 @@ class MANAGED Reference : public Object { HeapReference<Reference> queue_next_; // Note this is Java volatile: HeapReference<Object> referent_; // Note this is Java volatile: + static ReferenceClass* java_lang_ref_Reference_; + friend struct art::ReferenceOffsets; // for verifying offset information friend class gc::ReferenceProcessor; friend class gc::ReferenceQueue; DISALLOW_IMPLICIT_CONSTRUCTORS(Reference); }; +// Tightly coupled with the ReferenceProcessor to provide switch for slow/fast path. Consistency +// is maintained by ReferenceProcessor. +class MANAGED ReferenceClass : public Class { + public: + static MemberOffset DisableIntrinsicOffset() { + return OFFSET_OF_OBJECT_MEMBER(ReferenceClass, disable_intrinsic_); + } + static MemberOffset SlowPathEnabledOffset() { + return OFFSET_OF_OBJECT_MEMBER(ReferenceClass, slow_path_enabled_); + } + + void Init() { + disable_intrinsic_ = false; + slow_path_enabled_ = false; + } + + bool GetSlowPathEnabled() const { + return slow_path_enabled_; + } + void SetSlowPathEnabled(bool enabled) { + slow_path_enabled_ = enabled; + } + + private: + int32_t disable_intrinsic_; + int32_t slow_path_enabled_; + // allows runtime to safely enable/disable intrinsics fast path for benchmarking + + friend struct art::ReferenceClassOffsets; // for verifying offset information + DISALLOW_IMPLICIT_CONSTRUCTORS(ReferenceClass); +}; + // C++ mirror of java.lang.ref.FinalizerReference class MANAGED FinalizerReference : public Reference { public: |