• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * Copyright (C) 2011 The Android Open Source Project
3   *
4   * Licensed under the Apache License, Version 2.0 (the "License");
5   * you may not use this file except in compliance with the License.
6   * You may obtain a copy of the License at
7   *
8   *      http://www.apache.org/licenses/LICENSE-2.0
9   *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  #ifndef ART_RUNTIME_RUNTIME_H_
18  #define ART_RUNTIME_RUNTIME_H_
19  
20  #include <jni.h>
21  #include <stdio.h>
22  
23  #include <forward_list>
24  #include <iosfwd>
25  #include <memory>
26  #include <set>
27  #include <string>
28  #include <utility>
29  #include <vector>
30  
31  #include "app_info.h"
32  #include "base/locks.h"
33  #include "base/macros.h"
34  #include "base/mem_map.h"
35  #include "base/metrics/metrics.h"
36  #include "base/string_view_cpp20.h"
37  #include "compat_framework.h"
38  #include "deoptimization_kind.h"
39  #include "dex/dex_file_types.h"
40  #include "experimental_flags.h"
41  #include "gc_root.h"
42  #include "instrumentation.h"
43  #include "jdwp_provider.h"
44  #include "jni/jni_id_manager.h"
45  #include "jni_id_type.h"
46  #include "metrics/reporter.h"
47  #include "obj_ptr.h"
48  #include "offsets.h"
49  #include "process_state.h"
50  #include "quick/quick_method_frame_info.h"
51  #include "reflective_value_visitor.h"
52  #include "runtime_stats.h"
53  
54  namespace art {
55  
56  namespace gc {
57  class AbstractSystemWeakHolder;
58  class Heap;
59  }  // namespace gc
60  
61  namespace hiddenapi {
62  enum class EnforcementPolicy;
63  }  // namespace hiddenapi
64  
65  namespace jit {
66  class Jit;
67  class JitCodeCache;
68  class JitOptions;
69  }  // namespace jit
70  
71  namespace jni {
72  class SmallLrtAllocator;
73  }  // namespace jni
74  
75  namespace mirror {
76  class Array;
77  class ClassLoader;
78  class DexCache;
79  template<class T> class ObjectArray;
80  template<class T> class PrimitiveArray;
81  using ByteArray = PrimitiveArray<int8_t>;
82  class String;
83  class Throwable;
84  }  // namespace mirror
85  namespace ti {
86  class Agent;
87  class AgentSpec;
88  }  // namespace ti
89  namespace verifier {
90  class MethodVerifier;
91  enum class VerifyMode : int8_t;
92  }  // namespace verifier
93  class ArenaPool;
94  class ArtMethod;
95  enum class CalleeSaveType: uint32_t;
96  class ClassLinker;
97  class CompilerCallbacks;
98  class Dex2oatImageTest;
99  class DexFile;
100  enum class InstructionSet;
101  class InternTable;
102  class IsMarkedVisitor;
103  class JavaVMExt;
104  class LinearAlloc;
105  class MonitorList;
106  class MonitorPool;
107  class NullPointerHandler;
108  class OatFileAssistantTest;
109  class OatFileManager;
110  class Plugin;
111  struct RuntimeArgumentMap;
112  class RuntimeCallbacks;
113  class SignalCatcher;
114  class StackOverflowHandler;
115  class SuspensionHandler;
116  class ThreadList;
117  class ThreadPool;
118  class Trace;
119  struct TraceConfig;
120  class Transaction;
121  
122  using RuntimeOptions = std::vector<std::pair<std::string, const void*>>;
123  
124  class Runtime {
125   public:
126    // Parse raw runtime options.
127    static bool ParseOptions(const RuntimeOptions& raw_options,
128                             bool ignore_unrecognized,
129                             RuntimeArgumentMap* runtime_options);
130  
131    // Creates and initializes a new runtime.
132    static bool Create(RuntimeArgumentMap&& runtime_options)
133        SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_);
134  
135    // Creates and initializes a new runtime.
136    static bool Create(const RuntimeOptions& raw_options, bool ignore_unrecognized)
137        SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_);
138  
139    enum class RuntimeDebugState {
140      // This doesn't support any debug features / method tracing. This is the expected state usually.
141      kNonJavaDebuggable,
142      // This supports method tracing and a restricted set of debug features (for ex: redefinition
143      // isn't supported). We transition to this state when method tracing has started or when the
144      // debugger was attached and transition back to NonDebuggable once the tracing has stopped /
145      // the debugger agent has detached..
146      kJavaDebuggable,
147      // The runtime was started as a debuggable runtime. This allows us to support the extended set
148      // of debug features (for ex: redefinition). We never transition out of this state.
149      kJavaDebuggableAtInit
150    };
151  
152    bool EnsurePluginLoaded(const char* plugin_name, std::string* error_msg);
153    bool EnsurePerfettoPlugin(std::string* error_msg);
154  
155    // IsAotCompiler for compilers that don't have a running runtime. Only dex2oat currently.
IsAotCompiler()156    bool IsAotCompiler() const {
157      return !UseJitCompilation() && IsCompiler();
158    }
159  
160    // IsCompiler is any runtime which has a running compiler, either dex2oat or JIT.
IsCompiler()161    bool IsCompiler() const {
162      return compiler_callbacks_ != nullptr;
163    }
164  
165    // If a compiler, are we compiling a boot image?
166    bool IsCompilingBootImage() const;
167  
168    bool CanRelocate() const;
169  
ShouldRelocate()170    bool ShouldRelocate() const {
171      return must_relocate_ && CanRelocate();
172    }
173  
MustRelocateIfPossible()174    bool MustRelocateIfPossible() const {
175      return must_relocate_;
176    }
177  
IsImageDex2OatEnabled()178    bool IsImageDex2OatEnabled() const {
179      return image_dex2oat_enabled_;
180    }
181  
GetCompilerCallbacks()182    CompilerCallbacks* GetCompilerCallbacks() {
183      return compiler_callbacks_;
184    }
185  
SetCompilerCallbacks(CompilerCallbacks * callbacks)186    void SetCompilerCallbacks(CompilerCallbacks* callbacks) {
187      CHECK(callbacks != nullptr);
188      compiler_callbacks_ = callbacks;
189    }
190  
IsZygote()191    bool IsZygote() const {
192      return is_zygote_;
193    }
194  
IsPrimaryZygote()195    bool IsPrimaryZygote() const {
196      return is_primary_zygote_;
197    }
198  
IsSystemServer()199    bool IsSystemServer() const {
200      return is_system_server_;
201    }
202  
SetAsSystemServer()203    void SetAsSystemServer() {
204      is_system_server_ = true;
205      is_zygote_ = false;
206      is_primary_zygote_ = false;
207    }
208  
SetAsZygoteChild(bool is_system_server,bool is_zygote)209    void SetAsZygoteChild(bool is_system_server, bool is_zygote) {
210      // System server should have been set earlier in SetAsSystemServer.
211      CHECK_EQ(is_system_server_, is_system_server);
212      is_zygote_ = is_zygote;
213      is_primary_zygote_ = false;
214    }
215  
IsExplicitGcDisabled()216    bool IsExplicitGcDisabled() const {
217      return is_explicit_gc_disabled_;
218    }
219  
220    std::string GetCompilerExecutable() const;
221  
GetCompilerOptions()222    const std::vector<std::string>& GetCompilerOptions() const {
223      return compiler_options_;
224    }
225  
AddCompilerOption(const std::string & option)226    void AddCompilerOption(const std::string& option) {
227      compiler_options_.push_back(option);
228    }
229  
GetImageCompilerOptions()230    const std::vector<std::string>& GetImageCompilerOptions() const {
231      return image_compiler_options_;
232    }
233  
GetImageLocations()234    const std::vector<std::string>& GetImageLocations() const {
235      return image_locations_;
236    }
237  
238    // Starts a runtime, which may cause threads to be started and code to run.
239    bool Start() UNLOCK_FUNCTION(Locks::mutator_lock_);
240  
241    bool IsShuttingDown(Thread* self);
IsShuttingDownLocked()242    bool IsShuttingDownLocked() const REQUIRES(Locks::runtime_shutdown_lock_) {
243      return shutting_down_.load(std::memory_order_relaxed);
244    }
IsShuttingDownUnsafe()245    bool IsShuttingDownUnsafe() const {
246      return shutting_down_.load(std::memory_order_relaxed);
247    }
SetShuttingDown()248    void SetShuttingDown() REQUIRES(Locks::runtime_shutdown_lock_) {
249      shutting_down_.store(true, std::memory_order_relaxed);
250    }
251  
NumberOfThreadsBeingBorn()252    size_t NumberOfThreadsBeingBorn() const REQUIRES(Locks::runtime_shutdown_lock_) {
253      return threads_being_born_;
254    }
255  
StartThreadBirth()256    void StartThreadBirth() REQUIRES(Locks::runtime_shutdown_lock_) {
257      threads_being_born_++;
258    }
259  
260    void EndThreadBirth() REQUIRES(Locks::runtime_shutdown_lock_);
261  
IsStarted()262    bool IsStarted() const {
263      return started_;
264    }
265  
IsFinishedStarting()266    bool IsFinishedStarting() const {
267      return finished_starting_;
268    }
269  
270    void RunRootClinits(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_);
271  
Current()272    static Runtime* Current() {
273      return instance_;
274    }
275  
276    // Set the current runtime to be the given instance.
277    // Note that this function is not responsible for cleaning up the old instance or taking the
278    // ownership of the new instance.
279    //
280    // For test use only.
TestOnlySetCurrent(Runtime * instance)281    static void TestOnlySetCurrent(Runtime* instance) { instance_ = instance; }
282  
283    // Aborts semi-cleanly. Used in the implementation of LOG(FATAL), which most
284    // callers should prefer.
285    NO_RETURN static void Abort(const char* msg) REQUIRES(!Locks::abort_lock_);
286  
287    // Returns the "main" ThreadGroup, used when attaching user threads.
288    jobject GetMainThreadGroup() const;
289  
290    // Returns the "system" ThreadGroup, used when attaching our internal threads.
291    jobject GetSystemThreadGroup() const;
292  
293    // Returns the system ClassLoader which represents the CLASSPATH.
294    jobject GetSystemClassLoader() const;
295  
296    // Attaches the calling native thread to the runtime.
297    bool AttachCurrentThread(const char* thread_name,
298                             bool as_daemon,
299                             jobject thread_group,
300                             bool create_peer,
301                             bool should_run_callbacks = true);
302  
303    void CallExitHook(jint status);
304  
305    // Detaches the current native thread from the runtime.
306    void DetachCurrentThread(bool should_run_callbacks = true) REQUIRES(!Locks::mutator_lock_);
307  
308    void DumpDeoptimizations(std::ostream& os);
309    void DumpForSigQuit(std::ostream& os);
310    void DumpLockHolders(std::ostream& os);
311  
312    ~Runtime();
313  
GetBootClassPath()314    const std::vector<std::string>& GetBootClassPath() const {
315      return boot_class_path_;
316    }
317  
GetBootClassPathLocations()318    const std::vector<std::string>& GetBootClassPathLocations() const {
319      DCHECK(boot_class_path_locations_.empty() ||
320             boot_class_path_locations_.size() == boot_class_path_.size());
321      return boot_class_path_locations_.empty() ? boot_class_path_ : boot_class_path_locations_;
322    }
323  
324    // Dynamically adds an element to boot class path.
325    void AppendToBootClassPath(const std::string& filename,
326                               const std::string& location,
327                               const std::vector<std::unique_ptr<const art::DexFile>>& dex_files);
328  
329    // Same as above, but takes raw pointers.
330    void AppendToBootClassPath(const std::string& filename,
331                               const std::string& location,
332                               const std::vector<const art::DexFile*>& dex_files);
333  
334    // Same as above, but also takes a dex cache for each dex file.
335    void AppendToBootClassPath(
336        const std::string& filename,
337        const std::string& location,
338        const std::vector<std::pair<const art::DexFile*, ObjPtr<mirror::DexCache>>>&
339            dex_files_and_cache);
340  
341    // Dynamically adds an element to boot class path and takes ownership of the dex files.
342    void AddExtraBootDexFiles(const std::string& filename,
343                              const std::string& location,
344                              std::vector<std::unique_ptr<const art::DexFile>>&& dex_files);
345  
GetBootClassPathFds()346    const std::vector<int>& GetBootClassPathFds() const {
347      return boot_class_path_fds_;
348    }
349  
GetBootClassPathImageFds()350    const std::vector<int>& GetBootClassPathImageFds() const {
351      return boot_class_path_image_fds_;
352    }
353  
GetBootClassPathVdexFds()354    const std::vector<int>& GetBootClassPathVdexFds() const {
355      return boot_class_path_vdex_fds_;
356    }
357  
GetBootClassPathOatFds()358    const std::vector<int>& GetBootClassPathOatFds() const {
359      return boot_class_path_oat_fds_;
360    }
361  
362    // Returns the checksums for the boot image, extensions and extra boot class path dex files,
363    // based on the image spaces and boot class path dex files loaded in memory.
GetBootClassPathChecksums()364    const std::string& GetBootClassPathChecksums() const {
365      return boot_class_path_checksums_;
366    }
367  
GetClassPathString()368    const std::string& GetClassPathString() const {
369      return class_path_string_;
370    }
371  
GetClassLinker()372    ClassLinker* GetClassLinker() const {
373      return class_linker_;
374    }
375  
GetSmallLrtAllocator()376    jni::SmallLrtAllocator* GetSmallLrtAllocator() const {
377      return small_lrt_allocator_;
378    }
379  
GetJniIdManager()380    jni::JniIdManager* GetJniIdManager() const {
381      return jni_id_manager_.get();
382    }
383  
GetDefaultStackSize()384    size_t GetDefaultStackSize() const {
385      return default_stack_size_;
386    }
387  
GetFinalizerTimeoutMs()388    unsigned int GetFinalizerTimeoutMs() const {
389      return finalizer_timeout_ms_;
390    }
391  
GetHeap()392    gc::Heap* GetHeap() const {
393      return heap_;
394    }
395  
GetInternTable()396    InternTable* GetInternTable() const {
397      DCHECK(intern_table_ != nullptr);
398      return intern_table_;
399    }
400  
GetJavaVM()401    JavaVMExt* GetJavaVM() const {
402      return java_vm_.get();
403    }
404  
GetMaxSpinsBeforeThinLockInflation()405    size_t GetMaxSpinsBeforeThinLockInflation() const {
406      return max_spins_before_thin_lock_inflation_;
407    }
408  
GetMonitorList()409    MonitorList* GetMonitorList() const {
410      return monitor_list_;
411    }
412  
GetMonitorPool()413    MonitorPool* GetMonitorPool() const {
414      return monitor_pool_;
415    }
416  
417    // Is the given object the special object used to mark a cleared JNI weak global?
418    bool IsClearedJniWeakGlobal(ObjPtr<mirror::Object> obj) REQUIRES_SHARED(Locks::mutator_lock_);
419  
420    // Get the special object used to mark a cleared JNI weak global.
421    mirror::Object* GetClearedJniWeakGlobal() REQUIRES_SHARED(Locks::mutator_lock_);
422  
423    mirror::Throwable* GetPreAllocatedOutOfMemoryErrorWhenThrowingException()
424        REQUIRES_SHARED(Locks::mutator_lock_);
425    mirror::Throwable* GetPreAllocatedOutOfMemoryErrorWhenThrowingOOME()
426        REQUIRES_SHARED(Locks::mutator_lock_);
427    mirror::Throwable* GetPreAllocatedOutOfMemoryErrorWhenHandlingStackOverflow()
428        REQUIRES_SHARED(Locks::mutator_lock_);
429  
430    mirror::Throwable* GetPreAllocatedNoClassDefFoundError()
431        REQUIRES_SHARED(Locks::mutator_lock_);
432  
GetProperties()433    const std::vector<std::string>& GetProperties() const {
434      return properties_;
435    }
436  
GetThreadList()437    ThreadList* GetThreadList() const {
438      return thread_list_;
439    }
440  
GetVersion()441    static const char* GetVersion() {
442      return "2.1.0";
443    }
444  
IsMethodHandlesEnabled()445    bool IsMethodHandlesEnabled() const {
446      return true;
447    }
448  
449    void DisallowNewSystemWeaks() REQUIRES_SHARED(Locks::mutator_lock_);
450    void AllowNewSystemWeaks() REQUIRES_SHARED(Locks::mutator_lock_);
451    // broadcast_for_checkpoint is true when we broadcast for making blocking threads to respond to
452    // checkpoint requests. It's false when we broadcast to unblock blocking threads after system weak
453    // access is reenabled.
454    void BroadcastForNewSystemWeaks(bool broadcast_for_checkpoint = false);
455  
456    // Visit all the roots. If only_dirty is true then non-dirty roots won't be visited. If
457    // clean_dirty is true then dirty roots will be marked as non-dirty after visiting.
458    void VisitRoots(RootVisitor* visitor, VisitRootFlags flags = kVisitRootFlagAllRoots)
459        REQUIRES(!Locks::classlinker_classes_lock_, !Locks::trace_lock_)
460        REQUIRES_SHARED(Locks::mutator_lock_);
461  
462    // Visit image roots, only used for hprof since the GC uses the image space mod union table
463    // instead.
464    void VisitImageRoots(RootVisitor* visitor) REQUIRES_SHARED(Locks::mutator_lock_);
465  
466    // Visit all of the roots we can safely visit concurrently.
467    void VisitConcurrentRoots(RootVisitor* visitor,
468                              VisitRootFlags flags = kVisitRootFlagAllRoots)
469        REQUIRES(!Locks::classlinker_classes_lock_, !Locks::trace_lock_)
470        REQUIRES_SHARED(Locks::mutator_lock_);
471  
472    // Visit all of the non thread roots, we can do this with mutators unpaused.
473    void VisitNonThreadRoots(RootVisitor* visitor)
474        REQUIRES_SHARED(Locks::mutator_lock_);
475  
476    void VisitTransactionRoots(RootVisitor* visitor)
477        REQUIRES_SHARED(Locks::mutator_lock_);
478  
479    // Sweep system weaks, the system weak is deleted if the visitor return null. Otherwise, the
480    // system weak is updated to be the visitor's returned value.
481    void SweepSystemWeaks(IsMarkedVisitor* visitor) REQUIRES_SHARED(Locks::mutator_lock_);
482  
483    // Walk all reflective objects and visit their targets as well as any method/fields held by the
484    // runtime threads that are marked as being reflective.
485    void VisitReflectiveTargets(ReflectiveValueVisitor* visitor) REQUIRES(Locks::mutator_lock_);
486    // Helper for visiting reflective targets with lambdas for both field and method reflective
487    // targets.
488    template <typename FieldVis, typename MethodVis>
VisitReflectiveTargets(FieldVis && fv,MethodVis && mv)489    void VisitReflectiveTargets(FieldVis&& fv, MethodVis&& mv) REQUIRES(Locks::mutator_lock_) {
490      FunctionReflectiveValueVisitor frvv(fv, mv);
491      VisitReflectiveTargets(&frvv);
492    }
493  
494    // Returns a special method that calls into a trampoline for runtime method resolution
495    ArtMethod* GetResolutionMethod();
496  
HasResolutionMethod()497    bool HasResolutionMethod() const {
498      return resolution_method_ != nullptr;
499    }
500  
501    void SetResolutionMethod(ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_);
ClearResolutionMethod()502    void ClearResolutionMethod() {
503      resolution_method_ = nullptr;
504    }
505  
506    ArtMethod* CreateResolutionMethod() REQUIRES_SHARED(Locks::mutator_lock_);
507  
508    // Returns a special method that calls into a trampoline for runtime imt conflicts.
509    ArtMethod* GetImtConflictMethod();
510    ArtMethod* GetImtUnimplementedMethod();
511  
HasImtConflictMethod()512    bool HasImtConflictMethod() const {
513      return imt_conflict_method_ != nullptr;
514    }
515  
ClearImtConflictMethod()516    void ClearImtConflictMethod() {
517      imt_conflict_method_ = nullptr;
518    }
519  
520    void FixupConflictTables() REQUIRES_SHARED(Locks::mutator_lock_);
521    void SetImtConflictMethod(ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_);
522    void SetImtUnimplementedMethod(ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_);
523  
524    ArtMethod* CreateImtConflictMethod(LinearAlloc* linear_alloc)
525        REQUIRES_SHARED(Locks::mutator_lock_);
526  
ClearImtUnimplementedMethod()527    void ClearImtUnimplementedMethod() {
528      imt_unimplemented_method_ = nullptr;
529    }
530  
HasCalleeSaveMethod(CalleeSaveType type)531    bool HasCalleeSaveMethod(CalleeSaveType type) const {
532      return callee_save_methods_[static_cast<size_t>(type)] != 0u;
533    }
534  
535    ArtMethod* GetCalleeSaveMethod(CalleeSaveType type)
536        REQUIRES_SHARED(Locks::mutator_lock_);
537  
538    ArtMethod* GetCalleeSaveMethodUnchecked(CalleeSaveType type)
539        REQUIRES_SHARED(Locks::mutator_lock_);
540  
541    QuickMethodFrameInfo GetRuntimeMethodFrameInfo(ArtMethod* method)
542        REQUIRES_SHARED(Locks::mutator_lock_);
543  
GetCalleeSaveMethodOffset(CalleeSaveType type)544    static constexpr size_t GetCalleeSaveMethodOffset(CalleeSaveType type) {
545      return OFFSETOF_MEMBER(Runtime, callee_save_methods_[static_cast<size_t>(type)]);
546    }
547  
GetInstrumentationOffset()548    static constexpr MemberOffset GetInstrumentationOffset() {
549      return MemberOffset(OFFSETOF_MEMBER(Runtime, instrumentation_));
550    }
551  
GetInstructionSet()552    InstructionSet GetInstructionSet() const {
553      return instruction_set_;
554    }
555  
556    void SetInstructionSet(InstructionSet instruction_set);
557    void ClearInstructionSet();
558  
559    void SetCalleeSaveMethod(ArtMethod* method, CalleeSaveType type);
560    void ClearCalleeSaveMethods();
561  
562    ArtMethod* CreateCalleeSaveMethod() REQUIRES_SHARED(Locks::mutator_lock_);
563  
564    uint64_t GetStat(int kind);
565  
GetStats()566    RuntimeStats* GetStats() {
567      return &stats_;
568    }
569  
HasStatsEnabled()570    bool HasStatsEnabled() const {
571      return stats_enabled_;
572    }
573  
574    void ResetStats(int kinds);
575  
576    void SetStatsEnabled(bool new_state)
577        REQUIRES(!Locks::instrument_entrypoints_lock_, !Locks::mutator_lock_);
578  
579    enum class NativeBridgeAction {  // private
580      kUnload,
581      kInitialize
582    };
583  
GetJit()584    jit::Jit* GetJit() const {
585      return jit_.get();
586    }
587  
GetJitCodeCache()588    jit::JitCodeCache* GetJitCodeCache() const {
589      return jit_code_cache_.get();
590    }
591  
592    // Returns true if JIT compilations are enabled. GetJit() will be not null in this case.
593    bool UseJitCompilation() const;
594  
595    void PreZygoteFork();
596    void PostZygoteFork();
597    void InitNonZygoteOrPostFork(
598        JNIEnv* env,
599        bool is_system_server,
600        bool is_child_zygote,
601        NativeBridgeAction action,
602        const char* isa,
603        bool profile_system_server = false);
604  
GetInstrumentation()605    const instrumentation::Instrumentation* GetInstrumentation() const {
606      return &instrumentation_;
607    }
608  
GetInstrumentation()609    instrumentation::Instrumentation* GetInstrumentation() {
610      return &instrumentation_;
611    }
612  
613    void RegisterAppInfo(const std::string& package_name,
614                         const std::vector<std::string>& code_paths,
615                         const std::string& profile_output_filename,
616                         const std::string& ref_profile_filename,
617                         int32_t code_type);
618  
619    // Transaction support.
620    bool IsActiveTransaction() const;
621    // EnterTransactionMode may suspend.
622    void EnterTransactionMode(bool strict, mirror::Class* root) REQUIRES_SHARED(Locks::mutator_lock_);
623    void ExitTransactionMode();
624    void RollbackAllTransactions() REQUIRES_SHARED(Locks::mutator_lock_);
625    // Transaction rollback and exit transaction are always done together, it's convenience to
626    // do them in one function.
627    void RollbackAndExitTransactionMode() REQUIRES_SHARED(Locks::mutator_lock_);
628    bool IsTransactionAborted() const;
629    const Transaction* GetTransaction() const;
630    Transaction* GetTransaction();
631    bool IsActiveStrictTransactionMode() const;
632  
633    void AbortTransactionAndThrowAbortError(Thread* self, const std::string& abort_message)
634        REQUIRES_SHARED(Locks::mutator_lock_);
635    void ThrowTransactionAbortError(Thread* self)
636        REQUIRES_SHARED(Locks::mutator_lock_);
637  
638    void RecordWriteFieldBoolean(mirror::Object* obj,
639                                 MemberOffset field_offset,
640                                 uint8_t value,
641                                 bool is_volatile);
642    void RecordWriteFieldByte(mirror::Object* obj,
643                              MemberOffset field_offset,
644                              int8_t value,
645                              bool is_volatile);
646    void RecordWriteFieldChar(mirror::Object* obj,
647                              MemberOffset field_offset,
648                              uint16_t value,
649                              bool is_volatile);
650    void RecordWriteFieldShort(mirror::Object* obj,
651                               MemberOffset field_offset,
652                               int16_t value,
653                               bool is_volatile);
654    void RecordWriteField32(mirror::Object* obj,
655                            MemberOffset field_offset,
656                            uint32_t value,
657                            bool is_volatile);
658    void RecordWriteField64(mirror::Object* obj,
659                            MemberOffset field_offset,
660                            uint64_t value,
661                            bool is_volatile);
662    void RecordWriteFieldReference(mirror::Object* obj,
663                                   MemberOffset field_offset,
664                                   ObjPtr<mirror::Object> value,
665                                   bool is_volatile)
666        REQUIRES_SHARED(Locks::mutator_lock_);
667    void RecordWriteArray(mirror::Array* array, size_t index, uint64_t value)
668        REQUIRES_SHARED(Locks::mutator_lock_);
669    void RecordStrongStringInsertion(ObjPtr<mirror::String> s)
670        REQUIRES(Locks::intern_table_lock_);
671    void RecordWeakStringInsertion(ObjPtr<mirror::String> s)
672        REQUIRES(Locks::intern_table_lock_);
673    void RecordStrongStringRemoval(ObjPtr<mirror::String> s)
674        REQUIRES(Locks::intern_table_lock_);
675    void RecordWeakStringRemoval(ObjPtr<mirror::String> s)
676        REQUIRES(Locks::intern_table_lock_);
677    void RecordResolveString(ObjPtr<mirror::DexCache> dex_cache, dex::StringIndex string_idx)
678        REQUIRES_SHARED(Locks::mutator_lock_);
679    void RecordResolveMethodType(ObjPtr<mirror::DexCache> dex_cache, dex::ProtoIndex proto_idx)
680        REQUIRES_SHARED(Locks::mutator_lock_);
681  
682    void SetFaultMessage(const std::string& message);
683  
684    void AddCurrentRuntimeFeaturesAsDex2OatArguments(std::vector<std::string>* arg_vector) const;
685  
GetImplicitStackOverflowChecks()686    bool GetImplicitStackOverflowChecks() const {
687      return implicit_so_checks_;
688    }
689  
GetImplicitSuspendChecks()690    bool GetImplicitSuspendChecks() const {
691      return implicit_suspend_checks_;
692    }
693  
GetImplicitNullChecks()694    bool GetImplicitNullChecks() const {
695      return implicit_null_checks_;
696    }
697  
698    void DisableVerifier();
699    bool IsVerificationEnabled() const;
700    bool IsVerificationSoftFail() const;
701  
SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy policy)702    void SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy policy) {
703      hidden_api_policy_ = policy;
704    }
705  
GetHiddenApiEnforcementPolicy()706    hiddenapi::EnforcementPolicy GetHiddenApiEnforcementPolicy() const {
707      return hidden_api_policy_;
708    }
709  
SetCorePlatformApiEnforcementPolicy(hiddenapi::EnforcementPolicy policy)710    void SetCorePlatformApiEnforcementPolicy(hiddenapi::EnforcementPolicy policy) {
711      core_platform_api_policy_ = policy;
712    }
713  
GetCorePlatformApiEnforcementPolicy()714    hiddenapi::EnforcementPolicy GetCorePlatformApiEnforcementPolicy() const {
715      return core_platform_api_policy_;
716    }
717  
SetTestApiEnforcementPolicy(hiddenapi::EnforcementPolicy policy)718    void SetTestApiEnforcementPolicy(hiddenapi::EnforcementPolicy policy) {
719      test_api_policy_ = policy;
720    }
721  
GetTestApiEnforcementPolicy()722    hiddenapi::EnforcementPolicy GetTestApiEnforcementPolicy() const {
723      return test_api_policy_;
724    }
725  
SetHiddenApiExemptions(const std::vector<std::string> & exemptions)726    void SetHiddenApiExemptions(const std::vector<std::string>& exemptions) {
727      hidden_api_exemptions_ = exemptions;
728    }
729  
GetHiddenApiExemptions()730    const std::vector<std::string>& GetHiddenApiExemptions() {
731      return hidden_api_exemptions_;
732    }
733  
SetDedupeHiddenApiWarnings(bool value)734    void SetDedupeHiddenApiWarnings(bool value) {
735      dedupe_hidden_api_warnings_ = value;
736    }
737  
ShouldDedupeHiddenApiWarnings()738    bool ShouldDedupeHiddenApiWarnings() {
739      return dedupe_hidden_api_warnings_;
740    }
741  
SetHiddenApiEventLogSampleRate(uint32_t rate)742    void SetHiddenApiEventLogSampleRate(uint32_t rate) {
743      hidden_api_access_event_log_rate_ = rate;
744    }
745  
GetHiddenApiEventLogSampleRate()746    uint32_t GetHiddenApiEventLogSampleRate() const {
747      return hidden_api_access_event_log_rate_;
748    }
749  
GetProcessPackageName()750    const std::string& GetProcessPackageName() const {
751      return process_package_name_;
752    }
753  
SetProcessPackageName(const char * package_name)754    void SetProcessPackageName(const char* package_name) {
755      if (package_name == nullptr) {
756        process_package_name_.clear();
757      } else {
758        process_package_name_ = package_name;
759      }
760    }
761  
GetProcessDataDirectory()762    const std::string& GetProcessDataDirectory() const {
763      return process_data_directory_;
764    }
765  
SetProcessDataDirectory(const char * data_dir)766    void SetProcessDataDirectory(const char* data_dir) {
767      if (data_dir == nullptr) {
768        process_data_directory_.clear();
769      } else {
770        process_data_directory_ = data_dir;
771      }
772    }
773  
GetCpuAbilist()774    const std::vector<std::string>& GetCpuAbilist() const {
775      return cpu_abilist_;
776    }
777  
IsRunningOnMemoryTool()778    bool IsRunningOnMemoryTool() const {
779      return is_running_on_memory_tool_;
780    }
781  
SetTargetSdkVersion(uint32_t version)782    void SetTargetSdkVersion(uint32_t version) {
783      target_sdk_version_ = version;
784    }
785  
GetTargetSdkVersion()786    uint32_t GetTargetSdkVersion() const {
787      return target_sdk_version_;
788    }
789  
GetCompatFramework()790    CompatFramework& GetCompatFramework() {
791      return compat_framework_;
792    }
793  
GetZygoteMaxFailedBoots()794    uint32_t GetZygoteMaxFailedBoots() const {
795      return zygote_max_failed_boots_;
796    }
797  
AreExperimentalFlagsEnabled(ExperimentalFlags flags)798    bool AreExperimentalFlagsEnabled(ExperimentalFlags flags) {
799      return (experimental_flags_ & flags) != ExperimentalFlags::kNone;
800    }
801  
802    void CreateJitCodeCache(bool rwx_memory_allowed);
803  
804    // Create the JIT and instrumentation and code cache.
805    void CreateJit();
806  
GetLinearAllocArenaPool()807    ArenaPool* GetLinearAllocArenaPool() {
808      return linear_alloc_arena_pool_.get();
809    }
GetArenaPool()810    ArenaPool* GetArenaPool() {
811      return arena_pool_.get();
812    }
GetArenaPool()813    const ArenaPool* GetArenaPool() const {
814      return arena_pool_.get();
815    }
GetJitArenaPool()816    ArenaPool* GetJitArenaPool() {
817      return jit_arena_pool_.get();
818    }
819  
820    void ReclaimArenaPoolMemory();
821  
GetLinearAlloc()822    LinearAlloc* GetLinearAlloc() {
823      return linear_alloc_.get();
824    }
825  
GetStartupLinearAlloc()826    LinearAlloc* GetStartupLinearAlloc() {
827      return startup_linear_alloc_.load(std::memory_order_relaxed);
828    }
829  
GetJITOptions()830    jit::JitOptions* GetJITOptions() {
831      return jit_options_.get();
832    }
833  
IsJavaDebuggable()834    bool IsJavaDebuggable() const {
835      return runtime_debug_state_ == RuntimeDebugState::kJavaDebuggable ||
836             runtime_debug_state_ == RuntimeDebugState::kJavaDebuggableAtInit;
837    }
838  
IsJavaDebuggableAtInit()839    bool IsJavaDebuggableAtInit() const {
840      return runtime_debug_state_ == RuntimeDebugState::kJavaDebuggableAtInit;
841    }
842  
SetProfileableFromShell(bool value)843    void SetProfileableFromShell(bool value) {
844      is_profileable_from_shell_ = value;
845    }
846  
IsProfileableFromShell()847    bool IsProfileableFromShell() const {
848      return is_profileable_from_shell_;
849    }
850  
SetProfileable(bool value)851    void SetProfileable(bool value) {
852      is_profileable_ = value;
853    }
854  
IsProfileable()855    bool IsProfileable() const {
856      return is_profileable_;
857    }
858  
859    void SetRuntimeDebugState(RuntimeDebugState state);
860  
861    // Deoptimize the boot image, called for Java debuggable apps.
862    void DeoptimizeBootImage() REQUIRES(Locks::mutator_lock_);
863  
IsNativeDebuggable()864    bool IsNativeDebuggable() const {
865      return is_native_debuggable_;
866    }
867  
SetNativeDebuggable(bool value)868    void SetNativeDebuggable(bool value) {
869      is_native_debuggable_ = value;
870    }
871  
872    void SetSignalHookDebuggable(bool value);
873  
AreNonStandardExitsEnabled()874    bool AreNonStandardExitsEnabled() const {
875      return non_standard_exits_enabled_;
876    }
877  
SetNonStandardExitsEnabled()878    void SetNonStandardExitsEnabled() {
879      non_standard_exits_enabled_ = true;
880    }
881  
AreAsyncExceptionsThrown()882    bool AreAsyncExceptionsThrown() const {
883      return async_exceptions_thrown_;
884    }
885  
SetAsyncExceptionsThrown()886    void SetAsyncExceptionsThrown() {
887      async_exceptions_thrown_ = true;
888    }
889  
890    // Returns the build fingerprint, if set. Otherwise an empty string is returned.
GetFingerprint()891    std::string GetFingerprint() {
892      return fingerprint_;
893    }
894  
895    // Called from class linker.
896    void SetSentinel(ObjPtr<mirror::Object> sentinel) REQUIRES_SHARED(Locks::mutator_lock_);
897    // For testing purpose only.
898    // TODO: Remove this when this is no longer needed (b/116087961).
899    GcRoot<mirror::Object> GetSentinel() REQUIRES_SHARED(Locks::mutator_lock_);
900  
901  
902    // Use a sentinel for marking entries in a table that have been cleared.
903    // This helps diagnosing in case code tries to wrongly access such
904    // entries.
GetWeakClassSentinel()905    static mirror::Class* GetWeakClassSentinel() {
906      return reinterpret_cast<mirror::Class*>(0xebadbeef);
907    }
908  
909    // Create a normal LinearAlloc or low 4gb version if we are 64 bit AOT compiler.
910    LinearAlloc* CreateLinearAlloc();
911    // Setup linear-alloc allocators to stop using the current arena so that the
912    // next allocations, which would be after zygote fork, happens in userfaultfd
913    // visited space.
914    void SetupLinearAllocForPostZygoteFork(Thread* self)
915        REQUIRES(!Locks::mutator_lock_, !Locks::classlinker_classes_lock_);
916  
GetOatFileManager()917    OatFileManager& GetOatFileManager() const {
918      DCHECK(oat_file_manager_ != nullptr);
919      return *oat_file_manager_;
920    }
921  
922    double GetHashTableMinLoadFactor() const;
923    double GetHashTableMaxLoadFactor() const;
924  
IsSafeMode()925    bool IsSafeMode() const {
926      return safe_mode_;
927    }
928  
SetSafeMode(bool mode)929    void SetSafeMode(bool mode) {
930      safe_mode_ = mode;
931    }
932  
GetDumpNativeStackOnSigQuit()933    bool GetDumpNativeStackOnSigQuit() const {
934      return dump_native_stack_on_sig_quit_;
935    }
936  
937    void UpdateProcessState(ProcessState process_state);
938  
939    // Returns true if we currently care about long mutator pause.
InJankPerceptibleProcessState()940    bool InJankPerceptibleProcessState() const {
941      return process_state_ == kProcessStateJankPerceptible;
942    }
943  
944    void RegisterSensitiveThread() const;
945  
SetZygoteNoThreadSection(bool val)946    void SetZygoteNoThreadSection(bool val) {
947      zygote_no_threads_ = val;
948    }
949  
IsZygoteNoThreadSection()950    bool IsZygoteNoThreadSection() const {
951      return zygote_no_threads_;
952    }
953  
954    // Returns if the code can be deoptimized asynchronously. Code may be compiled with some
955    // optimization that makes it impossible to deoptimize.
956    bool IsAsyncDeoptimizeable(ArtMethod* method, uintptr_t code) const
957        REQUIRES_SHARED(Locks::mutator_lock_);
958  
959    // Returns a saved copy of the environment (getenv/setenv values).
960    // Used by Fork to protect against overwriting LD_LIBRARY_PATH, etc.
GetEnvSnapshot()961    char** GetEnvSnapshot() const {
962      return env_snapshot_.GetSnapshot();
963    }
964  
965    void AddSystemWeakHolder(gc::AbstractSystemWeakHolder* holder);
966    void RemoveSystemWeakHolder(gc::AbstractSystemWeakHolder* holder);
967  
968    void AttachAgent(JNIEnv* env, const std::string& agent_arg, jobject class_loader);
969  
GetAgents()970    const std::list<std::unique_ptr<ti::Agent>>& GetAgents() const {
971      return agents_;
972    }
973  
974    RuntimeCallbacks* GetRuntimeCallbacks();
975  
HasLoadedPlugins()976    bool HasLoadedPlugins() const {
977      return !plugins_.empty();
978    }
979  
980    void InitThreadGroups(Thread* self);
981  
SetDumpGCPerformanceOnShutdown(bool value)982    void SetDumpGCPerformanceOnShutdown(bool value) {
983      dump_gc_performance_on_shutdown_ = value;
984    }
985  
GetDumpGCPerformanceOnShutdown()986    bool GetDumpGCPerformanceOnShutdown() const {
987      return dump_gc_performance_on_shutdown_;
988    }
989  
IncrementDeoptimizationCount(DeoptimizationKind kind)990    void IncrementDeoptimizationCount(DeoptimizationKind kind) {
991      DCHECK_LE(kind, DeoptimizationKind::kLast);
992      deoptimization_counts_[static_cast<size_t>(kind)]++;
993    }
994  
GetNumberOfDeoptimizations()995    uint32_t GetNumberOfDeoptimizations() const {
996      uint32_t result = 0;
997      for (size_t i = 0; i <= static_cast<size_t>(DeoptimizationKind::kLast); ++i) {
998        result += deoptimization_counts_[i];
999      }
1000      return result;
1001    }
1002  
DenyArtApexDataFiles()1003    bool DenyArtApexDataFiles() const {
1004      return deny_art_apex_data_files_;
1005    }
1006  
GetMadviseWillNeedTotalDexSize()1007    size_t GetMadviseWillNeedTotalDexSize() const {
1008      return madvise_willneed_total_dex_size_;
1009    }
1010  
GetMadviseWillNeedSizeOdex()1011    size_t GetMadviseWillNeedSizeOdex() const {
1012      return madvise_willneed_odex_filesize_;
1013    }
1014  
GetMadviseWillNeedSizeArt()1015    size_t GetMadviseWillNeedSizeArt() const {
1016      return madvise_willneed_art_filesize_;
1017    }
1018  
GetJdwpOptions()1019    const std::string& GetJdwpOptions() {
1020      return jdwp_options_;
1021    }
1022  
GetJdwpProvider()1023    JdwpProvider GetJdwpProvider() const {
1024      return jdwp_provider_;
1025    }
1026  
GetJniIdType()1027    JniIdType GetJniIdType() const {
1028      return jni_ids_indirection_;
1029    }
1030  
CanSetJniIdType()1031    bool CanSetJniIdType() const {
1032      return GetJniIdType() == JniIdType::kSwapablePointer;
1033    }
1034  
1035    // Changes the JniIdType to the given type. Only allowed if CanSetJniIdType(). All threads must be
1036    // suspended to call this function.
1037    void SetJniIdType(JniIdType t);
1038  
GetVerifierLoggingThresholdMs()1039    uint32_t GetVerifierLoggingThresholdMs() const {
1040      return verifier_logging_threshold_ms_;
1041    }
1042  
1043    // Atomically delete the thread pool if the reference count is 0.
1044    bool DeleteThreadPool() REQUIRES(!Locks::runtime_thread_pool_lock_);
1045  
1046    // Wait for all the thread workers to be attached.
1047    void WaitForThreadPoolWorkersToStart() REQUIRES(!Locks::runtime_thread_pool_lock_);
1048  
1049    // Scoped usage of the runtime thread pool. Prevents the pool from being
1050    // deleted. Note that the thread pool is only for startup and gets deleted after.
1051    class ScopedThreadPoolUsage {
1052     public:
1053      ScopedThreadPoolUsage();
1054      ~ScopedThreadPoolUsage();
1055  
1056      // Return the thread pool.
GetThreadPool()1057      ThreadPool* GetThreadPool() const {
1058        return thread_pool_;
1059      }
1060  
1061     private:
1062      ThreadPool* const thread_pool_;
1063    };
1064  
ReleaseStartupLinearAlloc()1065    LinearAlloc* ReleaseStartupLinearAlloc() {
1066      return startup_linear_alloc_.exchange(nullptr, std::memory_order_relaxed);
1067    }
1068  
LoadAppImageStartupCache()1069    bool LoadAppImageStartupCache() const {
1070      return load_app_image_startup_cache_;
1071    }
1072  
SetLoadAppImageStartupCacheEnabled(bool enabled)1073    void SetLoadAppImageStartupCacheEnabled(bool enabled) {
1074      load_app_image_startup_cache_ = enabled;
1075    }
1076  
1077    // Reset the startup completed status so that we can call NotifyStartupCompleted again. Should
1078    // only be used for testing.
1079    void ResetStartupCompleted();
1080  
1081    // Notify the runtime that application startup is considered completed. Only has effect for the
1082    // first call. Returns whether this was the first call.
1083    bool NotifyStartupCompleted();
1084  
1085    // Notify the runtime that the application finished loading some dex/odex files. This is
1086    // called everytime we load a set of dex files in a class loader.
1087    void NotifyDexFileLoaded();
1088  
1089    // Return true if startup is already completed.
1090    bool GetStartupCompleted() const;
1091  
IsVerifierMissingKThrowFatal()1092    bool IsVerifierMissingKThrowFatal() const {
1093      return verifier_missing_kthrow_fatal_;
1094    }
1095  
IsJavaZygoteForkLoopRequired()1096    bool IsJavaZygoteForkLoopRequired() const {
1097      return force_java_zygote_fork_loop_;
1098    }
1099  
IsPerfettoHprofEnabled()1100    bool IsPerfettoHprofEnabled() const {
1101      return perfetto_hprof_enabled_;
1102    }
1103  
IsPerfettoJavaHeapStackProfEnabled()1104    bool IsPerfettoJavaHeapStackProfEnabled() const {
1105      return perfetto_javaheapprof_enabled_;
1106    }
1107  
IsMonitorTimeoutEnabled()1108    bool IsMonitorTimeoutEnabled() const {
1109      return monitor_timeout_enable_;
1110    }
1111  
GetMonitorTimeoutNs()1112    uint64_t GetMonitorTimeoutNs() const {
1113      return monitor_timeout_ns_;
1114    }
1115  
1116    // Return whether this is system server and it is being profiled.
1117    bool IsSystemServerProfiled() const;
1118  
1119    // Return whether we should load oat files as executable or not.
1120    bool GetOatFilesExecutable() const;
1121  
GetMetrics()1122    metrics::ArtMetrics* GetMetrics() { return &metrics_; }
1123  
GetAppInfo()1124    AppInfo* GetAppInfo() { return &app_info_; }
1125  
1126    void RequestMetricsReport(bool synchronous = true);
1127  
1128    static void MadviseFileForRange(size_t madvise_size_limit_bytes,
1129                                    size_t map_size_bytes,
1130                                    const uint8_t* map_begin,
1131                                    const uint8_t* map_end,
1132                                    const std::string& file_name);
1133  
GetApexVersions()1134    const std::string& GetApexVersions() const {
1135      return apex_versions_;
1136    }
1137  
1138    // Return whether a boot image has a profile. This means it's an in-memory
1139    // image rather that an image loaded from disk.
1140    bool HasImageWithProfile() const;
1141  
GetNoSigChain()1142    bool GetNoSigChain() const {
1143      return no_sig_chain_;
1144    }
1145  
1146    void AddGeneratedCodeRange(const void* start, size_t size);
1147    void RemoveGeneratedCodeRange(const void* start, size_t size)
1148        REQUIRES_SHARED(Locks::mutator_lock_);
1149  
1150    // Trigger a flag reload from system properties or device congfigs.
1151    //
1152    // Should only be called from runtime init and zygote post fork as
1153    // we don't want to change the runtime config midway during execution.
1154    //
1155    // The caller argument should be the name of the function making this call
1156    // and will be used to enforce the appropriate names.
1157    //
1158    // See Flags::ReloadAllFlags as well.
1159    static void ReloadAllFlags(const std::string& caller);
1160  
1161    // Parses /apex/apex-info-list.xml to build a string containing apex versions of boot classpath
1162    // jars, which is encoded into .oat files.
1163    static std::string GetApexVersions(ArrayRef<const std::string> boot_class_path_locations);
1164  
AllowInMemoryCompilation()1165    bool AllowInMemoryCompilation() const { return allow_in_memory_compilation_; }
1166  
1167    // Used by plugin code to attach a hook for OOME.
SetOutOfMemoryErrorHook(void (* hook)())1168    void SetOutOfMemoryErrorHook(void (*hook)()) {
1169      out_of_memory_error_hook_ = hook;
1170    }
1171  
OutOfMemoryErrorHook()1172    void OutOfMemoryErrorHook() {
1173      if (out_of_memory_error_hook_ != nullptr) {
1174        out_of_memory_error_hook_();
1175      }
1176    }
1177  
1178   private:
1179    static void InitPlatformSignalHandlers();
1180  
1181    Runtime();
1182  
HandlesSignalsInCompiledCode()1183    bool HandlesSignalsInCompiledCode() const {
1184      return !no_sig_chain_ &&
1185             (implicit_null_checks_ || implicit_so_checks_ || implicit_suspend_checks_);
1186    }
1187  
1188    void BlockSignals();
1189  
1190    bool Init(RuntimeArgumentMap&& runtime_options)
1191        SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_);
1192    void InitNativeMethods() REQUIRES(!Locks::mutator_lock_);
1193    void RegisterRuntimeNativeMethods(JNIEnv* env);
1194    void InitMetrics();
1195  
1196    void StartDaemonThreads() REQUIRES_SHARED(Locks::mutator_lock_);
1197    void StartSignalCatcher();
1198  
1199    void MaybeSaveJitProfilingInfo();
1200  
1201    // Visit all of the thread roots.
1202    void VisitThreadRoots(RootVisitor* visitor, VisitRootFlags flags)
1203        REQUIRES_SHARED(Locks::mutator_lock_);
1204  
1205    // Visit all other roots which must be done with mutators suspended.
1206    void VisitNonConcurrentRoots(RootVisitor* visitor, VisitRootFlags flags)
1207        REQUIRES_SHARED(Locks::mutator_lock_);
1208  
1209    // Constant roots are the roots which never change after the runtime is initialized, they only
1210    // need to be visited once per GC cycle.
1211    void VisitConstantRoots(RootVisitor* visitor)
1212        REQUIRES_SHARED(Locks::mutator_lock_);
1213  
1214    // Note: To be lock-free, GetFaultMessage temporarily replaces the lock message with null.
1215    //       As such, there is a window where a call will return an empty string. In general,
1216    //       only aborting code should retrieve this data (via GetFaultMessageForAbortLogging
1217    //       friend).
1218    std::string GetFaultMessage();
1219  
1220    ThreadPool* AcquireThreadPool() REQUIRES(!Locks::runtime_thread_pool_lock_);
1221    void ReleaseThreadPool() REQUIRES(!Locks::runtime_thread_pool_lock_);
1222  
1223    // Caches the apex versions produced by `GetApexVersions`.
1224    void InitializeApexVersions();
1225  
1226    void AppendToBootClassPath(const std::string& filename, const std::string& location);
1227  
1228    // A pointer to the active runtime or null.
1229    static Runtime* instance_;
1230  
1231    // NOTE: these must match the gc::ProcessState values as they come directly from the framework.
1232    static constexpr int kProfileForground = 0;
1233    static constexpr int kProfileBackground = 1;
1234  
1235    static constexpr uint32_t kCalleeSaveSize = 6u;
1236  
1237    // 64 bit so that we can share the same asm offsets for both 32 and 64 bits.
1238    uint64_t callee_save_methods_[kCalleeSaveSize];
1239    // Pre-allocated exceptions (see Runtime::Init).
1240    GcRoot<mirror::Throwable> pre_allocated_OutOfMemoryError_when_throwing_exception_;
1241    GcRoot<mirror::Throwable> pre_allocated_OutOfMemoryError_when_throwing_oome_;
1242    GcRoot<mirror::Throwable> pre_allocated_OutOfMemoryError_when_handling_stack_overflow_;
1243    GcRoot<mirror::Throwable> pre_allocated_NoClassDefFoundError_;
1244    ArtMethod* resolution_method_;
1245    ArtMethod* imt_conflict_method_;
1246    // Unresolved method has the same behavior as the conflict method, it is used by the class linker
1247    // for differentiating between unfilled imt slots vs conflict slots in superclasses.
1248    ArtMethod* imt_unimplemented_method_;
1249  
1250    // Special sentinel object used to invalid conditions in JNI (cleared weak references) and
1251    // JDWP (invalid references).
1252    GcRoot<mirror::Object> sentinel_;
1253  
1254    InstructionSet instruction_set_;
1255  
1256    CompilerCallbacks* compiler_callbacks_;
1257    bool is_zygote_;
1258    bool is_primary_zygote_;
1259    bool is_system_server_;
1260    bool must_relocate_;
1261    bool is_concurrent_gc_enabled_;
1262    bool is_explicit_gc_disabled_;
1263    bool image_dex2oat_enabled_;
1264  
1265    std::string compiler_executable_;
1266    std::vector<std::string> compiler_options_;
1267    std::vector<std::string> image_compiler_options_;
1268    std::vector<std::string> image_locations_;
1269  
1270    std::vector<std::string> boot_class_path_;
1271    std::vector<std::string> boot_class_path_locations_;
1272    std::string boot_class_path_checksums_;
1273    std::vector<int> boot_class_path_fds_;
1274    std::vector<int> boot_class_path_image_fds_;
1275    std::vector<int> boot_class_path_vdex_fds_;
1276    std::vector<int> boot_class_path_oat_fds_;
1277    std::string class_path_string_;
1278    std::vector<std::string> properties_;
1279  
1280    std::list<ti::AgentSpec> agent_specs_;
1281    std::list<std::unique_ptr<ti::Agent>> agents_;
1282    std::vector<Plugin> plugins_;
1283  
1284    // The default stack size for managed threads created by the runtime.
1285    size_t default_stack_size_;
1286  
1287    // Finalizers running for longer than this many milliseconds abort the runtime.
1288    unsigned int finalizer_timeout_ms_;
1289  
1290    gc::Heap* heap_;
1291  
1292    std::unique_ptr<ArenaPool> jit_arena_pool_;
1293    std::unique_ptr<ArenaPool> arena_pool_;
1294    // This pool is used for linear alloc if we are using userfaultfd GC, or if
1295    // low 4gb pool is required for compiler linear alloc. Otherwise, use
1296    // arena_pool_.
1297    // We need ArtFields to be in low 4gb if we are compiling using a 32 bit image
1298    // on a 64 bit compiler in case we resolve things in the image since the field
1299    // arrays are int arrays in this case.
1300    std::unique_ptr<ArenaPool> linear_alloc_arena_pool_;
1301  
1302    // Shared linear alloc for now.
1303    std::unique_ptr<LinearAlloc> linear_alloc_;
1304  
1305    // Linear alloc used for allocations during startup. Will be deleted after
1306    // startup. Atomic because the pointer can be concurrently updated to null.
1307    std::atomic<LinearAlloc*> startup_linear_alloc_;
1308  
1309    // The number of spins that are done before thread suspension is used to forcibly inflate.
1310    size_t max_spins_before_thin_lock_inflation_;
1311    MonitorList* monitor_list_;
1312    MonitorPool* monitor_pool_;
1313  
1314    ThreadList* thread_list_;
1315  
1316    InternTable* intern_table_;
1317  
1318    ClassLinker* class_linker_;
1319  
1320    SignalCatcher* signal_catcher_;
1321  
1322    jni::SmallLrtAllocator* small_lrt_allocator_;
1323  
1324    std::unique_ptr<jni::JniIdManager> jni_id_manager_;
1325  
1326    std::unique_ptr<JavaVMExt> java_vm_;
1327  
1328    std::unique_ptr<jit::Jit> jit_;
1329    std::unique_ptr<jit::JitCodeCache> jit_code_cache_;
1330    std::unique_ptr<jit::JitOptions> jit_options_;
1331  
1332    // Runtime thread pool. The pool is only for startup and gets deleted after.
1333    std::unique_ptr<ThreadPool> thread_pool_ GUARDED_BY(Locks::runtime_thread_pool_lock_);
1334    size_t thread_pool_ref_count_ GUARDED_BY(Locks::runtime_thread_pool_lock_);
1335  
1336    // Fault message, printed when we get a SIGSEGV. Stored as a native-heap object and accessed
1337    // lock-free, so needs to be atomic.
1338    std::atomic<std::string*> fault_message_;
1339  
1340    // A non-zero value indicates that a thread has been created but not yet initialized. Guarded by
1341    // the shutdown lock so that threads aren't born while we're shutting down.
1342    size_t threads_being_born_ GUARDED_BY(Locks::runtime_shutdown_lock_);
1343  
1344    // Waited upon until no threads are being born.
1345    std::unique_ptr<ConditionVariable> shutdown_cond_ GUARDED_BY(Locks::runtime_shutdown_lock_);
1346  
1347    // Set when runtime shutdown is past the point that new threads may attach.  Usually
1348    // GUARDED_BY(Locks::runtime_shutdown_lock_). But we need to check it in Abort without the
1349    // lock, because we may already own it.
1350    std::atomic<bool> shutting_down_;
1351  
1352    // The runtime is starting to shutdown but is blocked waiting on shutdown_cond_.
1353    bool shutting_down_started_ GUARDED_BY(Locks::runtime_shutdown_lock_);
1354  
1355    bool started_;
1356  
1357    // New flag added which tells us if the runtime has finished starting. If
1358    // this flag is set then the Daemon threads are created and the class loader
1359    // is created. This flag is needed for knowing if its safe to request CMS.
1360    bool finished_starting_;
1361  
1362    // Hooks supported by JNI_CreateJavaVM
1363    jint (*vfprintf_)(FILE* stream, const char* format, va_list ap);
1364    void (*exit_)(jint status);
1365    void (*abort_)();
1366  
1367    bool stats_enabled_;
1368    RuntimeStats stats_;
1369  
1370    const bool is_running_on_memory_tool_;
1371  
1372    std::unique_ptr<TraceConfig> trace_config_;
1373  
1374    instrumentation::Instrumentation instrumentation_;
1375  
1376    jobject main_thread_group_;
1377    jobject system_thread_group_;
1378  
1379    // As returned by ClassLoader.getSystemClassLoader().
1380    jobject system_class_loader_;
1381  
1382    // If true, then we dump the GC cumulative timings on shutdown.
1383    bool dump_gc_performance_on_shutdown_;
1384  
1385    // Transactions used for pre-initializing classes at compilation time.
1386    // Support nested transactions, maintain a list containing all transactions. Transactions are
1387    // handled under a stack discipline. Because GC needs to go over all transactions, we choose list
1388    // as substantial data structure instead of stack.
1389    std::forward_list<Transaction> preinitialization_transactions_;
1390  
1391    // If kNone, verification is disabled. kEnable by default.
1392    verifier::VerifyMode verify_;
1393  
1394    // List of supported cpu abis.
1395    std::vector<std::string> cpu_abilist_;
1396  
1397    // Specifies target SDK version to allow workarounds for certain API levels.
1398    uint32_t target_sdk_version_;
1399  
1400    // ART counterpart for the compat framework (go/compat-framework).
1401    CompatFramework compat_framework_;
1402  
1403    // Implicit checks flags.
1404    bool implicit_null_checks_;       // NullPointer checks are implicit.
1405    bool implicit_so_checks_;         // StackOverflow checks are implicit.
1406    bool implicit_suspend_checks_;    // Thread suspension checks are implicit.
1407  
1408    // Whether or not the sig chain (and implicitly the fault handler) should be
1409    // disabled. Tools like dex2oat don't need them. This enables
1410    // building a statically link version of dex2oat.
1411    bool no_sig_chain_;
1412  
1413    // Force the use of native bridge even if the app ISA matches the runtime ISA.
1414    bool force_native_bridge_;
1415  
1416    // Whether or not a native bridge has been loaded.
1417    //
1418    // The native bridge allows running native code compiled for a foreign ISA. The way it works is,
1419    // if standard dlopen fails to load native library associated with native activity, it calls to
1420    // the native bridge to load it and then gets the trampoline for the entry to native activity.
1421    //
1422    // The option 'native_bridge_library_filename' specifies the name of the native bridge.
1423    // When non-empty the native bridge will be loaded from the given file. An empty value means
1424    // that there's no native bridge.
1425    bool is_native_bridge_loaded_;
1426  
1427    // Whether we are running under native debugger.
1428    bool is_native_debuggable_;
1429  
1430    // whether or not any async exceptions have ever been thrown. This is used to speed up the
1431    // MterpShouldSwitchInterpreters function.
1432    bool async_exceptions_thrown_;
1433  
1434    // Whether anything is going to be using the shadow-frame APIs to force a function to return
1435    // early. Doing this requires that (1) we be debuggable and (2) that mterp is exited.
1436    bool non_standard_exits_enabled_;
1437  
1438    // Whether Java code needs to be debuggable.
1439    RuntimeDebugState runtime_debug_state_;
1440  
1441    bool monitor_timeout_enable_;
1442    uint64_t monitor_timeout_ns_;
1443  
1444    // Whether or not this application can be profiled by the shell user,
1445    // even when running on a device that is running in user mode.
1446    bool is_profileable_from_shell_ = false;
1447  
1448    // Whether or not this application can be profiled by system services on a
1449    // device running in user mode, but not necessarily by the shell user.
1450    bool is_profileable_ = false;
1451  
1452    // The maximum number of failed boots we allow before pruning the dalvik cache
1453    // and trying again. This option is only inspected when we're running as a
1454    // zygote.
1455    uint32_t zygote_max_failed_boots_;
1456  
1457    // Enable experimental opcodes that aren't fully specified yet. The intent is to
1458    // eventually publish them as public-usable opcodes, but they aren't ready yet.
1459    //
1460    // Experimental opcodes should not be used by other production code.
1461    ExperimentalFlags experimental_flags_;
1462  
1463    // Contains the build fingerprint, if given as a parameter.
1464    std::string fingerprint_;
1465  
1466    // Oat file manager, keeps track of what oat files are open.
1467    OatFileManager* oat_file_manager_;
1468  
1469    // Whether or not we are on a low RAM device.
1470    bool is_low_memory_mode_;
1471  
1472    // Limiting size (in bytes) for applying MADV_WILLNEED on vdex files
1473    // or uncompressed dex files in APKs.
1474    // A 0 for this will turn off madvising to MADV_WILLNEED
1475    size_t madvise_willneed_total_dex_size_;
1476  
1477    // Limiting size (in bytes) for applying MADV_WILLNEED on odex files
1478    // A 0 for this will turn off madvising to MADV_WILLNEED
1479    size_t madvise_willneed_odex_filesize_;
1480  
1481    // Limiting size (in bytes) for applying MADV_WILLNEED on art files
1482    // A 0 for this will turn off madvising to MADV_WILLNEED
1483    size_t madvise_willneed_art_filesize_;
1484  
1485    // Whether the application should run in safe mode, that is, interpreter only.
1486    bool safe_mode_;
1487  
1488    // Whether access checks on hidden API should be performed.
1489    hiddenapi::EnforcementPolicy hidden_api_policy_;
1490  
1491    // Whether access checks on core platform API should be performed.
1492    hiddenapi::EnforcementPolicy core_platform_api_policy_;
1493  
1494    // Whether access checks on test API should be performed.
1495    hiddenapi::EnforcementPolicy test_api_policy_;
1496  
1497    // List of signature prefixes of methods that have been removed from the blocklist, and treated
1498    // as if SDK.
1499    std::vector<std::string> hidden_api_exemptions_;
1500  
1501    // Do not warn about the same hidden API access violation twice.
1502    // This is only used for testing.
1503    bool dedupe_hidden_api_warnings_;
1504  
1505    // How often to log hidden API access to the event log. An integer between 0
1506    // (never) and 0x10000 (always).
1507    uint32_t hidden_api_access_event_log_rate_;
1508  
1509    // The package of the app running in this process.
1510    std::string process_package_name_;
1511  
1512    // The data directory of the app running in this process.
1513    std::string process_data_directory_;
1514  
1515    // Whether threads should dump their native stack on SIGQUIT.
1516    bool dump_native_stack_on_sig_quit_;
1517  
1518    // Whether or not we currently care about pause times.
1519    ProcessState process_state_;
1520  
1521    // Whether zygote code is in a section that should not start threads.
1522    bool zygote_no_threads_;
1523  
1524    // The string containing requested jdwp options
1525    std::string jdwp_options_;
1526  
1527    // The jdwp provider we were configured with.
1528    JdwpProvider jdwp_provider_;
1529  
1530    // True if jmethodID and jfieldID are opaque Indices. When false (the default) these are simply
1531    // pointers. This is set by -Xopaque-jni-ids:{true,false}.
1532    JniIdType jni_ids_indirection_;
1533  
1534    // Set to false in cases where we want to directly control when jni-id
1535    // indirection is changed. This is intended only for testing JNI id swapping.
1536    bool automatically_set_jni_ids_indirection_;
1537  
1538    // True if files in /data/misc/apexdata/com.android.art are considered untrustworthy.
1539    bool deny_art_apex_data_files_;
1540  
1541    // Whether to allow compiling the boot classpath in memory when the given boot image is unusable.
1542    bool allow_in_memory_compilation_ = false;
1543  
1544    // Saved environment.
1545    class EnvSnapshot {
1546     public:
1547      EnvSnapshot() = default;
1548      void TakeSnapshot();
1549      char** GetSnapshot() const;
1550  
1551     private:
1552      std::unique_ptr<char*[]> c_env_vector_;
1553      std::vector<std::unique_ptr<std::string>> name_value_pairs_;
1554  
1555      DISALLOW_COPY_AND_ASSIGN(EnvSnapshot);
1556    } env_snapshot_;
1557  
1558    // Generic system-weak holders.
1559    std::vector<gc::AbstractSystemWeakHolder*> system_weak_holders_;
1560  
1561    std::unique_ptr<RuntimeCallbacks> callbacks_;
1562  
1563    std::atomic<uint32_t> deoptimization_counts_[
1564        static_cast<uint32_t>(DeoptimizationKind::kLast) + 1];
1565  
1566    MemMap protected_fault_page_;
1567  
1568    uint32_t verifier_logging_threshold_ms_;
1569  
1570    bool load_app_image_startup_cache_ = false;
1571  
1572    // If startup has completed, must happen at most once.
1573    std::atomic<bool> startup_completed_ = false;
1574  
1575    bool verifier_missing_kthrow_fatal_;
1576    bool force_java_zygote_fork_loop_;
1577    bool perfetto_hprof_enabled_;
1578    bool perfetto_javaheapprof_enabled_;
1579  
1580    // Called on out of memory error
1581    void (*out_of_memory_error_hook_)();
1582  
1583    metrics::ArtMetrics metrics_;
1584    std::unique_ptr<metrics::MetricsReporter> metrics_reporter_;
1585  
1586    // Apex versions of boot classpath jars concatenated in a string. The format
1587    // is of the type:
1588    // '/apex1_version/apex2_version//'
1589    //
1590    // When the apex is the factory version, we don't encode it (for example in
1591    // the third entry in the example above).
1592    std::string apex_versions_;
1593  
1594    // The info about the application code paths.
1595    AppInfo app_info_;
1596  
1597    // Note: See comments on GetFaultMessage.
1598    friend std::string GetFaultMessageForAbortLogging();
1599    friend class Dex2oatImageTest;
1600    friend class ScopedThreadPoolUsage;
1601    friend class OatFileAssistantTest;
1602    class SetupLinearAllocForZygoteFork;
1603  
1604    DISALLOW_COPY_AND_ASSIGN(Runtime);
1605  };
1606  
GetMetrics()1607  inline metrics::ArtMetrics* GetMetrics() { return Runtime::Current()->GetMetrics(); }
1608  
1609  }  // namespace art
1610  
1611  #endif  // ART_RUNTIME_RUNTIME_H_
1612