1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2011 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker #ifndef ART_RUNTIME_JNI_JAVA_VM_EXT_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_JNI_JAVA_VM_EXT_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include "jni.h" 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker #include "base/macros.h" 23*795d594fSAndroid Build Coastguard Worker #include "base/mutex.h" 24*795d594fSAndroid Build Coastguard Worker #include "indirect_reference_table.h" 25*795d594fSAndroid Build Coastguard Worker #include "obj_ptr.h" 26*795d594fSAndroid Build Coastguard Worker #include "reference_table.h" 27*795d594fSAndroid Build Coastguard Worker 28*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 29*795d594fSAndroid Build Coastguard Worker 30*795d594fSAndroid Build Coastguard Worker namespace linker { 31*795d594fSAndroid Build Coastguard Worker class ImageWriter; 32*795d594fSAndroid Build Coastguard Worker } // namespace linker 33*795d594fSAndroid Build Coastguard Worker 34*795d594fSAndroid Build Coastguard Worker namespace mirror { 35*795d594fSAndroid Build Coastguard Worker class Array; 36*795d594fSAndroid Build Coastguard Worker } // namespace mirror 37*795d594fSAndroid Build Coastguard Worker 38*795d594fSAndroid Build Coastguard Worker class ArtMethod; 39*795d594fSAndroid Build Coastguard Worker class IsMarkedVisitor; 40*795d594fSAndroid Build Coastguard Worker class Libraries; 41*795d594fSAndroid Build Coastguard Worker class ParsedOptions; 42*795d594fSAndroid Build Coastguard Worker class Runtime; 43*795d594fSAndroid Build Coastguard Worker struct RuntimeArgumentMap; 44*795d594fSAndroid Build Coastguard Worker class ScopedObjectAccess; 45*795d594fSAndroid Build Coastguard Worker 46*795d594fSAndroid Build Coastguard Worker class JavaVMExt; 47*795d594fSAndroid Build Coastguard Worker // Hook definition for runtime plugins. 48*795d594fSAndroid Build Coastguard Worker using GetEnvHook = jint (*)(JavaVMExt* vm, /*out*/void** new_env, jint version); 49*795d594fSAndroid Build Coastguard Worker 50*795d594fSAndroid Build Coastguard Worker class JavaVMExt : public JavaVM { 51*795d594fSAndroid Build Coastguard Worker public: 52*795d594fSAndroid Build Coastguard Worker // Creates a new JavaVMExt object. 53*795d594fSAndroid Build Coastguard Worker // Returns nullptr on error, in which case error_msg is set to a message 54*795d594fSAndroid Build Coastguard Worker // describing the error. 55*795d594fSAndroid Build Coastguard Worker static std::unique_ptr<JavaVMExt> Create(Runtime* runtime, 56*795d594fSAndroid Build Coastguard Worker const RuntimeArgumentMap& runtime_options, 57*795d594fSAndroid Build Coastguard Worker std::string* error_msg); 58*795d594fSAndroid Build Coastguard Worker 59*795d594fSAndroid Build Coastguard Worker 60*795d594fSAndroid Build Coastguard Worker ~JavaVMExt(); 61*795d594fSAndroid Build Coastguard Worker ForceCopy()62*795d594fSAndroid Build Coastguard Worker bool ForceCopy() const { 63*795d594fSAndroid Build Coastguard Worker return force_copy_; 64*795d594fSAndroid Build Coastguard Worker } 65*795d594fSAndroid Build Coastguard Worker IsCheckJniEnabled()66*795d594fSAndroid Build Coastguard Worker bool IsCheckJniEnabled() const { 67*795d594fSAndroid Build Coastguard Worker return check_jni_; 68*795d594fSAndroid Build Coastguard Worker } 69*795d594fSAndroid Build Coastguard Worker IsTracingEnabled()70*795d594fSAndroid Build Coastguard Worker bool IsTracingEnabled() const { 71*795d594fSAndroid Build Coastguard Worker return tracing_enabled_; 72*795d594fSAndroid Build Coastguard Worker } 73*795d594fSAndroid Build Coastguard Worker GetRuntime()74*795d594fSAndroid Build Coastguard Worker Runtime* GetRuntime() const { 75*795d594fSAndroid Build Coastguard Worker return runtime_; 76*795d594fSAndroid Build Coastguard Worker } 77*795d594fSAndroid Build Coastguard Worker SetCheckJniAbortHook(void (* hook)(void *,const std::string &),void * data)78*795d594fSAndroid Build Coastguard Worker void SetCheckJniAbortHook(void (*hook)(void*, const std::string&), void* data) { 79*795d594fSAndroid Build Coastguard Worker check_jni_abort_hook_ = hook; 80*795d594fSAndroid Build Coastguard Worker check_jni_abort_hook_data_ = data; 81*795d594fSAndroid Build Coastguard Worker } 82*795d594fSAndroid Build Coastguard Worker 83*795d594fSAndroid Build Coastguard Worker // Aborts execution unless there is an abort handler installed in which case it will return. Its 84*795d594fSAndroid Build Coastguard Worker // therefore important that callers return after aborting as otherwise code following the abort 85*795d594fSAndroid Build Coastguard Worker // will be executed in the abort handler case. 86*795d594fSAndroid Build Coastguard Worker void JniAbort(const char* jni_function_name, const char* msg); 87*795d594fSAndroid Build Coastguard Worker 88*795d594fSAndroid Build Coastguard Worker void JniAbortV(const char* jni_function_name, const char* fmt, va_list ap); 89*795d594fSAndroid Build Coastguard Worker 90*795d594fSAndroid Build Coastguard Worker void JniAbortF(const char* jni_function_name, const char* fmt, ...) 91*795d594fSAndroid Build Coastguard Worker __attribute__((__format__(__printf__, 3, 4))); 92*795d594fSAndroid Build Coastguard Worker 93*795d594fSAndroid Build Coastguard Worker // If both "-Xcheck:jni" and "-Xjnitrace:" are enabled, we print trace messages 94*795d594fSAndroid Build Coastguard Worker // when a native method that matches the -Xjnitrace argument calls a JNI function 95*795d594fSAndroid Build Coastguard Worker // such as NewByteArray. 96*795d594fSAndroid Build Coastguard Worker // If -verbose:third-party-jni is on, we want to log any JNI function calls 97*795d594fSAndroid Build Coastguard Worker // made by a third-party native method. 98*795d594fSAndroid Build Coastguard Worker bool ShouldTrace(ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_); 99*795d594fSAndroid Build Coastguard Worker 100*795d594fSAndroid Build Coastguard Worker /** 101*795d594fSAndroid Build Coastguard Worker * Loads the given shared library. 'path' is an absolute pathname. 102*795d594fSAndroid Build Coastguard Worker * 103*795d594fSAndroid Build Coastguard Worker * Returns 'true' on success. On failure, sets 'error_msg' to a 104*795d594fSAndroid Build Coastguard Worker * human-readable description of the error. 105*795d594fSAndroid Build Coastguard Worker */ 106*795d594fSAndroid Build Coastguard Worker EXPORT bool LoadNativeLibrary(JNIEnv* env, 107*795d594fSAndroid Build Coastguard Worker const std::string& path, 108*795d594fSAndroid Build Coastguard Worker jobject class_loader, 109*795d594fSAndroid Build Coastguard Worker jclass caller_class, 110*795d594fSAndroid Build Coastguard Worker std::string* error_msg); 111*795d594fSAndroid Build Coastguard Worker 112*795d594fSAndroid Build Coastguard Worker // Unload native libraries with cleared class loaders. 113*795d594fSAndroid Build Coastguard Worker void UnloadNativeLibraries() 114*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::jni_libraries_lock_) 115*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 116*795d594fSAndroid Build Coastguard Worker 117*795d594fSAndroid Build Coastguard Worker // Unload all boot classpath native libraries. 118*795d594fSAndroid Build Coastguard Worker void UnloadBootNativeLibraries() 119*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::jni_libraries_lock_) 120*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 121*795d594fSAndroid Build Coastguard Worker 122*795d594fSAndroid Build Coastguard Worker /** 123*795d594fSAndroid Build Coastguard Worker * Returns a pointer to the code for the native method 'm', found 124*795d594fSAndroid Build Coastguard Worker * using dlsym(3) on every native library that's been loaded so far. 125*795d594fSAndroid Build Coastguard Worker */ 126*795d594fSAndroid Build Coastguard Worker void* FindCodeForNativeMethod(ArtMethod* m, std::string* error_msg, bool can_suspend) 127*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 128*795d594fSAndroid Build Coastguard Worker 129*795d594fSAndroid Build Coastguard Worker void DumpForSigQuit(std::ostream& os) 130*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::jni_libraries_lock_, 131*795d594fSAndroid Build Coastguard Worker !Locks::jni_globals_lock_, 132*795d594fSAndroid Build Coastguard Worker !Locks::jni_weak_globals_lock_); 133*795d594fSAndroid Build Coastguard Worker 134*795d594fSAndroid Build Coastguard Worker void DumpReferenceTables(std::ostream& os) 135*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 136*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::jni_globals_lock_, 137*795d594fSAndroid Build Coastguard Worker !Locks::jni_weak_globals_lock_, 138*795d594fSAndroid Build Coastguard Worker !Locks::alloc_tracker_lock_); 139*795d594fSAndroid Build Coastguard Worker 140*795d594fSAndroid Build Coastguard Worker bool SetCheckJniEnabled(bool enabled); 141*795d594fSAndroid Build Coastguard Worker 142*795d594fSAndroid Build Coastguard Worker EXPORT void VisitRoots(RootVisitor* visitor) REQUIRES_SHARED(Locks::mutator_lock_) 143*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::jni_globals_lock_); 144*795d594fSAndroid Build Coastguard Worker 145*795d594fSAndroid Build Coastguard Worker void DisallowNewWeakGlobals() 146*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 147*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::jni_weak_globals_lock_); 148*795d594fSAndroid Build Coastguard Worker void AllowNewWeakGlobals() 149*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 150*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::jni_weak_globals_lock_); 151*795d594fSAndroid Build Coastguard Worker void BroadcastForNewWeakGlobals() 152*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::jni_weak_globals_lock_); 153*795d594fSAndroid Build Coastguard Worker 154*795d594fSAndroid Build Coastguard Worker EXPORT jobject AddGlobalRef(Thread* self, ObjPtr<mirror::Object> obj) 155*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Locks::jni_globals_lock_); 156*795d594fSAndroid Build Coastguard Worker 157*795d594fSAndroid Build Coastguard Worker EXPORT jweak AddWeakGlobalRef(Thread* self, ObjPtr<mirror::Object> obj) 158*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!Locks::jni_weak_globals_lock_); 159*795d594fSAndroid Build Coastguard Worker 160*795d594fSAndroid Build Coastguard Worker EXPORT void DeleteGlobalRef(Thread* self, jobject obj) REQUIRES(!Locks::jni_globals_lock_); 161*795d594fSAndroid Build Coastguard Worker 162*795d594fSAndroid Build Coastguard Worker EXPORT void DeleteWeakGlobalRef(Thread* self, jweak obj) REQUIRES(!Locks::jni_weak_globals_lock_); 163*795d594fSAndroid Build Coastguard Worker SweepJniWeakGlobals(IsMarkedVisitor * visitor)164*795d594fSAndroid Build Coastguard Worker void SweepJniWeakGlobals(IsMarkedVisitor* visitor) 165*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 166*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::jni_weak_globals_lock_) { 167*795d594fSAndroid Build Coastguard Worker weak_globals_.SweepJniWeakGlobals(visitor); 168*795d594fSAndroid Build Coastguard Worker } 169*795d594fSAndroid Build Coastguard Worker 170*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Object> DecodeGlobal(IndirectRef ref) 171*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 172*795d594fSAndroid Build Coastguard Worker 173*795d594fSAndroid Build Coastguard Worker void UpdateGlobal(Thread* self, IndirectRef ref, ObjPtr<mirror::Object> result) 174*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 175*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::jni_globals_lock_); 176*795d594fSAndroid Build Coastguard Worker 177*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Object> DecodeWeakGlobal(Thread* self, IndirectRef ref) 178*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 179*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::jni_weak_globals_lock_); 180*795d594fSAndroid Build Coastguard Worker 181*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Object> DecodeWeakGlobalLocked(Thread* self, IndirectRef ref) 182*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 183*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::jni_weak_globals_lock_); 184*795d594fSAndroid Build Coastguard Worker 185*795d594fSAndroid Build Coastguard Worker // Decode weak global as strong. Use only if the target object is known to be alive. 186*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Object> DecodeWeakGlobalAsStrong(IndirectRef ref) 187*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 188*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::jni_weak_globals_lock_); 189*795d594fSAndroid Build Coastguard Worker 190*795d594fSAndroid Build Coastguard Worker // Like DecodeWeakGlobal() but to be used only during a runtime shutdown where self may be 191*795d594fSAndroid Build Coastguard Worker // null. 192*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Object> DecodeWeakGlobalDuringShutdown(Thread* self, IndirectRef ref) 193*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 194*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::jni_weak_globals_lock_); 195*795d594fSAndroid Build Coastguard Worker 196*795d594fSAndroid Build Coastguard Worker // Checks if the weak global ref has been cleared by the GC without decode (read barrier.) 197*795d594fSAndroid Build Coastguard Worker bool IsWeakGlobalCleared(Thread* self, IndirectRef ref) 198*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 199*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::jni_weak_globals_lock_); 200*795d594fSAndroid Build Coastguard Worker 201*795d594fSAndroid Build Coastguard Worker void UpdateWeakGlobal(Thread* self, IndirectRef ref, ObjPtr<mirror::Object> result) 202*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 203*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::jni_weak_globals_lock_); 204*795d594fSAndroid Build Coastguard Worker GetUncheckedFunctions()205*795d594fSAndroid Build Coastguard Worker const JNIInvokeInterface* GetUncheckedFunctions() const { 206*795d594fSAndroid Build Coastguard Worker return unchecked_functions_; 207*795d594fSAndroid Build Coastguard Worker } 208*795d594fSAndroid Build Coastguard Worker 209*795d594fSAndroid Build Coastguard Worker void TrimGlobals() REQUIRES_SHARED(Locks::mutator_lock_) 210*795d594fSAndroid Build Coastguard Worker REQUIRES(!Locks::jni_globals_lock_); 211*795d594fSAndroid Build Coastguard Worker 212*795d594fSAndroid Build Coastguard Worker jint HandleGetEnv(/*out*/void** env, jint version) 213*795d594fSAndroid Build Coastguard Worker REQUIRES(!env_hooks_lock_); 214*795d594fSAndroid Build Coastguard Worker 215*795d594fSAndroid Build Coastguard Worker EXPORT void AddEnvironmentHook(GetEnvHook hook) REQUIRES(!env_hooks_lock_); 216*795d594fSAndroid Build Coastguard Worker 217*795d594fSAndroid Build Coastguard Worker static bool IsBadJniVersion(int version); 218*795d594fSAndroid Build Coastguard Worker 219*795d594fSAndroid Build Coastguard Worker // Return the library search path for the given classloader, if the classloader is of a 220*795d594fSAndroid Build Coastguard Worker // well-known type. The jobject will be a local reference and is expected to be managed by the 221*795d594fSAndroid Build Coastguard Worker // caller. 222*795d594fSAndroid Build Coastguard Worker static jstring GetLibrarySearchPath(JNIEnv* env, jobject class_loader); 223*795d594fSAndroid Build Coastguard Worker 224*795d594fSAndroid Build Coastguard Worker private: 225*795d594fSAndroid Build Coastguard Worker // The constructor should not be called directly. Use `Create()` that initializes 226*795d594fSAndroid Build Coastguard Worker // the new `JavaVMExt` object by calling `Initialize()`. 227*795d594fSAndroid Build Coastguard Worker JavaVMExt(Runtime* runtime, const RuntimeArgumentMap& runtime_options); 228*795d594fSAndroid Build Coastguard Worker 229*795d594fSAndroid Build Coastguard Worker // Initialize the `JavaVMExt` object. 230*795d594fSAndroid Build Coastguard Worker bool Initialize(std::string* error_msg); 231*795d594fSAndroid Build Coastguard Worker 232*795d594fSAndroid Build Coastguard Worker // Return true if self can currently access weak globals. 233*795d594fSAndroid Build Coastguard Worker bool MayAccessWeakGlobals(Thread* self) const REQUIRES_SHARED(Locks::mutator_lock_); 234*795d594fSAndroid Build Coastguard Worker 235*795d594fSAndroid Build Coastguard Worker void WaitForWeakGlobalsAccess(Thread* self) 236*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) 237*795d594fSAndroid Build Coastguard Worker REQUIRES(Locks::jni_weak_globals_lock_); 238*795d594fSAndroid Build Coastguard Worker 239*795d594fSAndroid Build Coastguard Worker void CheckGlobalRefAllocationTracking(); 240*795d594fSAndroid Build Coastguard Worker 241*795d594fSAndroid Build Coastguard Worker inline void MaybeTraceGlobals() REQUIRES(Locks::jni_globals_lock_); 242*795d594fSAndroid Build Coastguard Worker inline void MaybeTraceWeakGlobals() REQUIRES(Locks::jni_weak_globals_lock_); 243*795d594fSAndroid Build Coastguard Worker 244*795d594fSAndroid Build Coastguard Worker Runtime* const runtime_; 245*795d594fSAndroid Build Coastguard Worker 246*795d594fSAndroid Build Coastguard Worker // Used for testing. By default, we'll LOG(FATAL) the reason. 247*795d594fSAndroid Build Coastguard Worker void (*check_jni_abort_hook_)(void* data, const std::string& reason); 248*795d594fSAndroid Build Coastguard Worker void* check_jni_abort_hook_data_; 249*795d594fSAndroid Build Coastguard Worker 250*795d594fSAndroid Build Coastguard Worker // Extra checking. 251*795d594fSAndroid Build Coastguard Worker bool check_jni_; 252*795d594fSAndroid Build Coastguard Worker const bool force_copy_; 253*795d594fSAndroid Build Coastguard Worker const bool tracing_enabled_; 254*795d594fSAndroid Build Coastguard Worker 255*795d594fSAndroid Build Coastguard Worker // Extra diagnostics. 256*795d594fSAndroid Build Coastguard Worker const std::string trace_; 257*795d594fSAndroid Build Coastguard Worker 258*795d594fSAndroid Build Coastguard Worker IndirectReferenceTable globals_; 259*795d594fSAndroid Build Coastguard Worker 260*795d594fSAndroid Build Coastguard Worker // No lock annotation since UnloadNativeLibraries is called on libraries_ but locks the 261*795d594fSAndroid Build Coastguard Worker // jni_libraries_lock_ internally. 262*795d594fSAndroid Build Coastguard Worker std::unique_ptr<Libraries> libraries_; 263*795d594fSAndroid Build Coastguard Worker 264*795d594fSAndroid Build Coastguard Worker // Used by -Xcheck:jni. 265*795d594fSAndroid Build Coastguard Worker const JNIInvokeInterface* const unchecked_functions_; 266*795d594fSAndroid Build Coastguard Worker 267*795d594fSAndroid Build Coastguard Worker // Since weak_globals_ contain weak roots, be careful not to 268*795d594fSAndroid Build Coastguard Worker // directly access the object references in it. Use Get() with the 269*795d594fSAndroid Build Coastguard Worker // read barrier enabled or disabled based on the use case. 270*795d594fSAndroid Build Coastguard Worker IndirectReferenceTable weak_globals_; 271*795d594fSAndroid Build Coastguard Worker Atomic<bool> allow_accessing_weak_globals_; 272*795d594fSAndroid Build Coastguard Worker ConditionVariable weak_globals_add_condition_ GUARDED_BY(Locks::jni_weak_globals_lock_); 273*795d594fSAndroid Build Coastguard Worker 274*795d594fSAndroid Build Coastguard Worker // TODO Maybe move this to Runtime. 275*795d594fSAndroid Build Coastguard Worker ReaderWriterMutex env_hooks_lock_ BOTTOM_MUTEX_ACQUIRED_AFTER; 276*795d594fSAndroid Build Coastguard Worker std::vector<GetEnvHook> env_hooks_ GUARDED_BY(env_hooks_lock_); 277*795d594fSAndroid Build Coastguard Worker 278*795d594fSAndroid Build Coastguard Worker size_t enable_allocation_tracking_delta_; 279*795d594fSAndroid Build Coastguard Worker std::atomic<bool> allocation_tracking_enabled_; 280*795d594fSAndroid Build Coastguard Worker std::atomic<bool> old_allocation_tracking_state_; 281*795d594fSAndroid Build Coastguard Worker 282*795d594fSAndroid Build Coastguard Worker // We report the number of global references after every kGlobalRefReportInterval changes. 283*795d594fSAndroid Build Coastguard Worker static constexpr uint32_t kGlobalRefReportInterval = 17; 284*795d594fSAndroid Build Coastguard Worker uint32_t weak_global_ref_report_counter_ GUARDED_BY(Locks::jni_weak_globals_lock_) 285*795d594fSAndroid Build Coastguard Worker = kGlobalRefReportInterval; 286*795d594fSAndroid Build Coastguard Worker uint32_t global_ref_report_counter_ GUARDED_BY(Locks::jni_globals_lock_) 287*795d594fSAndroid Build Coastguard Worker = kGlobalRefReportInterval; 288*795d594fSAndroid Build Coastguard Worker 289*795d594fSAndroid Build Coastguard Worker friend class linker::ImageWriter; // Uses `globals_` and `weak_globals_` without read barrier. 290*795d594fSAndroid Build Coastguard Worker friend IndirectReferenceTable* GetIndirectReferenceTable(ScopedObjectAccess& soa, 291*795d594fSAndroid Build Coastguard Worker IndirectRefKind kind); 292*795d594fSAndroid Build Coastguard Worker 293*795d594fSAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(JavaVMExt); 294*795d594fSAndroid Build Coastguard Worker }; 295*795d594fSAndroid Build Coastguard Worker 296*795d594fSAndroid Build Coastguard Worker } // namespace art 297*795d594fSAndroid Build Coastguard Worker 298*795d594fSAndroid Build Coastguard Worker #endif // ART_RUNTIME_JNI_JAVA_VM_EXT_H_ 299