diff options
-rw-r--r-- | compiler/image_writer.cc | 2 | ||||
-rw-r--r-- | runtime/globals.h | 1 | ||||
-rw-r--r-- | runtime/mirror/array-inl.h | 4 | ||||
-rw-r--r-- | runtime/mirror/array.h | 3 | ||||
-rw-r--r-- | runtime/mirror/art_method.h | 2 | ||||
-rw-r--r-- | runtime/mirror/class-inl.h | 10 | ||||
-rw-r--r-- | runtime/mirror/class.h | 21 | ||||
-rw-r--r-- | runtime/mirror/object-inl.h | 67 | ||||
-rw-r--r-- | runtime/mirror/object.h | 28 | ||||
-rw-r--r-- | runtime/read_barrier-inl.h | 7 | ||||
-rw-r--r-- | runtime/read_barrier.h | 2 | ||||
-rw-r--r-- | runtime/read_barrier_option.h | 29 |
12 files changed, 112 insertions, 64 deletions
diff --git a/compiler/image_writer.cc b/compiler/image_writer.cc index e6d983f..62817e7 100644 --- a/compiler/image_writer.cc +++ b/compiler/image_writer.cc @@ -587,7 +587,7 @@ class FixupVisitor { void operator()(Object* obj, MemberOffset offset, bool /*is_static*/) const EXCLUSIVE_LOCKS_REQUIRED(Locks::mutator_lock_, Locks::heap_bitmap_lock_) { - Object* ref = obj->GetFieldObject<Object, kVerifyNone, false>(offset); + Object* ref = obj->GetFieldObject<Object, kVerifyNone>(offset); // Use SetFieldObjectWithoutWriteBarrier to avoid card marking since we are writing to the // image. copy_->SetFieldObjectWithoutWriteBarrier<false, true, kVerifyNone>( diff --git a/runtime/globals.h b/runtime/globals.h index e3c54b8..eb52a46 100644 --- a/runtime/globals.h +++ b/runtime/globals.h @@ -20,6 +20,7 @@ #include <stddef.h> #include <stdint.h> #include "read_barrier_c.h" +#include "read_barrier_option.h" namespace art { diff --git a/runtime/mirror/array-inl.h b/runtime/mirror/array-inl.h index bc8d348..65799cd 100644 --- a/runtime/mirror/array-inl.h +++ b/runtime/mirror/array-inl.h @@ -27,11 +27,11 @@ namespace art { namespace mirror { -template<VerifyObjectFlags kVerifyFlags, bool kDoReadBarrier> +template<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> inline size_t Array::SizeOf() { // This is safe from overflow because the array was already allocated, so we know it's sane. size_t component_size = - GetClass<kVerifyFlags, kDoReadBarrier>()->template GetComponentSize<kDoReadBarrier>(); + GetClass<kVerifyFlags, kReadBarrierOption>()->template GetComponentSize<kReadBarrierOption>(); // Don't need to check this since we already check this in GetClass. int32_t component_count = GetLength<static_cast<VerifyObjectFlags>(kVerifyFlags & ~kVerifyThis)>(); diff --git a/runtime/mirror/array.h b/runtime/mirror/array.h index 92f0e67..eead4eb 100644 --- a/runtime/mirror/array.h +++ b/runtime/mirror/array.h @@ -42,7 +42,8 @@ class MANAGED Array : public Object { const SirtRef<IntArray>& dimensions) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kDoReadBarrier = true> + template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, + ReadBarrierOption kReadBarrierOption = kWithReadBarrier> size_t SizeOf() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> int32_t GetLength() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { diff --git a/runtime/mirror/art_method.h b/runtime/mirror/art_method.h index f61a01d..71f0210 100644 --- a/runtime/mirror/art_method.h +++ b/runtime/mirror/art_method.h @@ -411,7 +411,7 @@ class MANAGED ArtMethod : public Object { static void SetClass(Class* java_lang_reflect_ArtMethod); - template <bool kDoReadBarrier = true> + template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier> static Class* GetJavaLangReflectArtMethod() { // This does not need a RB because it is a root. return java_lang_reflect_ArtMethod_; diff --git a/runtime/mirror/class-inl.h b/runtime/mirror/class-inl.h index 8a1f383..a7672f2 100644 --- a/runtime/mirror/class-inl.h +++ b/runtime/mirror/class-inl.h @@ -492,17 +492,17 @@ inline void Class::VisitReferences(mirror::Class* klass, const Visitor& visitor) VisitStaticFieldsReferences<kVisitClass>(this, visitor); } -template<bool kDoReadBarrier> +template<ReadBarrierOption kReadBarrierOption> bool Class::IsArtFieldClass() { - Class* java_lang_Class = GetClass<kVerifyNone, kDoReadBarrier>(); + Class* java_lang_Class = GetClass<kVerifyNone, kReadBarrierOption>(); Class* java_lang_reflect_ArtField = - java_lang_Class->GetInstanceField(0)->GetClass<kVerifyNone, kDoReadBarrier>(); + java_lang_Class->GetInstanceField(0)->GetClass<kVerifyNone, kReadBarrierOption>(); return this == java_lang_reflect_ArtField; } -template<bool kDoReadBarrier> +template<ReadBarrierOption kReadBarrierOption> bool Class::IsArtMethodClass() { - return this == ArtMethod::GetJavaLangReflectArtMethod<kDoReadBarrier>(); + return this == ArtMethod::GetJavaLangReflectArtMethod<kReadBarrierOption>(); } } // namespace mirror diff --git a/runtime/mirror/class.h b/runtime/mirror/class.h index 23211c2..bbadad6 100644 --- a/runtime/mirror/class.h +++ b/runtime/mirror/class.h @@ -360,9 +360,10 @@ class MANAGED Class : public Object { return depth; } - template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kDoReadBarrier = true> + template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, + ReadBarrierOption kReadBarrierOption = kWithReadBarrier> bool IsArrayClass() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { - return GetComponentType<kVerifyFlags, kDoReadBarrier>() != NULL; + return GetComponentType<kVerifyFlags, kReadBarrierOption>() != NULL; } bool IsClassClass() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); @@ -371,19 +372,20 @@ class MANAGED Class : public Object { bool IsThrowableClass() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - template<bool kDoReadBarrier = true> + template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier> bool IsArtFieldClass() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - template<bool kDoReadBarrier = true> + template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier> bool IsArtMethodClass(); static MemberOffset ComponentTypeOffset() { return OFFSET_OF_OBJECT_MEMBER(Class, component_type_); } - template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kDoReadBarrier = true> + template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, + ReadBarrierOption kReadBarrierOption = kWithReadBarrier> Class* GetComponentType() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { - return GetFieldObject<Class, kVerifyFlags, kDoReadBarrier>(ComponentTypeOffset()); + return GetFieldObject<Class, kVerifyFlags, kReadBarrierOption>(ComponentTypeOffset()); } void SetComponentType(Class* new_component_type) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { @@ -393,10 +395,10 @@ class MANAGED Class : public Object { SetFieldObject<false, false>(ComponentTypeOffset(), new_component_type); } - template<bool kDoReadBarrier = true> + template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier> size_t GetComponentSize() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { return Primitive::ComponentSize( - GetComponentType<kDefaultVerifyFlags, kDoReadBarrier>()->GetPrimitiveType()); + GetComponentType<kDefaultVerifyFlags, kReadBarrierOption>()->GetPrimitiveType()); } bool IsObjectClass() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { @@ -427,7 +429,8 @@ class MANAGED Class : public Object { return IsClassClass() || IsArrayClass(); } - template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kDoReadBarrier = true> + template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, + ReadBarrierOption kReadBarrierOption = kWithReadBarrier> uint32_t SizeOf() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { return GetField32<kVerifyFlags>(OFFSET_OF_OBJECT_MEMBER(Class, class_size_)); } diff --git a/runtime/mirror/object-inl.h b/runtime/mirror/object-inl.h index c70a08d..86824ff 100644 --- a/runtime/mirror/object-inl.h +++ b/runtime/mirror/object-inl.h @@ -34,9 +34,9 @@ namespace art { namespace mirror { -template<VerifyObjectFlags kVerifyFlags, bool kDoReadBarrier> +template<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> inline Class* Object::GetClass() { - return GetFieldObject<Class, kVerifyFlags, kDoReadBarrier>( + return GetFieldObject<Class, kVerifyFlags, kReadBarrierOption>( OFFSET_OF_OBJECT_MEMBER(Object, klass_)); } @@ -181,17 +181,17 @@ inline bool Object::InstanceOf(Class* klass) { return klass->IsAssignableFrom(GetClass<kVerifyFlags>()); } -template<VerifyObjectFlags kVerifyFlags, bool kDoReadBarrier> +template<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> inline bool Object::IsClass() { - Class* java_lang_Class = - GetClass<kVerifyFlags, kDoReadBarrier>()->template GetClass<kVerifyFlags, kDoReadBarrier>(); - return GetClass<static_cast<VerifyObjectFlags>(kVerifyFlags & ~kVerifyThis), kDoReadBarrier>() == - java_lang_Class; + Class* java_lang_Class = GetClass<kVerifyFlags, kReadBarrierOption>()-> + template GetClass<kVerifyFlags, kReadBarrierOption>(); + return GetClass<static_cast<VerifyObjectFlags>(kVerifyFlags & ~kVerifyThis), + kReadBarrierOption>() == java_lang_Class; } -template<VerifyObjectFlags kVerifyFlags, bool kDoReadBarrier> +template<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> inline Class* Object::AsClass() { - DCHECK((IsClass<kVerifyFlags, kDoReadBarrier>())); + DCHECK((IsClass<kVerifyFlags, kReadBarrierOption>())); return down_cast<Class*>(this); } @@ -208,15 +208,16 @@ inline ObjectArray<T>* Object::AsObjectArray() { return down_cast<ObjectArray<T>*>(this); } -template<VerifyObjectFlags kVerifyFlags, bool kDoReadBarrier> +template<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> inline bool Object::IsArrayInstance() { - return GetClass<kVerifyFlags, kDoReadBarrier>()-> - template IsArrayClass<kVerifyFlags, kDoReadBarrier>(); + return GetClass<kVerifyFlags, kReadBarrierOption>()-> + template IsArrayClass<kVerifyFlags, kReadBarrierOption>(); } -template<VerifyObjectFlags kVerifyFlags, bool kDoReadBarrier> +template<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> inline bool Object::IsArtField() { - return GetClass<kVerifyFlags, kDoReadBarrier>()->template IsArtFieldClass<kDoReadBarrier>(); + return GetClass<kVerifyFlags, kReadBarrierOption>()-> + template IsArtFieldClass<kReadBarrierOption>(); } template<VerifyObjectFlags kVerifyFlags> @@ -225,9 +226,10 @@ inline ArtField* Object::AsArtField() { return down_cast<ArtField*>(this); } -template<VerifyObjectFlags kVerifyFlags, bool kDoReadBarrier> +template<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> inline bool Object::IsArtMethod() { - return GetClass<kVerifyFlags, kDoReadBarrier>()->template IsArtMethodClass<kDoReadBarrier>(); + return GetClass<kVerifyFlags, kReadBarrierOption>()-> + template IsArtMethodClass<kReadBarrierOption>(); } template<VerifyObjectFlags kVerifyFlags> @@ -247,9 +249,9 @@ inline Reference* Object::AsReference() { return down_cast<Reference*>(this); } -template<VerifyObjectFlags kVerifyFlags, bool kDoReadBarrier> +template<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> inline Array* Object::AsArray() { - DCHECK((IsArrayInstance<kVerifyFlags, kDoReadBarrier>())); + DCHECK((IsArrayInstance<kVerifyFlags, kReadBarrierOption>())); return down_cast<Array*>(this); } @@ -375,21 +377,23 @@ inline bool Object::IsPhantomReferenceInstance() { return GetClass<kVerifyFlags>()->IsPhantomReferenceClass(); } -template<VerifyObjectFlags kVerifyFlags, bool kDoReadBarrier> +template<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> inline size_t Object::SizeOf() { size_t result; constexpr auto kNewFlags = static_cast<VerifyObjectFlags>(kVerifyFlags & ~kVerifyThis); - if (IsArrayInstance<kVerifyFlags, kDoReadBarrier>()) { - result = AsArray<kNewFlags, kDoReadBarrier>()->template SizeOf<kNewFlags, kDoReadBarrier>(); - } else if (IsClass<kNewFlags, kDoReadBarrier>()) { - result = AsClass<kNewFlags, kDoReadBarrier>()->template SizeOf<kNewFlags, kDoReadBarrier>(); + if (IsArrayInstance<kVerifyFlags, kReadBarrierOption>()) { + result = AsArray<kNewFlags, kReadBarrierOption>()-> + template SizeOf<kNewFlags, kReadBarrierOption>(); + } else if (IsClass<kNewFlags, kReadBarrierOption>()) { + result = AsClass<kNewFlags, kReadBarrierOption>()-> + template SizeOf<kNewFlags, kReadBarrierOption>(); } else { - result = GetClass<kNewFlags, kDoReadBarrier>()->GetObjectSize(); + result = GetClass<kNewFlags, kReadBarrierOption>()->GetObjectSize(); } DCHECK_GE(result, sizeof(Object)) - << " class=" << PrettyTypeOf(GetClass<kNewFlags, kDoReadBarrier>()); - DCHECK(!(IsArtField<kNewFlags, kDoReadBarrier>()) || result == sizeof(ArtField)); - DCHECK(!(IsArtMethod<kNewFlags, kDoReadBarrier>()) || result == sizeof(ArtMethod)); + << " class=" << PrettyTypeOf(GetClass<kNewFlags, kReadBarrierOption>()); + DCHECK(!(IsArtField<kNewFlags, kReadBarrierOption>()) || result == sizeof(ArtField)); + DCHECK(!(IsArtMethod<kNewFlags, kReadBarrierOption>()) || result == sizeof(ArtMethod)); return result; } @@ -532,14 +536,15 @@ inline bool Object::CasField64(MemberOffset field_offset, int64_t old_value, int return QuasiAtomic::Cas64(old_value, new_value, addr); } -template<class T, VerifyObjectFlags kVerifyFlags, bool kDoReadBarrier, bool kIsVolatile> +template<class T, VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption, + bool kIsVolatile> inline T* Object::GetFieldObject(MemberOffset field_offset) { if (kVerifyFlags & kVerifyThis) { VerifyObject(this); } byte* raw_addr = reinterpret_cast<byte*>(this) + field_offset.Int32Value(); HeapReference<T>* objref_addr = reinterpret_cast<HeapReference<T>*>(raw_addr); - T* result = ReadBarrier::Barrier<T, kDoReadBarrier>(this, field_offset, objref_addr); + T* result = ReadBarrier::Barrier<T, kReadBarrierOption>(this, field_offset, objref_addr); if (kIsVolatile) { QuasiAtomic::MembarLoadLoad(); // Ensure loads don't re-order. } @@ -549,9 +554,9 @@ inline T* Object::GetFieldObject(MemberOffset field_offset) { return result; } -template<class T, VerifyObjectFlags kVerifyFlags, bool kDoReadBarrier> +template<class T, VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> inline T* Object::GetFieldObjectVolatile(MemberOffset field_offset) { - return GetFieldObject<T, kVerifyFlags, kDoReadBarrier, true>(field_offset); + return GetFieldObject<T, kVerifyFlags, kReadBarrierOption, true>(field_offset); } template<bool kTransactionActive, bool kCheckTransaction, VerifyObjectFlags kVerifyFlags, diff --git a/runtime/mirror/object.h b/runtime/mirror/object.h index cf28b18..442909d 100644 --- a/runtime/mirror/object.h +++ b/runtime/mirror/object.h @@ -67,7 +67,8 @@ class MANAGED LOCKABLE Object { return OFFSET_OF_OBJECT_MEMBER(Object, klass_); } - template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kDoReadBarrier = true> + template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, + ReadBarrierOption kReadBarrierOption = kWithReadBarrier> Class* GetClass() ALWAYS_INLINE SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> @@ -86,7 +87,8 @@ class MANAGED LOCKABLE Object { template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> bool InstanceOf(Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kDoReadBarrier = true> + template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, + ReadBarrierOption kReadBarrierOption = kWithReadBarrier> size_t SizeOf() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); Object* Clone(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); @@ -113,9 +115,11 @@ class MANAGED LOCKABLE Object { void Wait(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); void Wait(Thread* self, int64_t timeout, int32_t nanos) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kDoReadBarrier = true> + template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, + ReadBarrierOption kReadBarrierOption = kWithReadBarrier> bool IsClass() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kDoReadBarrier = true> + template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, + ReadBarrierOption kReadBarrierOption = kWithReadBarrier> Class* AsClass() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> @@ -123,9 +127,11 @@ class MANAGED LOCKABLE Object { template<class T, VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> ObjectArray<T>* AsObjectArray() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kDoReadBarrier = true> + template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, + ReadBarrierOption kReadBarrierOption = kWithReadBarrier> bool IsArrayInstance() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kDoReadBarrier = true> + template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, + ReadBarrierOption kReadBarrierOption = kWithReadBarrier> Array* AsArray() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> @@ -158,12 +164,14 @@ class MANAGED LOCKABLE Object { template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> Throwable* AsThrowable() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kDoReadBarrier = true> + template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, + ReadBarrierOption kReadBarrierOption = kWithReadBarrier> bool IsArtMethod() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> ArtMethod* AsArtMethod() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, bool kDoReadBarrier = true> + template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, + ReadBarrierOption kReadBarrierOption = kWithReadBarrier> bool IsArtField() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> ArtField* AsArtField() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); @@ -185,12 +193,12 @@ class MANAGED LOCKABLE Object { // Accessor for Java type fields. template<class T, VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, - bool kDoReadBarrier = true, bool kIsVolatile = false> + ReadBarrierOption kReadBarrierOption = kWithReadBarrier, bool kIsVolatile = false> T* GetFieldObject(MemberOffset field_offset) ALWAYS_INLINE SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); template<class T, VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags, - bool kDoReadBarrier = true> + ReadBarrierOption kReadBarrierOption = kWithReadBarrier> T* GetFieldObjectVolatile(MemberOffset field_offset) ALWAYS_INLINE SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); diff --git a/runtime/read_barrier-inl.h b/runtime/read_barrier-inl.h index ea2f830..88e2f8f 100644 --- a/runtime/read_barrier-inl.h +++ b/runtime/read_barrier-inl.h @@ -23,17 +23,18 @@ namespace art { -template <typename MirrorType, bool kDoReadBarrier> +template <typename MirrorType, ReadBarrierOption kReadBarrierOption> inline MirrorType* ReadBarrier::Barrier( mirror::Object* obj, MemberOffset offset, mirror::HeapReference<MirrorType>* ref_addr) { // Unused for now. UNUSED(obj); UNUSED(offset); UNUSED(ref_addr); - if (kDoReadBarrier && kUseBakerReadBarrier) { + const bool with_read_barrier = kReadBarrierOption == kWithReadBarrier; + if (with_read_barrier && kUseBakerReadBarrier) { // To be implemented. return ref_addr->AsMirrorPtr(); - } else if (kDoReadBarrier && kUseBrooksReadBarrier) { + } else if (with_read_barrier && kUseBrooksReadBarrier) { // To be implemented. return ref_addr->AsMirrorPtr(); } else { diff --git a/runtime/read_barrier.h b/runtime/read_barrier.h index 6f59004..73c3d43 100644 --- a/runtime/read_barrier.h +++ b/runtime/read_barrier.h @@ -33,7 +33,7 @@ namespace mirror { class ReadBarrier { public: - template <typename MirrorType, bool kDoReadBarrier = true> + template <typename MirrorType, ReadBarrierOption kReadBarrierOption = kWithReadBarrier> ALWAYS_INLINE static MirrorType* Barrier( mirror::Object* obj, MemberOffset offset, mirror::HeapReference<MirrorType>* ref_addr) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); diff --git a/runtime/read_barrier_option.h b/runtime/read_barrier_option.h new file mode 100644 index 0000000..7de8b8a --- /dev/null +++ b/runtime/read_barrier_option.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ART_RUNTIME_READ_BARRIER_OPTION_H_ +#define ART_RUNTIME_READ_BARRIER_OPTION_H_ +namespace art { + +// Options for performing a read barrier or not. +enum ReadBarrierOption { + kWithReadBarrier, // Perform a read barrier. + kWithoutReadBarrier, // Don't perform a read barrier. +}; + +} // namespace art + +#endif // ART_RUNTIME_READ_BARRIER_OPTION_H_ |