xref: /aosp_15_r20/art/runtime/jni/java_vm_ext.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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