• Home
  • History
  • Annotate
  • 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 <iosfwd>
24  #include <set>
25  #include <string>
26  #include <utility>
27  #include <memory>
28  #include <vector>
29  
30  #include "base/file_utils.h"
31  #include "base/locks.h"
32  #include "base/macros.h"
33  #include "base/mem_map.h"
34  #include "deoptimization_kind.h"
35  #include "dex/dex_file_types.h"
36  #include "experimental_flags.h"
37  #include "gc/space/image_space_loading_order.h"
38  #include "gc_root.h"
39  #include "instrumentation.h"
40  #include "jdwp_provider.h"
41  #include "obj_ptr.h"
42  #include "offsets.h"
43  #include "process_state.h"
44  #include "quick/quick_method_frame_info.h"
45  #include "runtime_stats.h"
46  
47  namespace art {
48  
49  namespace gc {
50  class AbstractSystemWeakHolder;
51  class Heap;
52  }  // namespace gc
53  
54  namespace hiddenapi {
55  enum class EnforcementPolicy;
56  }  // namespace hiddenapi
57  
58  namespace jit {
59  class Jit;
60  class JitCodeCache;
61  class JitOptions;
62  }  // namespace jit
63  
64  namespace mirror {
65  class Array;
66  class ClassLoader;
67  class DexCache;
68  template<class T> class ObjectArray;
69  template<class T> class PrimitiveArray;
70  typedef PrimitiveArray<int8_t> ByteArray;
71  class String;
72  class Throwable;
73  }  // namespace mirror
74  namespace ti {
75  class Agent;
76  class AgentSpec;
77  }  // namespace ti
78  namespace verifier {
79  class MethodVerifier;
80  enum class VerifyMode : int8_t;
81  }  // namespace verifier
82  class ArenaPool;
83  class ArtMethod;
84  enum class CalleeSaveType: uint32_t;
85  class ClassLinker;
86  class CompilerCallbacks;
87  class DexFile;
88  enum class InstructionSet;
89  class InternTable;
90  class IsMarkedVisitor;
91  class JavaVMExt;
92  class LinearAlloc;
93  class MonitorList;
94  class MonitorPool;
95  class NullPointerHandler;
96  class OatFileAssistantTest;
97  class OatFileManager;
98  class Plugin;
99  struct RuntimeArgumentMap;
100  class RuntimeCallbacks;
101  class SignalCatcher;
102  class StackOverflowHandler;
103  class SuspensionHandler;
104  class ThreadList;
105  class ThreadPool;
106  class Trace;
107  struct TraceConfig;
108  class Transaction;
109  
110  typedef std::vector<std::pair<std::string, const void*>> RuntimeOptions;
111  
112  class Runtime {
113   public:
114    // Parse raw runtime options.
115    static bool ParseOptions(const RuntimeOptions& raw_options,
116                             bool ignore_unrecognized,
117                             RuntimeArgumentMap* runtime_options);
118  
119    // Creates and initializes a new runtime.
120    static bool Create(RuntimeArgumentMap&& runtime_options)
121        SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_);
122  
123    // Creates and initializes a new runtime.
124    static bool Create(const RuntimeOptions& raw_options, bool ignore_unrecognized)
125        SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_);
126  
127    // IsAotCompiler for compilers that don't have a running runtime. Only dex2oat currently.
IsAotCompiler()128    bool IsAotCompiler() const {
129      return !UseJitCompilation() && IsCompiler();
130    }
131  
132    // IsCompiler is any runtime which has a running compiler, either dex2oat or JIT.
IsCompiler()133    bool IsCompiler() const {
134      return compiler_callbacks_ != nullptr;
135    }
136  
137    // If a compiler, are we compiling a boot image?
138    bool IsCompilingBootImage() const;
139  
140    bool CanRelocate() const;
141  
ShouldRelocate()142    bool ShouldRelocate() const {
143      return must_relocate_ && CanRelocate();
144    }
145  
MustRelocateIfPossible()146    bool MustRelocateIfPossible() const {
147      return must_relocate_;
148    }
149  
IsImageDex2OatEnabled()150    bool IsImageDex2OatEnabled() const {
151      return image_dex2oat_enabled_;
152    }
153  
GetCompilerCallbacks()154    CompilerCallbacks* GetCompilerCallbacks() {
155      return compiler_callbacks_;
156    }
157  
SetCompilerCallbacks(CompilerCallbacks * callbacks)158    void SetCompilerCallbacks(CompilerCallbacks* callbacks) {
159      CHECK(callbacks != nullptr);
160      compiler_callbacks_ = callbacks;
161    }
162  
IsZygote()163    bool IsZygote() const {
164      return is_zygote_;
165    }
166  
IsSystemServer()167    bool IsSystemServer() const {
168      return is_system_server_;
169    }
170  
SetSystemServer(bool value)171    void SetSystemServer(bool value) {
172      is_system_server_ = value;
173    }
174  
IsExplicitGcDisabled()175    bool IsExplicitGcDisabled() const {
176      return is_explicit_gc_disabled_;
177    }
178  
179    std::string GetCompilerExecutable() const;
180  
GetCompilerOptions()181    const std::vector<std::string>& GetCompilerOptions() const {
182      return compiler_options_;
183    }
184  
AddCompilerOption(const std::string & option)185    void AddCompilerOption(const std::string& option) {
186      compiler_options_.push_back(option);
187    }
188  
GetImageCompilerOptions()189    const std::vector<std::string>& GetImageCompilerOptions() const {
190      return image_compiler_options_;
191    }
192  
GetImageLocation()193    const std::string& GetImageLocation() const {
194      return image_location_;
195    }
196  
IsUsingApexBootImageLocation()197    bool IsUsingApexBootImageLocation() const {
198      return is_using_apex_boot_image_location_;
199    }
200  
201    // Starts a runtime, which may cause threads to be started and code to run.
202    bool Start() UNLOCK_FUNCTION(Locks::mutator_lock_);
203  
204    bool IsShuttingDown(Thread* self);
IsShuttingDownLocked()205    bool IsShuttingDownLocked() const REQUIRES(Locks::runtime_shutdown_lock_) {
206      return shutting_down_;
207    }
208  
NumberOfThreadsBeingBorn()209    size_t NumberOfThreadsBeingBorn() const REQUIRES(Locks::runtime_shutdown_lock_) {
210      return threads_being_born_;
211    }
212  
StartThreadBirth()213    void StartThreadBirth() REQUIRES(Locks::runtime_shutdown_lock_) {
214      threads_being_born_++;
215    }
216  
217    void EndThreadBirth() REQUIRES(Locks::runtime_shutdown_lock_);
218  
IsStarted()219    bool IsStarted() const {
220      return started_;
221    }
222  
IsFinishedStarting()223    bool IsFinishedStarting() const {
224      return finished_starting_;
225    }
226  
227    void RunRootClinits(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_);
228  
Current()229    static Runtime* Current() {
230      return instance_;
231    }
232  
233    // Aborts semi-cleanly. Used in the implementation of LOG(FATAL), which most
234    // callers should prefer.
235    NO_RETURN static void Abort(const char* msg) REQUIRES(!Locks::abort_lock_);
236  
237    // Returns the "main" ThreadGroup, used when attaching user threads.
238    jobject GetMainThreadGroup() const;
239  
240    // Returns the "system" ThreadGroup, used when attaching our internal threads.
241    jobject GetSystemThreadGroup() const;
242  
243    // Returns the system ClassLoader which represents the CLASSPATH.
244    jobject GetSystemClassLoader() const;
245  
246    // Attaches the calling native thread to the runtime.
247    bool AttachCurrentThread(const char* thread_name, bool as_daemon, jobject thread_group,
248                             bool create_peer);
249  
250    void CallExitHook(jint status);
251  
252    // Detaches the current native thread from the runtime.
253    void DetachCurrentThread() REQUIRES(!Locks::mutator_lock_);
254  
255    void DumpDeoptimizations(std::ostream& os);
256    void DumpForSigQuit(std::ostream& os);
257    void DumpLockHolders(std::ostream& os);
258  
259    ~Runtime();
260  
GetBootClassPath()261    const std::vector<std::string>& GetBootClassPath() const {
262      return boot_class_path_;
263    }
264  
GetBootClassPathLocations()265    const std::vector<std::string>& GetBootClassPathLocations() const {
266      DCHECK(boot_class_path_locations_.empty() ||
267             boot_class_path_locations_.size() == boot_class_path_.size());
268      return boot_class_path_locations_.empty() ? boot_class_path_ : boot_class_path_locations_;
269    }
270  
GetClassPathString()271    const std::string& GetClassPathString() const {
272      return class_path_string_;
273    }
274  
GetClassLinker()275    ClassLinker* GetClassLinker() const {
276      return class_linker_;
277    }
278  
GetDefaultStackSize()279    size_t GetDefaultStackSize() const {
280      return default_stack_size_;
281    }
282  
GetFinalizerTimeoutMs()283    unsigned int GetFinalizerTimeoutMs() const {
284      return finalizer_timeout_ms_;
285    }
286  
GetHeap()287    gc::Heap* GetHeap() const {
288      return heap_;
289    }
290  
GetInternTable()291    InternTable* GetInternTable() const {
292      DCHECK(intern_table_ != nullptr);
293      return intern_table_;
294    }
295  
GetJavaVM()296    JavaVMExt* GetJavaVM() const {
297      return java_vm_.get();
298    }
299  
GetMaxSpinsBeforeThinLockInflation()300    size_t GetMaxSpinsBeforeThinLockInflation() const {
301      return max_spins_before_thin_lock_inflation_;
302    }
303  
GetMonitorList()304    MonitorList* GetMonitorList() const {
305      return monitor_list_;
306    }
307  
GetMonitorPool()308    MonitorPool* GetMonitorPool() const {
309      return monitor_pool_;
310    }
311  
312    // Is the given object the special object used to mark a cleared JNI weak global?
313    bool IsClearedJniWeakGlobal(ObjPtr<mirror::Object> obj) REQUIRES_SHARED(Locks::mutator_lock_);
314  
315    // Get the special object used to mark a cleared JNI weak global.
316    mirror::Object* GetClearedJniWeakGlobal() REQUIRES_SHARED(Locks::mutator_lock_);
317  
318    mirror::Throwable* GetPreAllocatedOutOfMemoryErrorWhenThrowingException()
319        REQUIRES_SHARED(Locks::mutator_lock_);
320    mirror::Throwable* GetPreAllocatedOutOfMemoryErrorWhenThrowingOOME()
321        REQUIRES_SHARED(Locks::mutator_lock_);
322    mirror::Throwable* GetPreAllocatedOutOfMemoryErrorWhenHandlingStackOverflow()
323        REQUIRES_SHARED(Locks::mutator_lock_);
324  
325    mirror::Throwable* GetPreAllocatedNoClassDefFoundError()
326        REQUIRES_SHARED(Locks::mutator_lock_);
327  
GetProperties()328    const std::vector<std::string>& GetProperties() const {
329      return properties_;
330    }
331  
GetThreadList()332    ThreadList* GetThreadList() const {
333      return thread_list_;
334    }
335  
GetVersion()336    static const char* GetVersion() {
337      return "2.1.0";
338    }
339  
IsMethodHandlesEnabled()340    bool IsMethodHandlesEnabled() const {
341      return true;
342    }
343  
344    void DisallowNewSystemWeaks() REQUIRES_SHARED(Locks::mutator_lock_);
345    void AllowNewSystemWeaks() REQUIRES_SHARED(Locks::mutator_lock_);
346    // broadcast_for_checkpoint is true when we broadcast for making blocking threads to respond to
347    // checkpoint requests. It's false when we broadcast to unblock blocking threads after system weak
348    // access is reenabled.
349    void BroadcastForNewSystemWeaks(bool broadcast_for_checkpoint = false);
350  
351    // Visit all the roots. If only_dirty is true then non-dirty roots won't be visited. If
352    // clean_dirty is true then dirty roots will be marked as non-dirty after visiting.
353    void VisitRoots(RootVisitor* visitor, VisitRootFlags flags = kVisitRootFlagAllRoots)
354        REQUIRES(!Locks::classlinker_classes_lock_, !Locks::trace_lock_)
355        REQUIRES_SHARED(Locks::mutator_lock_);
356  
357    // Visit image roots, only used for hprof since the GC uses the image space mod union table
358    // instead.
359    void VisitImageRoots(RootVisitor* visitor) REQUIRES_SHARED(Locks::mutator_lock_);
360  
361    // Visit all of the roots we can safely visit concurrently.
362    void VisitConcurrentRoots(RootVisitor* visitor,
363                              VisitRootFlags flags = kVisitRootFlagAllRoots)
364        REQUIRES(!Locks::classlinker_classes_lock_, !Locks::trace_lock_)
365        REQUIRES_SHARED(Locks::mutator_lock_);
366  
367    // Visit all of the non thread roots, we can do this with mutators unpaused.
368    void VisitNonThreadRoots(RootVisitor* visitor)
369        REQUIRES_SHARED(Locks::mutator_lock_);
370  
371    void VisitTransactionRoots(RootVisitor* visitor)
372        REQUIRES_SHARED(Locks::mutator_lock_);
373  
374    // Sweep system weaks, the system weak is deleted if the visitor return null. Otherwise, the
375    // system weak is updated to be the visitor's returned value.
376    void SweepSystemWeaks(IsMarkedVisitor* visitor)
377        REQUIRES_SHARED(Locks::mutator_lock_);
378  
379    // Returns a special method that calls into a trampoline for runtime method resolution
380    ArtMethod* GetResolutionMethod();
381  
HasResolutionMethod()382    bool HasResolutionMethod() const {
383      return resolution_method_ != nullptr;
384    }
385  
386    void SetResolutionMethod(ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_);
ClearResolutionMethod()387    void ClearResolutionMethod() {
388      resolution_method_ = nullptr;
389    }
390  
391    ArtMethod* CreateResolutionMethod() REQUIRES_SHARED(Locks::mutator_lock_);
392  
393    // Returns a special method that calls into a trampoline for runtime imt conflicts.
394    ArtMethod* GetImtConflictMethod();
395    ArtMethod* GetImtUnimplementedMethod();
396  
HasImtConflictMethod()397    bool HasImtConflictMethod() const {
398      return imt_conflict_method_ != nullptr;
399    }
400  
ClearImtConflictMethod()401    void ClearImtConflictMethod() {
402      imt_conflict_method_ = nullptr;
403    }
404  
405    void FixupConflictTables();
406    void SetImtConflictMethod(ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_);
407    void SetImtUnimplementedMethod(ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_);
408  
409    ArtMethod* CreateImtConflictMethod(LinearAlloc* linear_alloc)
410        REQUIRES_SHARED(Locks::mutator_lock_);
411  
ClearImtUnimplementedMethod()412    void ClearImtUnimplementedMethod() {
413      imt_unimplemented_method_ = nullptr;
414    }
415  
HasCalleeSaveMethod(CalleeSaveType type)416    bool HasCalleeSaveMethod(CalleeSaveType type) const {
417      return callee_save_methods_[static_cast<size_t>(type)] != 0u;
418    }
419  
420    ArtMethod* GetCalleeSaveMethod(CalleeSaveType type)
421        REQUIRES_SHARED(Locks::mutator_lock_);
422  
423    ArtMethod* GetCalleeSaveMethodUnchecked(CalleeSaveType type)
424        REQUIRES_SHARED(Locks::mutator_lock_);
425  
426    QuickMethodFrameInfo GetRuntimeMethodFrameInfo(ArtMethod* method)
427        REQUIRES_SHARED(Locks::mutator_lock_);
428  
GetCalleeSaveMethodOffset(CalleeSaveType type)429    static constexpr size_t GetCalleeSaveMethodOffset(CalleeSaveType type) {
430      return OFFSETOF_MEMBER(Runtime, callee_save_methods_[static_cast<size_t>(type)]);
431    }
432  
GetInstructionSet()433    InstructionSet GetInstructionSet() const {
434      return instruction_set_;
435    }
436  
437    void SetInstructionSet(InstructionSet instruction_set);
438    void ClearInstructionSet();
439  
440    void SetCalleeSaveMethod(ArtMethod* method, CalleeSaveType type);
441    void ClearCalleeSaveMethods();
442  
443    ArtMethod* CreateCalleeSaveMethod() REQUIRES_SHARED(Locks::mutator_lock_);
444  
445    int32_t GetStat(int kind);
446  
GetStats()447    RuntimeStats* GetStats() {
448      return &stats_;
449    }
450  
HasStatsEnabled()451    bool HasStatsEnabled() const {
452      return stats_enabled_;
453    }
454  
455    void ResetStats(int kinds);
456  
457    void SetStatsEnabled(bool new_state)
458        REQUIRES(!Locks::instrument_entrypoints_lock_, !Locks::mutator_lock_);
459  
460    enum class NativeBridgeAction {  // private
461      kUnload,
462      kInitialize
463    };
464  
GetJit()465    jit::Jit* GetJit() const {
466      return jit_.get();
467    }
468  
469    // Returns true if JIT compilations are enabled. GetJit() will be not null in this case.
470    bool UseJitCompilation() const;
471  
472    void PreZygoteFork();
473    void PostZygoteFork();
474    void InitNonZygoteOrPostFork(
475        JNIEnv* env,
476        bool is_system_server,
477        NativeBridgeAction action,
478        const char* isa,
479        bool profile_system_server = false);
480  
GetInstrumentation()481    const instrumentation::Instrumentation* GetInstrumentation() const {
482      return &instrumentation_;
483    }
484  
GetInstrumentation()485    instrumentation::Instrumentation* GetInstrumentation() {
486      return &instrumentation_;
487    }
488  
489    void RegisterAppInfo(const std::vector<std::string>& code_paths,
490                         const std::string& profile_output_filename);
491  
492    // Transaction support.
493    bool IsActiveTransaction() const;
494    void EnterTransactionMode();
495    void EnterTransactionMode(bool strict, mirror::Class* root);
496    void ExitTransactionMode();
497    void RollbackAllTransactions() REQUIRES_SHARED(Locks::mutator_lock_);
498    // Transaction rollback and exit transaction are always done together, it's convenience to
499    // do them in one function.
500    void RollbackAndExitTransactionMode() REQUIRES_SHARED(Locks::mutator_lock_);
501    bool IsTransactionAborted() const;
502    const std::unique_ptr<Transaction>& GetTransaction() const;
503    bool IsActiveStrictTransactionMode() const;
504  
505    void AbortTransactionAndThrowAbortError(Thread* self, const std::string& abort_message)
506        REQUIRES_SHARED(Locks::mutator_lock_);
507    void ThrowTransactionAbortError(Thread* self)
508        REQUIRES_SHARED(Locks::mutator_lock_);
509  
510    void RecordWriteFieldBoolean(mirror::Object* obj, MemberOffset field_offset, uint8_t value,
511                                 bool is_volatile) const;
512    void RecordWriteFieldByte(mirror::Object* obj, MemberOffset field_offset, int8_t value,
513                              bool is_volatile) const;
514    void RecordWriteFieldChar(mirror::Object* obj, MemberOffset field_offset, uint16_t value,
515                              bool is_volatile) const;
516    void RecordWriteFieldShort(mirror::Object* obj, MemberOffset field_offset, int16_t value,
517                            bool is_volatile) const;
518    void RecordWriteField32(mirror::Object* obj, MemberOffset field_offset, uint32_t value,
519                            bool is_volatile) const;
520    void RecordWriteField64(mirror::Object* obj, MemberOffset field_offset, uint64_t value,
521                            bool is_volatile) const;
522    void RecordWriteFieldReference(mirror::Object* obj,
523                                   MemberOffset field_offset,
524                                   ObjPtr<mirror::Object> value,
525                                   bool is_volatile) const
526        REQUIRES_SHARED(Locks::mutator_lock_);
527    void RecordWriteArray(mirror::Array* array, size_t index, uint64_t value) const
528        REQUIRES_SHARED(Locks::mutator_lock_);
529    void RecordStrongStringInsertion(ObjPtr<mirror::String> s) const
530        REQUIRES(Locks::intern_table_lock_);
531    void RecordWeakStringInsertion(ObjPtr<mirror::String> s) const
532        REQUIRES(Locks::intern_table_lock_);
533    void RecordStrongStringRemoval(ObjPtr<mirror::String> s) const
534        REQUIRES(Locks::intern_table_lock_);
535    void RecordWeakStringRemoval(ObjPtr<mirror::String> s) const
536        REQUIRES(Locks::intern_table_lock_);
537    void RecordResolveString(ObjPtr<mirror::DexCache> dex_cache, dex::StringIndex string_idx) const
538        REQUIRES_SHARED(Locks::mutator_lock_);
539  
540    void SetFaultMessage(const std::string& message);
541  
542    void AddCurrentRuntimeFeaturesAsDex2OatArguments(std::vector<std::string>* arg_vector) const;
543  
ExplicitStackOverflowChecks()544    bool ExplicitStackOverflowChecks() const {
545      return !implicit_so_checks_;
546    }
547  
548    void DisableVerifier();
549    bool IsVerificationEnabled() const;
550    bool IsVerificationSoftFail() const;
551  
SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy policy)552    void SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy policy) {
553      hidden_api_policy_ = policy;
554    }
555  
GetHiddenApiEnforcementPolicy()556    hiddenapi::EnforcementPolicy GetHiddenApiEnforcementPolicy() const {
557      return hidden_api_policy_;
558    }
559  
SetCorePlatformApiEnforcementPolicy(hiddenapi::EnforcementPolicy policy)560    void SetCorePlatformApiEnforcementPolicy(hiddenapi::EnforcementPolicy policy) {
561      core_platform_api_policy_ = policy;
562    }
563  
GetCorePlatformApiEnforcementPolicy()564    hiddenapi::EnforcementPolicy GetCorePlatformApiEnforcementPolicy() const {
565      return core_platform_api_policy_;
566    }
567  
SetHiddenApiExemptions(const std::vector<std::string> & exemptions)568    void SetHiddenApiExemptions(const std::vector<std::string>& exemptions) {
569      hidden_api_exemptions_ = exemptions;
570    }
571  
GetHiddenApiExemptions()572    const std::vector<std::string>& GetHiddenApiExemptions() {
573      return hidden_api_exemptions_;
574    }
575  
SetDedupeHiddenApiWarnings(bool value)576    void SetDedupeHiddenApiWarnings(bool value) {
577      dedupe_hidden_api_warnings_ = value;
578    }
579  
ShouldDedupeHiddenApiWarnings()580    bool ShouldDedupeHiddenApiWarnings() {
581      return dedupe_hidden_api_warnings_;
582    }
583  
SetHiddenApiEventLogSampleRate(uint32_t rate)584    void SetHiddenApiEventLogSampleRate(uint32_t rate) {
585      hidden_api_access_event_log_rate_ = rate;
586    }
587  
GetHiddenApiEventLogSampleRate()588    uint32_t GetHiddenApiEventLogSampleRate() const {
589      return hidden_api_access_event_log_rate_;
590    }
591  
GetProcessPackageName()592    const std::string& GetProcessPackageName() const {
593      return process_package_name_;
594    }
595  
SetProcessPackageName(const char * package_name)596    void SetProcessPackageName(const char* package_name) {
597      if (package_name == nullptr) {
598        process_package_name_.clear();
599      } else {
600        process_package_name_ = package_name;
601      }
602    }
603  
GetProcessDataDirectory()604    const std::string& GetProcessDataDirectory() const {
605      return process_data_directory_;
606    }
607  
SetProcessDataDirectory(const char * data_dir)608    void SetProcessDataDirectory(const char* data_dir) {
609      if (data_dir == nullptr) {
610        process_data_directory_.clear();
611      } else {
612        process_data_directory_ = data_dir;
613      }
614    }
615  
IsDexFileFallbackEnabled()616    bool IsDexFileFallbackEnabled() const {
617      return allow_dex_file_fallback_;
618    }
619  
GetCpuAbilist()620    const std::vector<std::string>& GetCpuAbilist() const {
621      return cpu_abilist_;
622    }
623  
IsRunningOnMemoryTool()624    bool IsRunningOnMemoryTool() const {
625      return is_running_on_memory_tool_;
626    }
627  
SetTargetSdkVersion(uint32_t version)628    void SetTargetSdkVersion(uint32_t version) {
629      target_sdk_version_ = version;
630    }
631  
GetTargetSdkVersion()632    uint32_t GetTargetSdkVersion() const {
633      return target_sdk_version_;
634    }
635  
GetZygoteMaxFailedBoots()636    uint32_t GetZygoteMaxFailedBoots() const {
637      return zygote_max_failed_boots_;
638    }
639  
AreExperimentalFlagsEnabled(ExperimentalFlags flags)640    bool AreExperimentalFlagsEnabled(ExperimentalFlags flags) {
641      return (experimental_flags_ & flags) != ExperimentalFlags::kNone;
642    }
643  
644    void CreateJitCodeCache(bool rwx_memory_allowed);
645  
646    // Create the JIT and instrumentation and code cache.
647    void CreateJit();
648  
GetArenaPool()649    ArenaPool* GetArenaPool() {
650      return arena_pool_.get();
651    }
GetJitArenaPool()652    ArenaPool* GetJitArenaPool() {
653      return jit_arena_pool_.get();
654    }
GetArenaPool()655    const ArenaPool* GetArenaPool() const {
656      return arena_pool_.get();
657    }
658  
659    void ReclaimArenaPoolMemory();
660  
GetLinearAlloc()661    LinearAlloc* GetLinearAlloc() {
662      return linear_alloc_.get();
663    }
664  
GetJITOptions()665    jit::JitOptions* GetJITOptions() {
666      return jit_options_.get();
667    }
668  
IsJavaDebuggable()669    bool IsJavaDebuggable() const {
670      return is_java_debuggable_;
671    }
672  
673    void SetJavaDebuggable(bool value);
674  
675    // Deoptimize the boot image, called for Java debuggable apps.
676    void DeoptimizeBootImage() REQUIRES(Locks::mutator_lock_);
677  
IsNativeDebuggable()678    bool IsNativeDebuggable() const {
679      return is_native_debuggable_;
680    }
681  
SetNativeDebuggable(bool value)682    void SetNativeDebuggable(bool value) {
683      is_native_debuggable_ = value;
684    }
685  
AreNonStandardExitsEnabled()686    bool AreNonStandardExitsEnabled() const {
687      return non_standard_exits_enabled_;
688    }
689  
SetNonStandardExitsEnabled()690    void SetNonStandardExitsEnabled() {
691      DoAndMaybeSwitchInterpreter([=](){ non_standard_exits_enabled_ = true; });
692    }
693  
AreAsyncExceptionsThrown()694    bool AreAsyncExceptionsThrown() const {
695      return async_exceptions_thrown_;
696    }
697  
SetAsyncExceptionsThrown()698    void SetAsyncExceptionsThrown() {
699      DoAndMaybeSwitchInterpreter([=](){ async_exceptions_thrown_ = true; });
700    }
701  
702    // Change state and re-check which interpreter should be used.
703    //
704    // This must be called whenever there is an event that forces
705    // us to use different interpreter (e.g. debugger is attached).
706    //
707    // Changing the state using the lamda gives us some multihreading safety.
708    // It ensures that two calls do not interfere with each other and
709    // it makes it possible to DCHECK that thread local flag is correct.
710    template<typename Action>
711    static void DoAndMaybeSwitchInterpreter(Action lamda);
712  
713    // Returns the build fingerprint, if set. Otherwise an empty string is returned.
GetFingerprint()714    std::string GetFingerprint() {
715      return fingerprint_;
716    }
717  
718    // Called from class linker.
719    void SetSentinel(mirror::Object* sentinel) REQUIRES_SHARED(Locks::mutator_lock_);
720    // For testing purpose only.
721    // TODO: Remove this when this is no longer needed (b/116087961).
722    GcRoot<mirror::Object> GetSentinel() REQUIRES_SHARED(Locks::mutator_lock_);
723  
724    // Create a normal LinearAlloc or low 4gb version if we are 64 bit AOT compiler.
725    LinearAlloc* CreateLinearAlloc();
726  
GetOatFileManager()727    OatFileManager& GetOatFileManager() const {
728      DCHECK(oat_file_manager_ != nullptr);
729      return *oat_file_manager_;
730    }
731  
732    double GetHashTableMinLoadFactor() const;
733    double GetHashTableMaxLoadFactor() const;
734  
IsSafeMode()735    bool IsSafeMode() const {
736      return safe_mode_;
737    }
738  
SetSafeMode(bool mode)739    void SetSafeMode(bool mode) {
740      safe_mode_ = mode;
741    }
742  
GetDumpNativeStackOnSigQuit()743    bool GetDumpNativeStackOnSigQuit() const {
744      return dump_native_stack_on_sig_quit_;
745    }
746  
GetPrunedDalvikCache()747    bool GetPrunedDalvikCache() const {
748      return pruned_dalvik_cache_;
749    }
750  
SetPrunedDalvikCache(bool pruned)751    void SetPrunedDalvikCache(bool pruned) {
752      pruned_dalvik_cache_ = pruned;
753    }
754  
755    void UpdateProcessState(ProcessState process_state);
756  
757    // Returns true if we currently care about long mutator pause.
InJankPerceptibleProcessState()758    bool InJankPerceptibleProcessState() const {
759      return process_state_ == kProcessStateJankPerceptible;
760    }
761  
762    void RegisterSensitiveThread() const;
763  
SetZygoteNoThreadSection(bool val)764    void SetZygoteNoThreadSection(bool val) {
765      zygote_no_threads_ = val;
766    }
767  
IsZygoteNoThreadSection()768    bool IsZygoteNoThreadSection() const {
769      return zygote_no_threads_;
770    }
771  
772    // Returns if the code can be deoptimized asynchronously. Code may be compiled with some
773    // optimization that makes it impossible to deoptimize.
774    bool IsAsyncDeoptimizeable(uintptr_t code) const REQUIRES_SHARED(Locks::mutator_lock_);
775  
776    // Returns a saved copy of the environment (getenv/setenv values).
777    // Used by Fork to protect against overwriting LD_LIBRARY_PATH, etc.
GetEnvSnapshot()778    char** GetEnvSnapshot() const {
779      return env_snapshot_.GetSnapshot();
780    }
781  
782    void AddSystemWeakHolder(gc::AbstractSystemWeakHolder* holder);
783    void RemoveSystemWeakHolder(gc::AbstractSystemWeakHolder* holder);
784  
785    void AttachAgent(JNIEnv* env, const std::string& agent_arg, jobject class_loader);
786  
GetAgents()787    const std::list<std::unique_ptr<ti::Agent>>& GetAgents() const {
788      return agents_;
789    }
790  
791    RuntimeCallbacks* GetRuntimeCallbacks();
792  
HasLoadedPlugins()793    bool HasLoadedPlugins() const {
794      return !plugins_.empty();
795    }
796  
797    void InitThreadGroups(Thread* self);
798  
SetDumpGCPerformanceOnShutdown(bool value)799    void SetDumpGCPerformanceOnShutdown(bool value) {
800      dump_gc_performance_on_shutdown_ = value;
801    }
802  
GetDumpGCPerformanceOnShutdown()803    bool GetDumpGCPerformanceOnShutdown() const {
804      return dump_gc_performance_on_shutdown_;
805    }
806  
IncrementDeoptimizationCount(DeoptimizationKind kind)807    void IncrementDeoptimizationCount(DeoptimizationKind kind) {
808      DCHECK_LE(kind, DeoptimizationKind::kLast);
809      deoptimization_counts_[static_cast<size_t>(kind)]++;
810    }
811  
GetNumberOfDeoptimizations()812    uint32_t GetNumberOfDeoptimizations() const {
813      uint32_t result = 0;
814      for (size_t i = 0; i <= static_cast<size_t>(DeoptimizationKind::kLast); ++i) {
815        result += deoptimization_counts_[i];
816      }
817      return result;
818    }
819  
820    // Whether or not we use MADV_RANDOM on files that are thought to have random access patterns.
821    // This is beneficial for low RAM devices since it reduces page cache thrashing.
MAdviseRandomAccess()822    bool MAdviseRandomAccess() const {
823      return madvise_random_access_;
824    }
825  
GetJdwpOptions()826    const std::string& GetJdwpOptions() {
827      return jdwp_options_;
828    }
829  
GetJdwpProvider()830    JdwpProvider GetJdwpProvider() const {
831      return jdwp_provider_;
832    }
833  
GetVerifierLoggingThresholdMs()834    uint32_t GetVerifierLoggingThresholdMs() const {
835      return verifier_logging_threshold_ms_;
836    }
837  
838    // Atomically delete the thread pool if the reference count is 0.
839    bool DeleteThreadPool() REQUIRES(!Locks::runtime_thread_pool_lock_);
840  
841    // Wait for all the thread workers to be attached.
842    void WaitForThreadPoolWorkersToStart() REQUIRES(!Locks::runtime_thread_pool_lock_);
843  
844    // Scoped usage of the runtime thread pool. Prevents the pool from being
845    // deleted. Note that the thread pool is only for startup and gets deleted after.
846    class ScopedThreadPoolUsage {
847     public:
848      ScopedThreadPoolUsage();
849      ~ScopedThreadPoolUsage();
850  
851      // Return the thread pool.
GetThreadPool()852      ThreadPool* GetThreadPool() const {
853        return thread_pool_;
854      }
855  
856     private:
857      ThreadPool* const thread_pool_;
858    };
859  
LoadAppImageStartupCache()860    bool LoadAppImageStartupCache() const {
861      return load_app_image_startup_cache_;
862    }
863  
SetLoadAppImageStartupCacheEnabled(bool enabled)864    void SetLoadAppImageStartupCacheEnabled(bool enabled) {
865      load_app_image_startup_cache_ = enabled;
866    }
867  
868    // Notify the runtime that application startup is considered completed. Only has effect for the
869    // first call.
870    void NotifyStartupCompleted();
871  
872    // Return true if startup is already completed.
873    bool GetStartupCompleted() const;
874  
GetImageSpaceLoadingOrder()875    gc::space::ImageSpaceLoadingOrder GetImageSpaceLoadingOrder() const {
876      return image_space_loading_order_;
877    }
878  
879   private:
880    static void InitPlatformSignalHandlers();
881  
882    Runtime();
883  
884    void BlockSignals();
885  
886    bool Init(RuntimeArgumentMap&& runtime_options)
887        SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_);
888    void InitNativeMethods() REQUIRES(!Locks::mutator_lock_);
889    void RegisterRuntimeNativeMethods(JNIEnv* env);
890  
891    void StartDaemonThreads();
892    void StartSignalCatcher();
893  
894    void MaybeSaveJitProfilingInfo();
895  
896    // Visit all of the thread roots.
897    void VisitThreadRoots(RootVisitor* visitor, VisitRootFlags flags)
898        REQUIRES_SHARED(Locks::mutator_lock_);
899  
900    // Visit all other roots which must be done with mutators suspended.
901    void VisitNonConcurrentRoots(RootVisitor* visitor, VisitRootFlags flags)
902        REQUIRES_SHARED(Locks::mutator_lock_);
903  
904    // Constant roots are the roots which never change after the runtime is initialized, they only
905    // need to be visited once per GC cycle.
906    void VisitConstantRoots(RootVisitor* visitor)
907        REQUIRES_SHARED(Locks::mutator_lock_);
908  
909    // Note: To be lock-free, GetFaultMessage temporarily replaces the lock message with null.
910    //       As such, there is a window where a call will return an empty string. In general,
911    //       only aborting code should retrieve this data (via GetFaultMessageForAbortLogging
912    //       friend).
913    std::string GetFaultMessage();
914  
915    ThreadPool* AcquireThreadPool() REQUIRES(!Locks::runtime_thread_pool_lock_);
916    void ReleaseThreadPool() REQUIRES(!Locks::runtime_thread_pool_lock_);
917  
918    // A pointer to the active runtime or null.
919    static Runtime* instance_;
920  
921    // NOTE: these must match the gc::ProcessState values as they come directly from the framework.
922    static constexpr int kProfileForground = 0;
923    static constexpr int kProfileBackground = 1;
924  
925    static constexpr uint32_t kCalleeSaveSize = 6u;
926  
927    // 64 bit so that we can share the same asm offsets for both 32 and 64 bits.
928    uint64_t callee_save_methods_[kCalleeSaveSize];
929    // Pre-allocated exceptions (see Runtime::Init).
930    GcRoot<mirror::Throwable> pre_allocated_OutOfMemoryError_when_throwing_exception_;
931    GcRoot<mirror::Throwable> pre_allocated_OutOfMemoryError_when_throwing_oome_;
932    GcRoot<mirror::Throwable> pre_allocated_OutOfMemoryError_when_handling_stack_overflow_;
933    GcRoot<mirror::Throwable> pre_allocated_NoClassDefFoundError_;
934    ArtMethod* resolution_method_;
935    ArtMethod* imt_conflict_method_;
936    // Unresolved method has the same behavior as the conflict method, it is used by the class linker
937    // for differentiating between unfilled imt slots vs conflict slots in superclasses.
938    ArtMethod* imt_unimplemented_method_;
939  
940    // Special sentinel object used to invalid conditions in JNI (cleared weak references) and
941    // JDWP (invalid references).
942    GcRoot<mirror::Object> sentinel_;
943  
944    InstructionSet instruction_set_;
945  
946    CompilerCallbacks* compiler_callbacks_;
947    bool is_zygote_;
948    bool is_system_server_;
949    bool must_relocate_;
950    bool is_concurrent_gc_enabled_;
951    bool is_explicit_gc_disabled_;
952    bool image_dex2oat_enabled_;
953  
954    std::string compiler_executable_;
955    std::vector<std::string> compiler_options_;
956    std::vector<std::string> image_compiler_options_;
957    std::string image_location_;
958    bool is_using_apex_boot_image_location_;
959  
960    std::vector<std::string> boot_class_path_;
961    std::vector<std::string> boot_class_path_locations_;
962    std::string class_path_string_;
963    std::vector<std::string> properties_;
964  
965    std::list<ti::AgentSpec> agent_specs_;
966    std::list<std::unique_ptr<ti::Agent>> agents_;
967    std::vector<Plugin> plugins_;
968  
969    // The default stack size for managed threads created by the runtime.
970    size_t default_stack_size_;
971  
972    // Finalizers running for longer than this many milliseconds abort the runtime.
973    unsigned int finalizer_timeout_ms_;
974  
975    gc::Heap* heap_;
976  
977    std::unique_ptr<ArenaPool> jit_arena_pool_;
978    std::unique_ptr<ArenaPool> arena_pool_;
979    // Special low 4gb pool for compiler linear alloc. We need ArtFields to be in low 4gb if we are
980    // compiling using a 32 bit image on a 64 bit compiler in case we resolve things in the image
981    // since the field arrays are int arrays in this case.
982    std::unique_ptr<ArenaPool> low_4gb_arena_pool_;
983  
984    // Shared linear alloc for now.
985    std::unique_ptr<LinearAlloc> linear_alloc_;
986  
987    // The number of spins that are done before thread suspension is used to forcibly inflate.
988    size_t max_spins_before_thin_lock_inflation_;
989    MonitorList* monitor_list_;
990    MonitorPool* monitor_pool_;
991  
992    ThreadList* thread_list_;
993  
994    InternTable* intern_table_;
995  
996    ClassLinker* class_linker_;
997  
998    SignalCatcher* signal_catcher_;
999  
1000    std::unique_ptr<JavaVMExt> java_vm_;
1001  
1002    std::unique_ptr<jit::Jit> jit_;
1003    std::unique_ptr<jit::JitCodeCache> jit_code_cache_;
1004    std::unique_ptr<jit::JitOptions> jit_options_;
1005  
1006    // Runtime thread pool. The pool is only for startup and gets deleted after.
1007    std::unique_ptr<ThreadPool> thread_pool_ GUARDED_BY(Locks::runtime_thread_pool_lock_);
1008    size_t thread_pool_ref_count_ GUARDED_BY(Locks::runtime_thread_pool_lock_);
1009  
1010    // Fault message, printed when we get a SIGSEGV. Stored as a native-heap object and accessed
1011    // lock-free, so needs to be atomic.
1012    std::atomic<std::string*> fault_message_;
1013  
1014    // A non-zero value indicates that a thread has been created but not yet initialized. Guarded by
1015    // the shutdown lock so that threads aren't born while we're shutting down.
1016    size_t threads_being_born_ GUARDED_BY(Locks::runtime_shutdown_lock_);
1017  
1018    // Waited upon until no threads are being born.
1019    std::unique_ptr<ConditionVariable> shutdown_cond_ GUARDED_BY(Locks::runtime_shutdown_lock_);
1020  
1021    // Set when runtime shutdown is past the point that new threads may attach.
1022    bool shutting_down_ GUARDED_BY(Locks::runtime_shutdown_lock_);
1023  
1024    // The runtime is starting to shutdown but is blocked waiting on shutdown_cond_.
1025    bool shutting_down_started_ GUARDED_BY(Locks::runtime_shutdown_lock_);
1026  
1027    bool started_;
1028  
1029    // New flag added which tells us if the runtime has finished starting. If
1030    // this flag is set then the Daemon threads are created and the class loader
1031    // is created. This flag is needed for knowing if its safe to request CMS.
1032    bool finished_starting_;
1033  
1034    // Hooks supported by JNI_CreateJavaVM
1035    jint (*vfprintf_)(FILE* stream, const char* format, va_list ap);
1036    void (*exit_)(jint status);
1037    void (*abort_)();
1038  
1039    bool stats_enabled_;
1040    RuntimeStats stats_;
1041  
1042    const bool is_running_on_memory_tool_;
1043  
1044    std::unique_ptr<TraceConfig> trace_config_;
1045  
1046    instrumentation::Instrumentation instrumentation_;
1047  
1048    jobject main_thread_group_;
1049    jobject system_thread_group_;
1050  
1051    // As returned by ClassLoader.getSystemClassLoader().
1052    jobject system_class_loader_;
1053  
1054    // If true, then we dump the GC cumulative timings on shutdown.
1055    bool dump_gc_performance_on_shutdown_;
1056  
1057    // Transactions used for pre-initializing classes at compilation time.
1058    // Support nested transactions, maintain a list containing all transactions. Transactions are
1059    // handled under a stack discipline. Because GC needs to go over all transactions, we choose list
1060    // as substantial data structure instead of stack.
1061    std::list<std::unique_ptr<Transaction>> preinitialization_transactions_;
1062  
1063    // If kNone, verification is disabled. kEnable by default.
1064    verifier::VerifyMode verify_;
1065  
1066    // If true, the runtime may use dex files directly with the interpreter if an oat file is not
1067    // available/usable.
1068    bool allow_dex_file_fallback_;
1069  
1070    // List of supported cpu abis.
1071    std::vector<std::string> cpu_abilist_;
1072  
1073    // Specifies target SDK version to allow workarounds for certain API levels.
1074    uint32_t target_sdk_version_;
1075  
1076    // Implicit checks flags.
1077    bool implicit_null_checks_;       // NullPointer checks are implicit.
1078    bool implicit_so_checks_;         // StackOverflow checks are implicit.
1079    bool implicit_suspend_checks_;    // Thread suspension checks are implicit.
1080  
1081    // Whether or not the sig chain (and implicitly the fault handler) should be
1082    // disabled. Tools like dex2oat don't need them. This enables
1083    // building a statically link version of dex2oat.
1084    bool no_sig_chain_;
1085  
1086    // Force the use of native bridge even if the app ISA matches the runtime ISA.
1087    bool force_native_bridge_;
1088  
1089    // Whether or not a native bridge has been loaded.
1090    //
1091    // The native bridge allows running native code compiled for a foreign ISA. The way it works is,
1092    // if standard dlopen fails to load native library associated with native activity, it calls to
1093    // the native bridge to load it and then gets the trampoline for the entry to native activity.
1094    //
1095    // The option 'native_bridge_library_filename' specifies the name of the native bridge.
1096    // When non-empty the native bridge will be loaded from the given file. An empty value means
1097    // that there's no native bridge.
1098    bool is_native_bridge_loaded_;
1099  
1100    // Whether we are running under native debugger.
1101    bool is_native_debuggable_;
1102  
1103    // whether or not any async exceptions have ever been thrown. This is used to speed up the
1104    // MterpShouldSwitchInterpreters function.
1105    bool async_exceptions_thrown_;
1106  
1107    // Whether anything is going to be using the shadow-frame APIs to force a function to return
1108    // early. Doing this requires that (1) we be debuggable and (2) that mterp is exited.
1109    bool non_standard_exits_enabled_;
1110  
1111    // Whether Java code needs to be debuggable.
1112    bool is_java_debuggable_;
1113  
1114    // The maximum number of failed boots we allow before pruning the dalvik cache
1115    // and trying again. This option is only inspected when we're running as a
1116    // zygote.
1117    uint32_t zygote_max_failed_boots_;
1118  
1119    // Enable experimental opcodes that aren't fully specified yet. The intent is to
1120    // eventually publish them as public-usable opcodes, but they aren't ready yet.
1121    //
1122    // Experimental opcodes should not be used by other production code.
1123    ExperimentalFlags experimental_flags_;
1124  
1125    // Contains the build fingerprint, if given as a parameter.
1126    std::string fingerprint_;
1127  
1128    // Oat file manager, keeps track of what oat files are open.
1129    OatFileManager* oat_file_manager_;
1130  
1131    // Whether or not we are on a low RAM device.
1132    bool is_low_memory_mode_;
1133  
1134    // Whether or not we use MADV_RANDOM on files that are thought to have random access patterns.
1135    // This is beneficial for low RAM devices since it reduces page cache thrashing.
1136    bool madvise_random_access_;
1137  
1138    // Whether the application should run in safe mode, that is, interpreter only.
1139    bool safe_mode_;
1140  
1141    // Whether access checks on hidden API should be performed.
1142    hiddenapi::EnforcementPolicy hidden_api_policy_;
1143  
1144    // Whether access checks on core platform API should be performed.
1145    hiddenapi::EnforcementPolicy core_platform_api_policy_;
1146  
1147    // List of signature prefixes of methods that have been removed from the blacklist, and treated
1148    // as if whitelisted.
1149    std::vector<std::string> hidden_api_exemptions_;
1150  
1151    // Do not warn about the same hidden API access violation twice.
1152    // This is only used for testing.
1153    bool dedupe_hidden_api_warnings_;
1154  
1155    // How often to log hidden API access to the event log. An integer between 0
1156    // (never) and 0x10000 (always).
1157    uint32_t hidden_api_access_event_log_rate_;
1158  
1159    // The package of the app running in this process.
1160    std::string process_package_name_;
1161  
1162    // The data directory of the app running in this process.
1163    std::string process_data_directory_;
1164  
1165    // Whether threads should dump their native stack on SIGQUIT.
1166    bool dump_native_stack_on_sig_quit_;
1167  
1168    // Whether the dalvik cache was pruned when initializing the runtime.
1169    bool pruned_dalvik_cache_;
1170  
1171    // Whether or not we currently care about pause times.
1172    ProcessState process_state_;
1173  
1174    // Whether zygote code is in a section that should not start threads.
1175    bool zygote_no_threads_;
1176  
1177    // The string containing requested jdwp options
1178    std::string jdwp_options_;
1179  
1180    // The jdwp provider we were configured with.
1181    JdwpProvider jdwp_provider_;
1182  
1183    // Saved environment.
1184    class EnvSnapshot {
1185     public:
1186      EnvSnapshot() = default;
1187      void TakeSnapshot();
1188      char** GetSnapshot() const;
1189  
1190     private:
1191      std::unique_ptr<char*[]> c_env_vector_;
1192      std::vector<std::unique_ptr<std::string>> name_value_pairs_;
1193  
1194      DISALLOW_COPY_AND_ASSIGN(EnvSnapshot);
1195    } env_snapshot_;
1196  
1197    // Generic system-weak holders.
1198    std::vector<gc::AbstractSystemWeakHolder*> system_weak_holders_;
1199  
1200    std::unique_ptr<RuntimeCallbacks> callbacks_;
1201  
1202    std::atomic<uint32_t> deoptimization_counts_[
1203        static_cast<uint32_t>(DeoptimizationKind::kLast) + 1];
1204  
1205    MemMap protected_fault_page_;
1206  
1207    uint32_t verifier_logging_threshold_ms_;
1208  
1209    bool load_app_image_startup_cache_ = false;
1210  
1211    // If startup has completed, must happen at most once.
1212    std::atomic<bool> startup_completed_ = false;
1213  
1214    gc::space::ImageSpaceLoadingOrder image_space_loading_order_ =
1215        gc::space::ImageSpaceLoadingOrder::kSystemFirst;
1216  
1217    // Note: See comments on GetFaultMessage.
1218    friend std::string GetFaultMessageForAbortLogging();
1219    friend class ScopedThreadPoolUsage;
1220    friend class OatFileAssistantTest;
1221  
1222    DISALLOW_COPY_AND_ASSIGN(Runtime);
1223  };
1224  
1225  }  // namespace art
1226  
1227  #endif  // ART_RUNTIME_RUNTIME_H_
1228