diff options
author | 2015-07-23 14:11:16 -0700 | |
---|---|---|
committer | 2015-07-23 14:46:52 -0700 | |
commit | ed8990a467f3d93545221a33e43a9d34b1cc363f (patch) | |
tree | 74e9fa58eb8582ed3ca81822d96d34d90bc62c59 | |
parent | bea4eb4b29aa1030aa1919dfedaa95aea2599b7a (diff) |
Add some more uninterruptible annotations
Added to mirror sites, class linker, and intern table.
Bug: 20072211
Change-Id: I2224bcefefaab05d325f14844b1514e3d719e649
-rw-r--r-- | runtime/intern_table.h | 77 | ||||
-rw-r--r-- | runtime/mirror/abstract_method.h | 3 | ||||
-rw-r--r-- | runtime/mirror/array.h | 3 | ||||
-rw-r--r-- | runtime/mirror/class.h | 10 | ||||
-rw-r--r-- | runtime/mirror/field.h | 2 | ||||
-rw-r--r-- | runtime/mirror/method.h | 4 | ||||
-rw-r--r-- | runtime/mirror/stack_trace_element.h | 2 | ||||
-rw-r--r-- | runtime/mirror/string.h | 19 | ||||
-rw-r--r-- | runtime/thread.h | 11 |
9 files changed, 64 insertions, 67 deletions
diff --git a/runtime/intern_table.h b/runtime/intern_table.h index 4819b9ffa7..0be66759ac 100644 --- a/runtime/intern_table.h +++ b/runtime/intern_table.h @@ -58,24 +58,29 @@ class InternTable { // Interns a potentially new string in the 'strong' table. May cause thread suspension. mirror::String* InternStrong(int32_t utf16_length, const char* utf8_data) - SHARED_REQUIRES(Locks::mutator_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); - // Only used by image writer. + // Only used by image writer. Special version that may not cause thread suspension since the GC + // can not be running while we are doing image writing. mirror::String* InternImageString(mirror::String* s) SHARED_REQUIRES(Locks::mutator_lock_); // Interns a potentially new string in the 'strong' table. May cause thread suspension. - mirror::String* InternStrong(const char* utf8_data) SHARED_REQUIRES(Locks::mutator_lock_); + mirror::String* InternStrong(const char* utf8_data) SHARED_REQUIRES(Locks::mutator_lock_) + REQUIRES(!Roles::uninterruptible_); // Interns a potentially new string in the 'strong' table. May cause thread suspension. - mirror::String* InternStrong(mirror::String* s) SHARED_REQUIRES(Locks::mutator_lock_); + mirror::String* InternStrong(mirror::String* s) SHARED_REQUIRES(Locks::mutator_lock_) + REQUIRES(!Roles::uninterruptible_); // Interns a potentially new string in the 'weak' table. May cause thread suspension. - mirror::String* InternWeak(mirror::String* s) SHARED_REQUIRES(Locks::mutator_lock_); + mirror::String* InternWeak(mirror::String* s) SHARED_REQUIRES(Locks::mutator_lock_) + REQUIRES(!Roles::uninterruptible_); void SweepInternTableWeaks(IsMarkedVisitor* visitor) SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Locks::intern_table_lock_); - bool ContainsWeak(mirror::String* s) SHARED_REQUIRES(Locks::mutator_lock_); + bool ContainsWeak(mirror::String* s) SHARED_REQUIRES(Locks::mutator_lock_) + REQUIRES(!Locks::intern_table_lock_); // Total number of interned strings. size_t Size() const REQUIRES(!Locks::intern_table_lock_); @@ -85,9 +90,9 @@ class InternTable { size_t WeakSize() const REQUIRES(!Locks::intern_table_lock_); void VisitRoots(RootVisitor* visitor, VisitRootFlags flags) - SHARED_REQUIRES(Locks::mutator_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Locks::intern_table_lock_); - void DumpForSigQuit(std::ostream& os) const; + void DumpForSigQuit(std::ostream& os) const REQUIRES(!Locks::intern_table_lock_); void DisallowNewInterns() SHARED_REQUIRES(Locks::mutator_lock_); void AllowNewInterns() SHARED_REQUIRES(Locks::mutator_lock_); @@ -99,6 +104,7 @@ class InternTable { // advantage of doing this is preventing expensive DexFile::FindStringId calls. void AddImageStringsToTable(gc::space::ImageSpace* image_space) SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Locks::intern_table_lock_); + // Copy the post zygote tables to pre zygote to save memory by preventing dirty pages. void SwapPostZygoteWithPreZygote() SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Locks::intern_table_lock_); @@ -147,34 +153,28 @@ class InternTable { void Insert(mirror::String* s) SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(Locks::intern_table_lock_); void Remove(mirror::String* s) - SHARED_REQUIRES(Locks::mutator_lock_) - REQUIRES(Locks::intern_table_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(Locks::intern_table_lock_); void VisitRoots(RootVisitor* visitor) - SHARED_REQUIRES(Locks::mutator_lock_) - REQUIRES(Locks::intern_table_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(Locks::intern_table_lock_); void SweepWeaks(IsMarkedVisitor* visitor) - SHARED_REQUIRES(Locks::mutator_lock_) - REQUIRES(Locks::intern_table_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(Locks::intern_table_lock_); void SwapPostZygoteWithPreZygote() REQUIRES(Locks::intern_table_lock_); size_t Size() const REQUIRES(Locks::intern_table_lock_); // Read pre zygote table is called from ReadFromMemory which happens during runtime creation // when we load the image intern table. Returns how many bytes were read. size_t ReadIntoPreZygoteTable(const uint8_t* ptr) - REQUIRES(Locks::intern_table_lock_) - SHARED_REQUIRES(Locks::mutator_lock_); + REQUIRES(Locks::intern_table_lock_) SHARED_REQUIRES(Locks::mutator_lock_); // The image writer calls WritePostZygoteTable through WriteToMemory, it writes the interns in // the post zygote table. Returns how many bytes were written. size_t WriteFromPostZygoteTable(uint8_t* ptr) - REQUIRES(Locks::intern_table_lock_) - SHARED_REQUIRES(Locks::mutator_lock_); + REQUIRES(Locks::intern_table_lock_) SHARED_REQUIRES(Locks::mutator_lock_); private: typedef HashSet<GcRoot<mirror::String>, GcRootEmptyFn, StringHashEquals, StringHashEquals, TrackingAllocator<GcRoot<mirror::String>, kAllocatorTagInternTable>> UnorderedSet; void SweepWeaks(UnorderedSet* set, IsMarkedVisitor* visitor) - SHARED_REQUIRES(Locks::mutator_lock_) - REQUIRES(Locks::intern_table_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(Locks::intern_table_lock_); // We call SwapPostZygoteWithPreZygote when we create the zygote to reduce private dirty pages // caused by modifying the zygote intern table hash table. The pre zygote table are the @@ -189,41 +189,29 @@ class InternTable { REQUIRES(!Locks::intern_table_lock_) SHARED_REQUIRES(Locks::mutator_lock_); mirror::String* LookupStrong(mirror::String* s) - SHARED_REQUIRES(Locks::mutator_lock_) - REQUIRES(Locks::intern_table_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(Locks::intern_table_lock_); mirror::String* LookupWeak(mirror::String* s) - SHARED_REQUIRES(Locks::mutator_lock_) - REQUIRES(Locks::intern_table_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(Locks::intern_table_lock_); mirror::String* InsertStrong(mirror::String* s) - SHARED_REQUIRES(Locks::mutator_lock_) - REQUIRES(Locks::intern_table_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(Locks::intern_table_lock_); mirror::String* InsertWeak(mirror::String* s) - SHARED_REQUIRES(Locks::mutator_lock_) - REQUIRES(Locks::intern_table_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(Locks::intern_table_lock_); void RemoveStrong(mirror::String* s) - SHARED_REQUIRES(Locks::mutator_lock_) - REQUIRES(Locks::intern_table_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(Locks::intern_table_lock_); void RemoveWeak(mirror::String* s) - SHARED_REQUIRES(Locks::mutator_lock_) - REQUIRES(Locks::intern_table_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(Locks::intern_table_lock_); // Transaction rollback access. mirror::String* LookupStringFromImage(mirror::String* s) - SHARED_REQUIRES(Locks::mutator_lock_) - REQUIRES(Locks::intern_table_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(Locks::intern_table_lock_); mirror::String* InsertStrongFromTransaction(mirror::String* s) - SHARED_REQUIRES(Locks::mutator_lock_) - REQUIRES(Locks::intern_table_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(Locks::intern_table_lock_); mirror::String* InsertWeakFromTransaction(mirror::String* s) - SHARED_REQUIRES(Locks::mutator_lock_) - REQUIRES(Locks::intern_table_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(Locks::intern_table_lock_); void RemoveStrongFromTransaction(mirror::String* s) - SHARED_REQUIRES(Locks::mutator_lock_) - REQUIRES(Locks::intern_table_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(Locks::intern_table_lock_); void RemoveWeakFromTransaction(mirror::String* s) - SHARED_REQUIRES(Locks::mutator_lock_) - REQUIRES(Locks::intern_table_lock_); - friend class Transaction; + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(Locks::intern_table_lock_); size_t ReadFromMemoryLocked(const uint8_t* ptr) REQUIRES(Locks::intern_table_lock_) SHARED_REQUIRES(Locks::mutator_lock_); @@ -252,6 +240,9 @@ class InternTable { Table weak_interns_ GUARDED_BY(Locks::intern_table_lock_); // Weak root state, used for concurrent system weak processing and more. gc::WeakRootState weak_root_state_ GUARDED_BY(Locks::intern_table_lock_); + + friend class Transaction; + DISALLOW_COPY_AND_ASSIGN(InternTable); }; } // namespace art diff --git a/runtime/mirror/abstract_method.h b/runtime/mirror/abstract_method.h index 845d1563db..dc084be06e 100644 --- a/runtime/mirror/abstract_method.h +++ b/runtime/mirror/abstract_method.h @@ -34,7 +34,8 @@ namespace mirror { class MANAGED AbstractMethod : public AccessibleObject { public: // Called from Constructor::CreateFromArtMethod, Method::CreateFromArtMethod. - bool CreateFromArtMethod(ArtMethod* method) SHARED_REQUIRES(Locks::mutator_lock_); + bool CreateFromArtMethod(ArtMethod* method) SHARED_REQUIRES(Locks::mutator_lock_) + REQUIRES(!Roles::uninterruptible_); ArtMethod* GetArtMethod() SHARED_REQUIRES(Locks::mutator_lock_); // Only used by the image writer. diff --git a/runtime/mirror/array.h b/runtime/mirror/array.h index d21cfae34e..b27a8849ed 100644 --- a/runtime/mirror/array.h +++ b/runtime/mirror/array.h @@ -88,7 +88,8 @@ class MANAGED Array : public Object { REQUIRES(!Roles::uninterruptible_); protected: - void ThrowArrayStoreException(Object* object) SHARED_REQUIRES(Locks::mutator_lock_); + void ThrowArrayStoreException(Object* object) SHARED_REQUIRES(Locks::mutator_lock_) + REQUIRES(!Roles::uninterruptible_); private: void ThrowArrayIndexOutOfBoundsException(int32_t index) diff --git a/runtime/mirror/class.h b/runtime/mirror/class.h index f1eb9be7f7..c01a5e8f1a 100644 --- a/runtime/mirror/class.h +++ b/runtime/mirror/class.h @@ -135,7 +135,7 @@ class MANAGED Class FINAL : public Object { // This is static because 'this' may be moved by GC. static void SetStatus(Handle<Class> h_this, Status new_status, Thread* self) - SHARED_REQUIRES(Locks::mutator_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); static MemberOffset StatusOffset() { return OFFSET_OF_OBJECT_MEMBER(Class, status_); @@ -314,7 +314,8 @@ class MANAGED Class FINAL : public Object { String* GetName() SHARED_REQUIRES(Locks::mutator_lock_); // Returns the cached name. void SetName(String* name) SHARED_REQUIRES(Locks::mutator_lock_); // Sets the cached name. // Computes the name, then sets the cached value. - static String* ComputeName(Handle<Class> h_this) SHARED_REQUIRES(Locks::mutator_lock_); + static String* ComputeName(Handle<Class> h_this) SHARED_REQUIRES(Locks::mutator_lock_) + REQUIRES(!Roles::uninterruptible_); template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> bool IsProxyClass() SHARED_REQUIRES(Locks::mutator_lock_) { @@ -682,7 +683,7 @@ class MANAGED Class FINAL : public Object { ALWAYS_INLINE IterationRange<StrideIterator<ArtMethod>> GetDirectMethods(size_t pointer_size) SHARED_REQUIRES(Locks::mutator_lock_); - ArtMethod* GetDirectMethodsPtr() SHARED_REQUIRES(Locks::mutator_lock_);\ + ArtMethod* GetDirectMethodsPtr() SHARED_REQUIRES(Locks::mutator_lock_); void SetDirectMethodsPtr(ArtMethod* new_direct_methods) SHARED_REQUIRES(Locks::mutator_lock_); @@ -1090,7 +1091,8 @@ class MANAGED Class FINAL : public Object { SHARED_REQUIRES(Locks::mutator_lock_); Class* CopyOf(Thread* self, int32_t new_length, ArtMethod* const (&imt)[mirror::Class::kImtSize], - size_t pointer_size) SHARED_REQUIRES(Locks::mutator_lock_); + size_t pointer_size) + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); // For proxy class only. ObjectArray<Class>* GetInterfaces() SHARED_REQUIRES(Locks::mutator_lock_); diff --git a/runtime/mirror/field.h b/runtime/mirror/field.h index b5a954f5e5..edaddbd2e7 100644 --- a/runtime/mirror/field.h +++ b/runtime/mirror/field.h @@ -95,7 +95,7 @@ class MANAGED Field : public AccessibleObject { template <bool kTransactionActive = false> static mirror::Field* CreateFromArtField(Thread* self, ArtField* field, bool force_resolve) - SHARED_REQUIRES(Locks::mutator_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); private: HeapReference<mirror::Class> declaring_class_; diff --git a/runtime/mirror/method.h b/runtime/mirror/method.h index fe021dbbf6..0c28e4f580 100644 --- a/runtime/mirror/method.h +++ b/runtime/mirror/method.h @@ -29,7 +29,7 @@ class Class; class MANAGED Method : public AbstractMethod { public: static Method* CreateFromArtMethod(Thread* self, ArtMethod* method) - SHARED_REQUIRES(Locks::mutator_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); static mirror::Class* StaticClass() SHARED_REQUIRES(Locks::mutator_lock_) { return static_class_.Read(); @@ -60,7 +60,7 @@ class MANAGED Method : public AbstractMethod { class MANAGED Constructor: public AbstractMethod { public: static Constructor* CreateFromArtMethod(Thread* self, ArtMethod* method) - SHARED_REQUIRES(Locks::mutator_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); static mirror::Class* StaticClass() SHARED_REQUIRES(Locks::mutator_lock_) { return static_class_.Read(); diff --git a/runtime/mirror/stack_trace_element.h b/runtime/mirror/stack_trace_element.h index d58c0b6db0..1167391e23 100644 --- a/runtime/mirror/stack_trace_element.h +++ b/runtime/mirror/stack_trace_element.h @@ -50,7 +50,7 @@ class MANAGED StackTraceElement FINAL : public Object { static StackTraceElement* Alloc(Thread* self, Handle<String> declaring_class, Handle<String> method_name, Handle<String> file_name, int32_t line_number) - SHARED_REQUIRES(Locks::mutator_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); static void SetClass(Class* java_lang_StackTraceElement); static void ResetClass(); diff --git a/runtime/mirror/string.h b/runtime/mirror/string.h index b4a2d1d30a..eb2e1f6977 100644 --- a/runtime/mirror/string.h +++ b/runtime/mirror/string.h @@ -85,38 +85,38 @@ class MANAGED String FINAL : public Object { ALWAYS_INLINE static String* Alloc(Thread* self, int32_t utf16_length, gc::AllocatorType allocator_type, const PreFenceVisitor& pre_fence_visitor) - SHARED_REQUIRES(Locks::mutator_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); template <bool kIsInstrumented> ALWAYS_INLINE static String* AllocFromByteArray(Thread* self, int32_t byte_length, Handle<ByteArray> array, int32_t offset, int32_t high_byte, gc::AllocatorType allocator_type) - SHARED_REQUIRES(Locks::mutator_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); template <bool kIsInstrumented> ALWAYS_INLINE static String* AllocFromCharArray(Thread* self, int32_t count, Handle<CharArray> array, int32_t offset, gc::AllocatorType allocator_type) - SHARED_REQUIRES(Locks::mutator_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); template <bool kIsInstrumented> ALWAYS_INLINE static String* AllocFromString(Thread* self, int32_t string_length, Handle<String> string, int32_t offset, gc::AllocatorType allocator_type) - SHARED_REQUIRES(Locks::mutator_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); static String* AllocFromStrings(Thread* self, Handle<String> string, Handle<String> string2) - SHARED_REQUIRES(Locks::mutator_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); static String* AllocFromUtf16(Thread* self, int32_t utf16_length, const uint16_t* utf16_data_in) - SHARED_REQUIRES(Locks::mutator_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); static String* AllocFromModifiedUtf8(Thread* self, const char* utf) - SHARED_REQUIRES(Locks::mutator_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); static String* AllocFromModifiedUtf8(Thread* self, int32_t utf16_length, const char* utf8_data_in) - SHARED_REQUIRES(Locks::mutator_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); // TODO: This is only used in the interpreter to compare against // entries from a dex files constant pool (ArtField names). Should @@ -146,7 +146,8 @@ class MANAGED String FINAL : public Object { int32_t CompareTo(String* other) SHARED_REQUIRES(Locks::mutator_lock_); - CharArray* ToCharArray(Thread* self) SHARED_REQUIRES(Locks::mutator_lock_); + CharArray* ToCharArray(Thread* self) SHARED_REQUIRES(Locks::mutator_lock_) + REQUIRES(!Roles::uninterruptible_); void GetChars(int32_t start, int32_t end, Handle<CharArray> array, int32_t index) SHARED_REQUIRES(Locks::mutator_lock_); diff --git a/runtime/thread.h b/runtime/thread.h index 0aa4b5b867..e4ad7f36db 100644 --- a/runtime/thread.h +++ b/runtime/thread.h @@ -414,23 +414,24 @@ class Thread { // If 'msg' is null, no detail message is set. void ThrowNewException(const char* exception_class_descriptor, const char* msg) - SHARED_REQUIRES(Locks::mutator_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); // If 'msg' is null, no detail message is set. An exception must be pending, and will be // used as the new exception's cause. void ThrowNewWrappedException(const char* exception_class_descriptor, const char* msg) - SHARED_REQUIRES(Locks::mutator_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); void ThrowNewExceptionF(const char* exception_class_descriptor, const char* fmt, ...) __attribute__((format(printf, 3, 4))) - SHARED_REQUIRES(Locks::mutator_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); void ThrowNewExceptionV(const char* exception_class_descriptor, const char* fmt, va_list ap) - SHARED_REQUIRES(Locks::mutator_lock_); + SHARED_REQUIRES(Locks::mutator_lock_) REQUIRES(!Roles::uninterruptible_); // OutOfMemoryError is special, because we need to pre-allocate an instance. // Only the GC should call this. - void ThrowOutOfMemoryError(const char* msg) SHARED_REQUIRES(Locks::mutator_lock_); + void ThrowOutOfMemoryError(const char* msg) SHARED_REQUIRES(Locks::mutator_lock_) + REQUIRES(!Roles::uninterruptible_); static void Startup(); static void FinishStartup(); |