diff options
author | Hiroshi Yamauchi <yamauchi@google.com> | 2014-06-27 23:05:38 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-06-27 16:59:53 +0000 |
commit | baa1323d66a05fd2d7b9c6c131b232945b0a4ebb (patch) | |
tree | 59a2e44c7dbe82811f56657c43d99f1111c75f26 | |
parent | 5703029de6c56c6f85b3ecbd4e2eee80e025772d (diff) | |
parent | 4f1ebc2b86c8467d1ecb3ec655316e6d7ee8b8b5 (diff) | |
download | art-baa1323d66a05fd2d7b9c6c131b232945b0a4ebb.zip art-baa1323d66a05fd2d7b9c6c131b232945b0a4ebb.tar.gz art-baa1323d66a05fd2d7b9c6c131b232945b0a4ebb.tar.bz2 |
Merge "Add read barriers to the constant roots."
-rw-r--r-- | runtime/mirror/array-inl.h | 3 | ||||
-rw-r--r-- | runtime/mirror/array.h | 6 | ||||
-rw-r--r-- | runtime/mirror/art_field.h | 7 | ||||
-rw-r--r-- | runtime/mirror/art_method.h | 7 | ||||
-rw-r--r-- | runtime/mirror/class-inl.h | 6 | ||||
-rw-r--r-- | runtime/mirror/class.cc | 4 | ||||
-rw-r--r-- | runtime/mirror/class.h | 10 | ||||
-rw-r--r-- | runtime/mirror/object-inl.h | 6 | ||||
-rw-r--r-- | runtime/mirror/stack_trace_element.h | 6 | ||||
-rw-r--r-- | runtime/mirror/string.h | 6 | ||||
-rw-r--r-- | runtime/mirror/throwable.h | 6 |
11 files changed, 45 insertions, 22 deletions
diff --git a/runtime/mirror/array-inl.h b/runtime/mirror/array-inl.h index 65799cd..43bdf49 100644 --- a/runtime/mirror/array-inl.h +++ b/runtime/mirror/array-inl.h @@ -168,8 +168,7 @@ inline void PrimitiveArray<T>::VisitRoots(RootCallback* callback, void* arg) { template<typename T> inline PrimitiveArray<T>* PrimitiveArray<T>::Alloc(Thread* self, size_t length) { - DCHECK(array_class_ != NULL); - Array* raw_array = Array::Alloc<true>(self, array_class_, length, sizeof(T), + Array* raw_array = Array::Alloc<true>(self, GetArrayClass(), length, sizeof(T), Runtime::Current()->GetHeap()->GetCurrentAllocator()); return down_cast<PrimitiveArray<T>*>(raw_array); } diff --git a/runtime/mirror/array.h b/runtime/mirror/array.h index 64e2317..25a4535 100644 --- a/runtime/mirror/array.h +++ b/runtime/mirror/array.h @@ -20,6 +20,7 @@ #include "gc/allocator_type.h" #include "object.h" #include "object_callbacks.h" +#include "read_barrier.h" namespace art { @@ -160,9 +161,10 @@ class MANAGED PrimitiveArray : public Array { array_class_ = array_class; } - static Class* GetArrayClass() { + static Class* GetArrayClass() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { DCHECK(array_class_ != nullptr); - return array_class_; + return ReadBarrier::BarrierForRoot<mirror::Class, kWithReadBarrier>( + &array_class_); } static void ResetArrayClass() { diff --git a/runtime/mirror/art_field.h b/runtime/mirror/art_field.h index 4858613..502cec7 100644 --- a/runtime/mirror/art_field.h +++ b/runtime/mirror/art_field.h @@ -23,6 +23,7 @@ #include "modifiers.h" #include "object.h" #include "object_callbacks.h" +#include "read_barrier.h" namespace art { @@ -121,9 +122,11 @@ class MANAGED ArtField : public Object { template<bool kTransactionActive> void SetObj(Object* object, Object* new_value) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - static Class* GetJavaLangReflectArtField() { + template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier> + static Class* GetJavaLangReflectArtField() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { DCHECK(java_lang_reflect_ArtField_ != nullptr); - return java_lang_reflect_ArtField_; + return ReadBarrier::BarrierForRoot<mirror::Class, kReadBarrierOption>( + &java_lang_reflect_ArtField_); } static void SetClass(Class* java_lang_reflect_ArtField); diff --git a/runtime/mirror/art_method.h b/runtime/mirror/art_method.h index 1c21b81..a55c48b 100644 --- a/runtime/mirror/art_method.h +++ b/runtime/mirror/art_method.h @@ -24,6 +24,7 @@ #include "object.h" #include "object_callbacks.h" #include "quick/quick_method_frame_info.h" +#include "read_barrier.h" namespace art { @@ -409,9 +410,11 @@ class MANAGED ArtMethod : public Object { static void SetClass(Class* java_lang_reflect_ArtMethod); - static Class* GetJavaLangReflectArtMethod() { + template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier> + static Class* GetJavaLangReflectArtMethod() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { DCHECK(java_lang_reflect_ArtMethod_ != nullptr); - return java_lang_reflect_ArtMethod_; + return ReadBarrier::BarrierForRoot<mirror::Class, kReadBarrierOption>( + &java_lang_reflect_ArtMethod_); } static void ResetClass(); diff --git a/runtime/mirror/class-inl.h b/runtime/mirror/class-inl.h index 6205f70..451235c 100644 --- a/runtime/mirror/class-inl.h +++ b/runtime/mirror/class-inl.h @@ -511,12 +511,14 @@ inline void Class::VisitReferences(mirror::Class* klass, const Visitor& visitor) VisitInstanceFieldsReferences<kVisitClass>(klass, visitor); } +template<ReadBarrierOption kReadBarrierOption> inline bool Class::IsArtFieldClass() const { - return this == ArtField::GetJavaLangReflectArtField(); + return this == ArtField::GetJavaLangReflectArtField<kReadBarrierOption>(); } +template<ReadBarrierOption kReadBarrierOption> inline bool Class::IsArtMethodClass() const { - return this == ArtMethod::GetJavaLangReflectArtMethod(); + return this == ArtMethod::GetJavaLangReflectArtMethod<kReadBarrierOption>(); } template<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> diff --git a/runtime/mirror/class.cc b/runtime/mirror/class.cc index c798180..c6472c6 100644 --- a/runtime/mirror/class.cc +++ b/runtime/mirror/class.cc @@ -40,7 +40,9 @@ namespace mirror { Class* Class::java_lang_Class_ = nullptr; void Class::SetClassClass(Class* java_lang_Class) { - CHECK(java_lang_Class_ == nullptr) << java_lang_Class_ << " " << java_lang_Class; + CHECK(java_lang_Class_ == nullptr) + << ReadBarrier::BarrierForRoot<mirror::Class, kWithReadBarrier>(&java_lang_Class_) + << " " << java_lang_Class; CHECK(java_lang_Class != nullptr); java_lang_Class_ = java_lang_Class; } diff --git a/runtime/mirror/class.h b/runtime/mirror/class.h index c83f411..e735c45 100644 --- a/runtime/mirror/class.h +++ b/runtime/mirror/class.h @@ -24,6 +24,7 @@ #include "object.h" #include "object_callbacks.h" #include "primitive.h" +#include "read_barrier.h" /* * A magic value for refOffsets. Ignore the bits and walk the super @@ -376,8 +377,10 @@ class MANAGED Class : public Object { bool IsThrowableClass() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier> bool IsArtFieldClass() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier> bool IsArtMethodClass() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); static MemberOffset ComponentTypeOffset() { @@ -845,13 +848,14 @@ class MANAGED Class : public Object { SetField32<false>(OFFSET_OF_OBJECT_MEMBER(Class, dex_type_idx_), type_idx); } - static Class* GetJavaLangClass() { + static Class* GetJavaLangClass() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { DCHECK(java_lang_Class_ != NULL); - return java_lang_Class_; + return ReadBarrier::BarrierForRoot<mirror::Class, kWithReadBarrier>( + &java_lang_Class_); } // Can't call this SetClass or else gets called instead of Object::SetClass in places. - static void SetClassClass(Class* java_lang_Class); + static void SetClassClass(Class* java_lang_Class) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); static void ResetClass(); static void VisitRoots(RootCallback* callback, void* arg) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); diff --git a/runtime/mirror/object-inl.h b/runtime/mirror/object-inl.h index 15ecd3c..62c1162 100644 --- a/runtime/mirror/object-inl.h +++ b/runtime/mirror/object-inl.h @@ -218,7 +218,8 @@ inline bool Object::IsArrayInstance() { template<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> inline bool Object::IsArtField() { - return GetClass<kVerifyFlags, kReadBarrierOption>()->IsArtFieldClass(); + return GetClass<kVerifyFlags, kReadBarrierOption>()-> + template IsArtFieldClass<kReadBarrierOption>(); } template<VerifyObjectFlags kVerifyFlags> @@ -229,7 +230,8 @@ inline ArtField* Object::AsArtField() { template<VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> inline bool Object::IsArtMethod() { - return GetClass<kVerifyFlags, kReadBarrierOption>()->IsArtMethodClass(); + return GetClass<kVerifyFlags, kReadBarrierOption>()-> + template IsArtMethodClass<kReadBarrierOption>(); } template<VerifyObjectFlags kVerifyFlags> diff --git a/runtime/mirror/stack_trace_element.h b/runtime/mirror/stack_trace_element.h index e094e8b..abecbc5 100644 --- a/runtime/mirror/stack_trace_element.h +++ b/runtime/mirror/stack_trace_element.h @@ -19,6 +19,7 @@ #include "object.h" #include "object_callbacks.h" +#include "read_barrier.h" namespace art { @@ -55,9 +56,10 @@ class MANAGED StackTraceElement : public Object { static void ResetClass(); static void VisitRoots(RootCallback* callback, void* arg) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - static Class* GetStackTraceElement() { + static Class* GetStackTraceElement() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { DCHECK(java_lang_StackTraceElement_ != NULL); - return java_lang_StackTraceElement_; + return ReadBarrier::BarrierForRoot<mirror::Class, kWithReadBarrier>( + &java_lang_StackTraceElement_); } private: diff --git a/runtime/mirror/string.h b/runtime/mirror/string.h index 6c3015f..b8acede 100644 --- a/runtime/mirror/string.h +++ b/runtime/mirror/string.h @@ -21,6 +21,7 @@ #include "class.h" #include "object_callbacks.h" +#include "read_barrier.h" namespace art { @@ -102,9 +103,10 @@ class MANAGED String : public Object { int32_t CompareTo(String* other) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - static Class* GetJavaLangString() { + static Class* GetJavaLangString() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { DCHECK(java_lang_String_ != NULL); - return java_lang_String_; + return ReadBarrier::BarrierForRoot<mirror::Class, kWithReadBarrier>( + &java_lang_String_); } static void SetClass(Class* java_lang_String); diff --git a/runtime/mirror/throwable.h b/runtime/mirror/throwable.h index c4127e0..cf54ad6 100644 --- a/runtime/mirror/throwable.h +++ b/runtime/mirror/throwable.h @@ -19,6 +19,7 @@ #include "object.h" #include "object_callbacks.h" +#include "read_barrier.h" #include "string.h" namespace art { @@ -45,9 +46,10 @@ class MANAGED Throwable : public Object { void SetStackState(Object* state) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); bool IsCheckedException() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - static Class* GetJavaLangThrowable() { + static Class* GetJavaLangThrowable() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { DCHECK(java_lang_Throwable_ != NULL); - return java_lang_Throwable_; + return ReadBarrier::BarrierForRoot<mirror::Class, kWithReadBarrier>( + &java_lang_Throwable_); } static void SetClass(Class* java_lang_Throwable); |