diff options
author | 2016-10-14 13:27:12 -0700 | |
---|---|---|
committer | 2016-10-14 14:48:26 -0700 | |
commit | 05a364c8d8271ceeca307d04736f53e92d03de9d (patch) | |
tree | 70e166900c99564c0ab3596ef3c8d5d85f14e767 /runtime/java_vm_ext.h | |
parent | 4aed412037e6e7bad2cf589645449df960b88200 (diff) |
ART: Make JNI global and weak global locks global
Add them to Locks. Give the JNI global table lock
a lock level, close to the weak global JNI references.
Bug: 31684578
Test: m test-art-host
Change-Id: I3857a3b0be69b16811d9999096b2c42e7a25d227
Diffstat (limited to 'runtime/java_vm_ext.h')
-rw-r--r-- | runtime/java_vm_ext.h | 63 |
1 files changed, 34 insertions, 29 deletions
diff --git a/runtime/java_vm_ext.h b/runtime/java_vm_ext.h index 2e59a9d65f..05717f41e7 100644 --- a/runtime/java_vm_ext.h +++ b/runtime/java_vm_ext.h @@ -109,72 +109,81 @@ class JavaVMExt : public JavaVM { REQUIRES_SHARED(Locks::mutator_lock_); void DumpForSigQuit(std::ostream& os) - REQUIRES(!Locks::jni_libraries_lock_, !globals_lock_, !weak_globals_lock_); + REQUIRES(!Locks::jni_libraries_lock_, + !Locks::jni_globals_lock_, + !Locks::jni_weak_globals_lock_); void DumpReferenceTables(std::ostream& os) - REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!globals_lock_, !weak_globals_lock_); + REQUIRES_SHARED(Locks::mutator_lock_) + REQUIRES(!Locks::jni_globals_lock_, !Locks::jni_weak_globals_lock_); bool SetCheckJniEnabled(bool enabled); void VisitRoots(RootVisitor* visitor) REQUIRES_SHARED(Locks::mutator_lock_) - REQUIRES(!globals_lock_); + REQUIRES(!Locks::jni_globals_lock_); - void DisallowNewWeakGlobals() REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!weak_globals_lock_); - void AllowNewWeakGlobals() REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!weak_globals_lock_); - void BroadcastForNewWeakGlobals() REQUIRES_SHARED(Locks::mutator_lock_) - REQUIRES(!weak_globals_lock_); + void DisallowNewWeakGlobals() + REQUIRES_SHARED(Locks::mutator_lock_) + REQUIRES(!Locks::jni_weak_globals_lock_); + void AllowNewWeakGlobals() + REQUIRES_SHARED(Locks::mutator_lock_) + REQUIRES(!Locks::jni_weak_globals_lock_); + void BroadcastForNewWeakGlobals() + REQUIRES_SHARED(Locks::mutator_lock_) + REQUIRES(!Locks::jni_weak_globals_lock_); jobject AddGlobalRef(Thread* self, ObjPtr<mirror::Object> obj) - REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!globals_lock_); + REQUIRES_SHARED(Locks::mutator_lock_) + REQUIRES(!Locks::jni_globals_lock_); jweak AddWeakGlobalRef(Thread* self, ObjPtr<mirror::Object> obj) - REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!weak_globals_lock_); + REQUIRES_SHARED(Locks::mutator_lock_) + REQUIRES(!Locks::jni_weak_globals_lock_); - void DeleteGlobalRef(Thread* self, jobject obj) REQUIRES(!globals_lock_); + void DeleteGlobalRef(Thread* self, jobject obj) REQUIRES(!Locks::jni_globals_lock_); - void DeleteWeakGlobalRef(Thread* self, jweak obj) REQUIRES(!weak_globals_lock_); + void DeleteWeakGlobalRef(Thread* self, jweak obj) REQUIRES(!Locks::jni_weak_globals_lock_); void SweepJniWeakGlobals(IsMarkedVisitor* visitor) - REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!weak_globals_lock_); + REQUIRES_SHARED(Locks::mutator_lock_) + REQUIRES(!Locks::jni_weak_globals_lock_); ObjPtr<mirror::Object> DecodeGlobal(IndirectRef ref) REQUIRES_SHARED(Locks::mutator_lock_); void UpdateGlobal(Thread* self, IndirectRef ref, ObjPtr<mirror::Object> result) - REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!globals_lock_); + REQUIRES_SHARED(Locks::mutator_lock_) + REQUIRES(!Locks::jni_globals_lock_); ObjPtr<mirror::Object> DecodeWeakGlobal(Thread* self, IndirectRef ref) REQUIRES_SHARED(Locks::mutator_lock_) - REQUIRES(!weak_globals_lock_); + REQUIRES(!Locks::jni_weak_globals_lock_); ObjPtr<mirror::Object> DecodeWeakGlobalLocked(Thread* self, IndirectRef ref) REQUIRES_SHARED(Locks::mutator_lock_) - REQUIRES(weak_globals_lock_); + REQUIRES(Locks::jni_weak_globals_lock_); // Like DecodeWeakGlobal() but to be used only during a runtime shutdown where self may be // null. ObjPtr<mirror::Object> DecodeWeakGlobalDuringShutdown(Thread* self, IndirectRef ref) REQUIRES_SHARED(Locks::mutator_lock_) - REQUIRES(!weak_globals_lock_); + REQUIRES(!Locks::jni_weak_globals_lock_); // Checks if the weak global ref has been cleared by the GC without decode (read barrier.) bool IsWeakGlobalCleared(Thread* self, IndirectRef ref) REQUIRES_SHARED(Locks::mutator_lock_) - REQUIRES(!weak_globals_lock_); - - Mutex& WeakGlobalsLock() RETURN_CAPABILITY(weak_globals_lock_) { - return weak_globals_lock_; - } + REQUIRES(!Locks::jni_weak_globals_lock_); void UpdateWeakGlobal(Thread* self, IndirectRef ref, ObjPtr<mirror::Object> result) - REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!weak_globals_lock_); + REQUIRES_SHARED(Locks::mutator_lock_) + REQUIRES(!Locks::jni_weak_globals_lock_); const JNIInvokeInterface* GetUncheckedFunctions() const { return unchecked_functions_; } void TrimGlobals() REQUIRES_SHARED(Locks::mutator_lock_) - REQUIRES(!globals_lock_); + REQUIRES(!Locks::jni_globals_lock_); jint HandleGetEnv(/*out*/void** env, jint version); @@ -187,7 +196,7 @@ class JavaVMExt : public JavaVM { bool MayAccessWeakGlobalsUnlocked(Thread* self) const REQUIRES_SHARED(Locks::mutator_lock_); bool MayAccessWeakGlobals(Thread* self) const REQUIRES_SHARED(Locks::mutator_lock_) - REQUIRES(weak_globals_lock_); + REQUIRES(Locks::jni_weak_globals_lock_); Runtime* const runtime_; @@ -203,8 +212,6 @@ class JavaVMExt : public JavaVM { // Extra diagnostics. const std::string trace_; - // JNI global references. - ReaderWriterMutex globals_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; // Not guarded by globals_lock since we sometimes use SynchronizedGet in Thread::DecodeJObject. IndirectReferenceTable globals_; @@ -215,8 +222,6 @@ class JavaVMExt : public JavaVM { // Used by -Xcheck:jni. const JNIInvokeInterface* const unchecked_functions_; - // JNI weak global references. - Mutex weak_globals_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; // Since weak_globals_ contain weak roots, be careful not to // directly access the object references in it. Use Get() with the // read barrier enabled. @@ -224,7 +229,7 @@ class JavaVMExt : public JavaVM { IndirectReferenceTable weak_globals_; // Not guarded by weak_globals_lock since we may use SynchronizedGet in DecodeWeakGlobal. Atomic<bool> allow_accessing_weak_globals_; - ConditionVariable weak_globals_add_condition_ GUARDED_BY(weak_globals_lock_); + ConditionVariable weak_globals_add_condition_ GUARDED_BY(Locks::jni_weak_globals_lock_); // TODO Maybe move this to Runtime. std::vector<GetEnvHook> env_hooks_; |