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