runtime.h revision bad0267eaab9d6a522d05469ff90501deefdb88b
134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn/*
234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * Copyright (C) 2011 The Android Open Source Project
334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn *
434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License");
534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * you may not use this file except in compliance with the License.
634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * You may obtain a copy of the License at
734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn *
834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn *      http://www.apache.org/licenses/LICENSE-2.0
934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn *
1034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * Unless required by applicable law or agreed to in writing, software
1134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS,
1234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * See the License for the specific language governing permissions and
1434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * limitations under the License.
1534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn */
1634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
1734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#ifndef ART_RUNTIME_RUNTIME_H_
1834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#define ART_RUNTIME_RUNTIME_H_
1934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
20720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn#include <jni.h>
21720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn#include <stdio.h>
2234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
2334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <iosfwd>
24758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn#include <set>
25758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn#include <string>
26511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn#include <utility>
27511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn#include <vector>
28758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
2934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include "base/allocator.h"
30758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn#include "compiler_callbacks.h"
3197c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn#include "gc_root.h"
3297c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn#include "instrumentation.h"
335ac5c6b19364b5b3061a59db796b2357c95c3b64Mark Salyzyn#include "instruction_set.h"
3434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include "jobject_comparator.h"
3534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include "nativebridge/native_bridge.h"
3634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include "object_callbacks.h"
3734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include "offsets.h"
38758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn#include "profiler_options.h"
39758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn#include "quick/quick_method_frame_info.h"
40720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn#include "runtime_stats.h"
41511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn#include "safe_map.h"
42511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn
43511338dd575572d567c04d69eaea60627b6c3452Mark Salyzynnamespace art {
44511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn
45720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzynnamespace gc {
46511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn  class Heap;
47511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn}  // namespace gc
48758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzynnamespace mirror {
49511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn  class ArtMethod;
50758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  class ClassLoader;
51758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  class Array;
52720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn  template<class T> class ObjectArray;
53720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn  template<class T> class PrimitiveArray;
54720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn  typedef PrimitiveArray<int8_t> ByteArray;
55720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn  class String;
56758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  class Throwable;
57758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn}  // namespace mirror
58720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzynnamespace verifier {
59758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzynclass MethodVerifier;
60511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn}
61758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzynclass ClassLinker;
62758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzynclass DexFile;
63758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzynclass InternTable;
64758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzynclass JavaVMExt;
65720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzynclass MonitorList;
66758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzynclass MonitorPool;
67758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzynclass NullPointerHandler;
68758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzynclass SignalCatcher;
69758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzynclass StackOverflowHandler;
70758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzynclass SuspensionHandler;
71720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzynclass ThreadList;
72758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzynclass Trace;
73720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzynclass Transaction;
74720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
75720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyntypedef std::vector<std::pair<std::string, const void*>> RuntimeOptions;
76720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
77720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn// Not all combinations of flags are valid. You may not visit all roots as well as the new roots
78720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn// (no logical reason to do this). You also may not start logging new roots and stop logging new
79758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn// roots (also no logical reason to do this).
80511338dd575572d567c04d69eaea60627b6c3452Mark Salyzynenum VisitRootFlags : uint8_t {
81511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn  kVisitRootFlagAllRoots = 0x1,
82758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  kVisitRootFlagNewRoots = 0x2,
83511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn  kVisitRootFlagStartLoggingNewRoots = 0x4,
84758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  kVisitRootFlagStopLoggingNewRoots = 0x8,
8581b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  kVisitRootFlagClearRootLog = 0x10,
86511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn};
8781b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn
8881b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzynclass Runtime {
89511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn public:
90511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn  // Creates and initializes a new runtime.
91511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn  static bool Create(const RuntimeOptions& options, bool ignore_unrecognized)
92511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn      SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_);
93511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn
94511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn  bool IsCompiler() const {
9581b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn    return compiler_callbacks_ != nullptr;
96511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn  }
9781b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn
9881b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  bool CanRelocate() const {
99758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return !IsCompiler() || compiler_callbacks_->IsRelocationPossible();
100511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn  }
101758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
102511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn  bool ShouldRelocate() const {
10381b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn    return must_relocate_ && CanRelocate();
10481b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  }
10581b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn
106758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  bool MustRelocateIfPossible() const {
107511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn    return must_relocate_;
108511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn  }
109758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
11081b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  bool IsDex2OatEnabled() const {
11181b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn    return dex2oat_enabled_ && IsImageDex2OatEnabled();
11281b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  }
113511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn
114758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  bool IsImageDex2OatEnabled() const {
115511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn    return image_dex2oat_enabled_;
116758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
117758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
118758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  CompilerCallbacks* GetCompilerCallbacks() {
119758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return compiler_callbacks_;
120758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
121758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
122758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  bool IsZygote() const {
123758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return is_zygote_;
124758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
125758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
126758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  bool IsExplicitGcDisabled() const {
127758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return is_explicit_gc_disabled_;
128758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
129758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
130758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  std::string GetCompilerExecutable() const;
131758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  std::string GetPatchoatExecutable() const;
132758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
133758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  const std::vector<std::string>& GetCompilerOptions() const {
134758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return compiler_options_;
135758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
136758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
137758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  const std::vector<std::string>& GetImageCompilerOptions() const {
138758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return image_compiler_options_;
139758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
140758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
141758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  const ProfilerOptions& GetProfilerOptions() const {
142758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return profiler_options_;
143758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
144758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
145758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  // Starts a runtime, which may cause threads to be started and code to run.
146758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  bool Start() UNLOCK_FUNCTION(Locks::mutator_lock_);
147758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
148758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  bool IsShuttingDown(Thread* self);
149758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  bool IsShuttingDownLocked() const EXCLUSIVE_LOCKS_REQUIRED(Locks::runtime_shutdown_lock_) {
150758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return shutting_down_;
151720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn  }
152720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
153758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  size_t NumberOfThreadsBeingBorn() const EXCLUSIVE_LOCKS_REQUIRED(Locks::runtime_shutdown_lock_) {
154758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return threads_being_born_;
155758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
156758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
157758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  void StartThreadBirth() EXCLUSIVE_LOCKS_REQUIRED(Locks::runtime_shutdown_lock_) {
15881b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn    threads_being_born_++;
15997c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn  }
16034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
16181b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  void EndThreadBirth() EXCLUSIVE_LOCKS_REQUIRED(Locks::runtime_shutdown_lock_);
162758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
16334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn  bool IsStarted() const {
16497c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    return started_;
16581b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  }
166758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
167758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  bool IsFinishedStarting() const {
168758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return finished_starting_;
169758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
170758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
171758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  static Runtime* Current() {
172758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return instance_;
173758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
174758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
175758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  // Aborts semi-cleanly. Used in the implementation of LOG(FATAL), which most
176758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  // callers should prefer.
177758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  // This isn't marked ((noreturn)) because then gcc will merge multiple calls
178758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  // in a single function together. This reduces code size slightly, but means
179758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  // that the native stack trace we get may point at the wrong call site.
180758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  static void Abort() LOCKS_EXCLUDED(Locks::abort_lock_);
181758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
182758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  // Returns the "main" ThreadGroup, used when attaching user threads.
183758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  jobject GetMainThreadGroup() const;
184758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
185758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  // Returns the "system" ThreadGroup, used when attaching our internal threads.
186758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  jobject GetSystemThreadGroup() const;
187758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
188758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  // Returns the system ClassLoader which represents the CLASSPATH.
189758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  jobject GetSystemClassLoader() const;
190758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
19181b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  // Attaches the calling native thread to the runtime.
19281b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  bool AttachCurrentThread(const char* thread_name, bool as_daemon, jobject thread_group,
19381b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn                           bool create_peer);
19481b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn
19581b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  void CallExitHook(jint status);
19681b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn
197758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  // Detaches the current native thread from the runtime.
198758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  void DetachCurrentThread() LOCKS_EXCLUDED(Locks::mutator_lock_);
199758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
200758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  void DumpForSigQuit(std::ostream& os)
20181b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn      EXCLUSIVE_LOCKS_REQUIRED(Locks::mutator_lock_);
202ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn  void DumpLockHolders(std::ostream& os);
203ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn
204758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  ~Runtime();
205758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
206758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  const std::string& GetBootClassPathString() const {
20781b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn    return boot_class_path_string_;
208758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
209758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
210758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  const std::string& GetClassPathString() const {
21181b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn    return class_path_string_;
212758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
21381b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn
214758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  ClassLinker* GetClassLinker() const {
21581b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn    return class_linker_;
21681b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  }
21781b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn
21881b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  size_t GetDefaultStackSize() const {
21981b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn    return default_stack_size_;
22081b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  }
221758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
222758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  gc::Heap* GetHeap() const {
223758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return heap_;
224758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
22581b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn
22681b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  InternTable* GetInternTable() const {
227758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    DCHECK(intern_table_ != NULL);
228758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return intern_table_;
229758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
230758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
23134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn  JavaVMExt* GetJavaVM() const {
23234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return java_vm_;
23381b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  }
23481b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn
23581b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  size_t GetMaxSpinsBeforeThinkLockInflation() const {
23681b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn    return max_spins_before_thin_lock_inflation_;
23781b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  }
238720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
239720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn  MonitorList* GetMonitorList() const {
240720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn    return monitor_list_;
241720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn  }
242758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
243758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  MonitorPool* GetMonitorPool() const {
244758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return monitor_pool_;
245758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
246758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
247758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  mirror::Throwable* GetPreAllocatedOutOfMemoryError() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
248758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
249758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  const std::vector<std::string>& GetProperties() const {
250758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return properties_;
251758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
252758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
253758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  ThreadList* GetThreadList() const {
254758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return thread_list_;
255758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
256758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
257758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  static const char* GetVersion() {
258758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return "2.1.0";
259758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
260720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
261720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn  void DisallowNewSystemWeaks() EXCLUSIVE_LOCKS_REQUIRED(Locks::mutator_lock_);
262720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn  void AllowNewSystemWeaks() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
263720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
264720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn  // Visit all the roots. If only_dirty is true then non-dirty roots won't be visited. If
26581b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  // clean_dirty is true then dirty roots will be marked as non-dirty after visiting.
266758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  void VisitRoots(RootCallback* visitor, void* arg, VisitRootFlags flags = kVisitRootFlagAllRoots)
267ddda212faa81d62f637926680cd8163345120f71Mark Salyzyn      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
268aa43ae2268076227e8b72ea095f8aeac439b3168Mark Salyzyn
269aa43ae2268076227e8b72ea095f8aeac439b3168Mark Salyzyn  // Visit all of the roots we can do safely do concurrently.
270aa43ae2268076227e8b72ea095f8aeac439b3168Mark Salyzyn  void VisitConcurrentRoots(RootCallback* visitor, void* arg,
27181b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn                            VisitRootFlags flags = kVisitRootFlagAllRoots)
272758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
27381b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn
27481b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  // Visit all of the non thread roots, we can do this with mutators unpaused.
27581b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  void VisitNonThreadRoots(RootCallback* visitor, void* arg)
276758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
277758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
278758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  // Visit all other roots which must be done with mutators suspended.
279758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  void VisitNonConcurrentRoots(RootCallback* visitor, void* arg)
28081b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
281758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
28281b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  // Sweep system weaks, the system weak is deleted if the visitor return nullptr. Otherwise, the
283758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  // system weak is updated to be the visitor's returned value.
28481b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  void SweepSystemWeaks(IsMarkedCallback* visitor, void* arg)
285758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
28681b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn
287758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  // Constant roots are the roots which never change after the runtime is initialized, they only
288758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  // need to be visited once per GC cycle.
289758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  void VisitConstantRoots(RootCallback* callback, void* arg)
290344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
291344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn
29217ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn  // Returns a special method that calls into a trampoline for runtime method resolution
29317ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn  mirror::ArtMethod* GetResolutionMethod() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
29417ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn
29517ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn  bool HasResolutionMethod() const {
29617ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn    return !resolution_method_.IsNull();
297758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
298758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
299758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  void SetResolutionMethod(mirror::ArtMethod* method) {
300758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    resolution_method_ = GcRoot<mirror::ArtMethod>(method);
301758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
302758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
303758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  mirror::ArtMethod* CreateResolutionMethod() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
304758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
305758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  // Returns a special method that calls into a trampoline for runtime imt conflicts.
306758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  mirror::ArtMethod* GetImtConflictMethod() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
307758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
308758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  bool HasImtConflictMethod() const {
309758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return !imt_conflict_method_.IsNull();
310758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
311758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
312758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  void SetImtConflictMethod(mirror::ArtMethod* method) {
313758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    imt_conflict_method_ = GcRoot<mirror::ArtMethod>(method);
314758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
31517ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn
31617ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn  mirror::ArtMethod* CreateImtConflictMethod() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
31717ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn
31817ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn  // Returns an imt with every entry set to conflict, used as default imt for all classes.
31917ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn  mirror::ObjectArray<mirror::ArtMethod>* GetDefaultImt()
32017ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
321758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
322ddda212faa81d62f637926680cd8163345120f71Mark Salyzyn  bool HasDefaultImt() const {
32317ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn    return !default_imt_.IsNull();
32417ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn  }
32517ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn
32617ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn  void SetDefaultImt(mirror::ObjectArray<mirror::ArtMethod>* imt) {
327758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    default_imt_ = GcRoot<mirror::ObjectArray<mirror::ArtMethod>>(imt);
32817ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn  }
32917ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn
33017ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn  mirror::ObjectArray<mirror::ArtMethod>* CreateDefaultImt(ClassLinker* cl)
331758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
332758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
333758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  // Returns a special method that describes all callee saves being spilled to the stack.
334758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  enum CalleeSaveType {
33517ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn    kSaveAll,
336758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    kRefsOnly,
33717ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn    kRefsAndArgs,
338758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    kLastCalleeSaveType  // Value used for iteration
33917ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn  };
340758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
34117ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn  bool HasCalleeSaveMethod(CalleeSaveType type) const {
342758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return !callee_save_methods_[type].IsNull();
343758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
344758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
34517ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn  mirror::ArtMethod* GetCalleeSaveMethod(CalleeSaveType type)
34617ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
347344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn
348344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn  mirror::ArtMethod* GetCalleeSaveMethodUnchecked(CalleeSaveType type)
349344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
350344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn
351758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  QuickMethodFrameInfo GetCalleeSaveMethodFrameInfo(CalleeSaveType type) const {
352758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return callee_save_method_frame_infos_[type];
353758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  }
354758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
355758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  QuickMethodFrameInfo GetRuntimeMethodFrameInfo(mirror::ArtMethod* method)
356344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
357344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn
358344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn  static size_t GetCalleeSaveMethodOffset(CalleeSaveType type) {
359344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn    return OFFSETOF_MEMBER(Runtime, callee_save_methods_[type]);
36081b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn  }
361758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
362758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  InstructionSet GetInstructionSet() const {
363758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn    return instruction_set_;
364344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn  }
365344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn
366758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  void SetInstructionSet(InstructionSet instruction_set);
367344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn
368758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  void SetCalleeSaveMethod(mirror::ArtMethod* method, CalleeSaveType type);
369758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
370758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  mirror::ArtMethod* CreateCalleeSaveMethod(CalleeSaveType type)
371720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
372720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
37334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn  int32_t GetStat(int kind);
37434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
37534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn  RuntimeStats* GetStats() {
37634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return &stats_;
37797c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn  }
37897c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn
379720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn  bool HasStatsEnabled() const {
38034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return stats_enabled_;
38197c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn  }
382720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
38397c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn  void ResetStats(int kinds);
384e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn
385720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn  void SetStatsEnabled(bool new_state);
386720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn
387720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn  void PreZygoteFork();
388720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn  bool InitZygote();
38917ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn  void DidForkFromZygote();
39017ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn
39117ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn  const instrumentation::Instrumentation* GetInstrumentation() const {
39217ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn    return &instrumentation_;
393344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn  }
394344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn
395344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn  instrumentation::Instrumentation* GetInstrumentation() {
396344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn    return &instrumentation_;
39734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn  }
39834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
39934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn  bool UseCompileTimeClassPath() const {
400720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn    return use_compile_time_class_path_;
40134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn  }
40297c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn
40397c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn  void AddMethodVerifier(verifier::MethodVerifier* verifier) LOCKS_EXCLUDED(method_verifier_lock_);
404ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn  void RemoveMethodVerifier(verifier::MethodVerifier* verifier)
405ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn      LOCKS_EXCLUDED(method_verifier_lock_);
406ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn
407ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn  const std::vector<const DexFile*>& GetCompileTimeClassPath(jobject class_loader);
408e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn  void SetCompileTimeClassPath(jobject class_loader, std::vector<const DexFile*>& class_path);
409758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn
410758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  void StartProfiler(const char* profile_output_filename);
411758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  void UpdateProfilerState(int state);
41234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
41334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn  // Transaction support.
41434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn  bool IsActiveTransaction() const {
41534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return preinitialization_transaction_ != nullptr;
41697c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn  }
41797c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn  void EnterTransactionMode(Transaction* transaction);
41834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn  void ExitTransactionMode();
419758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn  void RecordWriteFieldBoolean(mirror::Object* obj, MemberOffset field_offset, uint8_t value,
4209a03863e88da99ba010342c874252089dd771f7fMark Salyzyn                               bool is_volatile) const;
421ed777e9eece54bf899f1a77a83f8b702970de686Mark Salyzyn  void RecordWriteFieldByte(mirror::Object* obj, MemberOffset field_offset, int8_t value,
422758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn                            bool is_volatile) const;
4234ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn  void RecordWriteFieldChar(mirror::Object* obj, MemberOffset field_offset, uint16_t value,
424758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn                            bool is_volatile) const;
42534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn  void RecordWriteFieldShort(mirror::Object* obj, MemberOffset field_offset, int16_t value,
42634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                          bool is_volatile) const;
42734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn  void RecordWriteField32(mirror::Object* obj, MemberOffset field_offset, uint32_t value,
428                          bool is_volatile) const;
429  void RecordWriteField64(mirror::Object* obj, MemberOffset field_offset, uint64_t value,
430                          bool is_volatile) const;
431  void RecordWriteFieldReference(mirror::Object* obj, MemberOffset field_offset,
432                                 mirror::Object* value, bool is_volatile) const;
433  void RecordWriteArray(mirror::Array* array, size_t index, uint64_t value) const
434      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
435  void RecordStrongStringInsertion(mirror::String* s, uint32_t hash_code) const
436      EXCLUSIVE_LOCKS_REQUIRED(Locks::intern_table_lock_);
437  void RecordWeakStringInsertion(mirror::String* s, uint32_t hash_code) const
438      EXCLUSIVE_LOCKS_REQUIRED(Locks::intern_table_lock_);
439  void RecordStrongStringRemoval(mirror::String* s, uint32_t hash_code) const
440      EXCLUSIVE_LOCKS_REQUIRED(Locks::intern_table_lock_);
441  void RecordWeakStringRemoval(mirror::String* s, uint32_t hash_code) const
442      EXCLUSIVE_LOCKS_REQUIRED(Locks::intern_table_lock_);
443
444  void SetFaultMessage(const std::string& message);
445  // Only read by the signal handler, NO_THREAD_SAFETY_ANALYSIS to prevent lock order violations
446  // with the unexpected_signal_lock_.
447  const std::string& GetFaultMessage() NO_THREAD_SAFETY_ANALYSIS {
448    return fault_message_;
449  }
450
451  void AddCurrentRuntimeFeaturesAsDex2OatArguments(std::vector<std::string>* arg_vector) const;
452
453  bool ExplicitNullChecks() const {
454    return null_pointer_handler_ == nullptr;
455  }
456
457  bool ExplicitSuspendChecks() const {
458    return suspend_handler_ == nullptr;
459  }
460
461  bool ExplicitStackOverflowChecks() const {
462    return stack_overflow_handler_ == nullptr;
463  }
464
465  bool IsVerificationEnabled() const {
466    return verify_;
467  }
468
469  bool RunningOnValgrind() const {
470    return running_on_valgrind_;
471  }
472
473  void SetTargetSdkVersion(int32_t version) {
474    target_sdk_version_ = version;
475  }
476
477  int32_t GetTargetSdkVersion() const {
478    return target_sdk_version_;
479  }
480
481  static const char* GetDefaultInstructionSetFeatures() {
482    return kDefaultInstructionSetFeatures;
483  }
484
485 private:
486  static void InitPlatformSignalHandlers();
487
488  Runtime();
489
490  void BlockSignals();
491
492  bool Init(const RuntimeOptions& options, bool ignore_unrecognized)
493      SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_);
494  void InitNativeMethods() LOCKS_EXCLUDED(Locks::mutator_lock_);
495  void InitThreadGroups(Thread* self);
496  void RegisterRuntimeNativeMethods(JNIEnv* env);
497
498  void StartDaemonThreads();
499  void StartSignalCatcher();
500
501  // A pointer to the active runtime or NULL.
502  static Runtime* instance_;
503
504  static const char* kDefaultInstructionSetFeatures;
505
506  // NOTE: these must match the gc::ProcessState values as they come directly from the framework.
507  static constexpr int kProfileForground = 0;
508  static constexpr int kProfileBackgrouud = 1;
509
510  GcRoot<mirror::ArtMethod> callee_save_methods_[kLastCalleeSaveType];
511  GcRoot<mirror::Throwable> pre_allocated_OutOfMemoryError_;
512  GcRoot<mirror::ArtMethod> resolution_method_;
513  GcRoot<mirror::ArtMethod> imt_conflict_method_;
514  GcRoot<mirror::ObjectArray<mirror::ArtMethod>> default_imt_;
515
516  InstructionSet instruction_set_;
517  QuickMethodFrameInfo callee_save_method_frame_infos_[kLastCalleeSaveType];
518
519  CompilerCallbacks* compiler_callbacks_;
520  bool is_zygote_;
521  bool must_relocate_;
522  bool is_concurrent_gc_enabled_;
523  bool is_explicit_gc_disabled_;
524  bool dex2oat_enabled_;
525  bool image_dex2oat_enabled_;
526
527  std::string compiler_executable_;
528  std::string patchoat_executable_;
529  std::vector<std::string> compiler_options_;
530  std::vector<std::string> image_compiler_options_;
531
532  std::string boot_class_path_string_;
533  std::string class_path_string_;
534  std::vector<std::string> properties_;
535
536  // The default stack size for managed threads created by the runtime.
537  size_t default_stack_size_;
538
539  gc::Heap* heap_;
540
541  // The number of spins that are done before thread suspension is used to forcibly inflate.
542  size_t max_spins_before_thin_lock_inflation_;
543  MonitorList* monitor_list_;
544  MonitorPool* monitor_pool_;
545
546  ThreadList* thread_list_;
547
548  InternTable* intern_table_;
549
550  ClassLinker* class_linker_;
551
552  SignalCatcher* signal_catcher_;
553  std::string stack_trace_file_;
554
555  JavaVMExt* java_vm_;
556
557  // Fault message, printed when we get a SIGSEGV.
558  Mutex fault_message_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
559  std::string fault_message_ GUARDED_BY(fault_message_lock_);
560
561  // Method verifier set, used so that we can update their GC roots.
562  Mutex method_verifier_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
563  std::set<verifier::MethodVerifier*> method_verifiers_;
564
565  // A non-zero value indicates that a thread has been created but not yet initialized. Guarded by
566  // the shutdown lock so that threads aren't born while we're shutting down.
567  size_t threads_being_born_ GUARDED_BY(Locks::runtime_shutdown_lock_);
568
569  // Waited upon until no threads are being born.
570  std::unique_ptr<ConditionVariable> shutdown_cond_ GUARDED_BY(Locks::runtime_shutdown_lock_);
571
572  // Set when runtime shutdown is past the point that new threads may attach.
573  bool shutting_down_ GUARDED_BY(Locks::runtime_shutdown_lock_);
574
575  // The runtime is starting to shutdown but is blocked waiting on shutdown_cond_.
576  bool shutting_down_started_ GUARDED_BY(Locks::runtime_shutdown_lock_);
577
578  bool started_;
579
580  // New flag added which tells us if the runtime has finished starting. If
581  // this flag is set then the Daemon threads are created and the class loader
582  // is created. This flag is needed for knowing if its safe to request CMS.
583  bool finished_starting_;
584
585  // Hooks supported by JNI_CreateJavaVM
586  jint (*vfprintf_)(FILE* stream, const char* format, va_list ap);
587  void (*exit_)(jint status);
588  void (*abort_)();
589
590  bool stats_enabled_;
591  RuntimeStats stats_;
592
593  const bool running_on_valgrind_;
594
595  std::string profile_output_filename_;
596  ProfilerOptions profiler_options_;
597  bool profiler_started_;
598
599  bool method_trace_;
600  std::string method_trace_file_;
601  size_t method_trace_file_size_;
602  instrumentation::Instrumentation instrumentation_;
603
604  typedef AllocationTrackingSafeMap<jobject, std::vector<const DexFile*>,
605                                    kAllocatorTagCompileTimeClassPath, JobjectComparator>
606      CompileTimeClassPaths;
607  CompileTimeClassPaths compile_time_class_paths_;
608  bool use_compile_time_class_path_;
609
610  jobject main_thread_group_;
611  jobject system_thread_group_;
612
613  // As returned by ClassLoader.getSystemClassLoader().
614  jobject system_class_loader_;
615
616  // If true, then we dump the GC cumulative timings on shutdown.
617  bool dump_gc_performance_on_shutdown_;
618
619  // Transaction used for pre-initializing classes at compilation time.
620  Transaction* preinitialization_transaction_;
621  NullPointerHandler* null_pointer_handler_;
622  SuspensionHandler* suspend_handler_;
623  StackOverflowHandler* stack_overflow_handler_;
624
625  // If false, verification is disabled. True by default.
626  bool verify_;
627
628  // Specifies target SDK version to allow workarounds for certain API levels.
629  int32_t target_sdk_version_;
630
631  // Implicit checks flags.
632  bool implicit_null_checks_;       // NullPointer checks are implicit.
633  bool implicit_so_checks_;         // StackOverflow checks are implicit.
634  bool implicit_suspend_checks_;    // Thread suspension checks are implicit.
635
636  // The filename to the native bridge library. If this is not empty the native bridge will be
637  // initialized and loaded from the given file (initialized and available). An empty value means
638  // that there's no native bridge (initialized but not available).
639  //
640  // The native bridge allows running native code compiled for a foreign ISA. The way it works is,
641  // if standard dlopen fails to load native library associated with native activity, it calls to
642  // the native bridge to load it and then gets the trampoline for the entry to native activity.
643  std::string native_bridge_library_filename_;
644
645  // Native bridge library runtime callbacks. They represent the runtime interface to native bridge.
646  //
647  // The interface is expected to expose the following methods:
648  // getMethodShorty(): in the case of native method calling JNI native function CallXXXXMethodY(),
649  //   native bridge calls back to VM for the shorty of the method so that it can prepare based on
650  //   host calling convention.
651  // getNativeMethodCount() and getNativeMethods(): in case of JNI function UnregisterNatives(),
652  //   native bridge can call back to get all native methods of specified class so that all
653  //   corresponding trampolines can be destroyed.
654  android::NativeBridgeRuntimeCallbacks native_bridge_art_callbacks_;
655
656  DISALLOW_COPY_AND_ASSIGN(Runtime);
657};
658
659}  // namespace art
660
661#endif  // ART_RUNTIME_RUNTIME_H_
662