runtime.h revision c33a32bccc4c66ed82ce3a580b16636399385cb4
16b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapiro// Copyright 2011 Google Inc. All Rights Reserved.
27b21670581d13db32f1384a3b2692bcfc8f57320Carl Shapiro
31fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro#ifndef ART_SRC_RUNTIME_H_
41fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro#define ART_SRC_RUNTIME_H_
56b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapiro
6c5f7c91ab89055cffb573fff7e06dbdd860bccedElliott Hughes#include <stdio.h>
7c5f7c91ab89055cffb573fff7e06dbdd860bccedElliott Hughes
8e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes#include <iosfwd>
96ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom#include <string>
10fc322c72d7a89a6f7a05c8bdc232d780aecd9232Carl Shapiro#include <utility>
116ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom#include <vector>
12578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
13c5f7c91ab89055cffb573fff7e06dbdd860bccedElliott Hughes#include <jni.h>
14c5f7c91ab89055cffb573fff7e06dbdd860bccedElliott Hughes
15ff1ed4770bf7ff024a807b9f909b1a26abb78341Ian Rogers#include "constants.h"
161f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom#include "heap.h"
17578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "globals.h"
18578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "macros.h"
199d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes#include "runtime_stats.h"
20578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "stringpiece.h"
2144753c3908fcd5ccc066bf0dceddeabfeacf9f24Brian Carlstrom#include "unordered_set.h"
22b557353b22c728eecbd1c68593b482622c7782a8Carl Shapiro
236b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapironamespace art {
247b21670581d13db32f1384a3b2692bcfc8f57320Carl Shapiro
25161928613d3f097108319de60494fab1aab8d48aBrian Carlstromtemplate<class T> class PrimitiveArray;
26161928613d3f097108319de60494fab1aab8d48aBrian Carlstromtypedef PrimitiveArray<int8_t> ByteArray;
2761e019d291583029c01b61b93bea750f2b663c37Carl Shapiroclass ClassLinker;
28aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstromclass ClassLoader;
29fc322c72d7a89a6f7a05c8bdc232d780aecd9232Carl Shapiroclass DexFile;
3061e019d291583029c01b61b93bea750f2b663c37Carl Shapiroclass Heap;
31cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughesclass InternTable;
32c5f7c91ab89055cffb573fff7e06dbdd860bccedElliott Hughesclass JavaVMExt;
33ff1ed4770bf7ff024a807b9f909b1a26abb78341Ian Rogersclass Method;
34c33a32bccc4c66ed82ce3a580b16636399385cb4Elliott Hughesclass MonitorList;
35e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughesclass SignalCatcher;
366ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstromclass String;
3761e019d291583029c01b61b93bea750f2b663c37Carl Shapiroclass ThreadList;
3861e019d291583029c01b61b93bea750f2b663c37Carl Shapiro
391fb8620309a4e94d11879aabc33364acfa733904Carl Shapiroclass Runtime {
407b21670581d13db32f1384a3b2692bcfc8f57320Carl Shapiro public:
418a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom
428a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom  typedef std::vector<std::pair<StringPiece, const void*> > Options;
438a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom
448a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom  class ParsedOptions {
458a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom   public:
466ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom    // returns null if problem parsing and ignore_unrecognized is false
476ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom    static ParsedOptions* Create(const Options& options, bool ignore_unrecognized);
488a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom
4958ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom    std::string boot_class_path_;
5058ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom    std::string class_path_;
5158ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom    std::string host_prefix_;
5258ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom    std::vector<std::string> images_;
53515a5bc89282d6f910cae4d5852bb77124a47825Elliott Hughes    bool check_jni_;
54a09576416788b916095739e43a16917e7948f3a4Elliott Hughes    std::string jni_trace_;
559ca7a1fdd0daa546b790adb6a24dbc13c22df76aElliott Hughes    bool is_zygote_;
568a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom    size_t heap_initial_size_;
578a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom    size_t heap_maximum_size_;
58f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom    size_t stack_size_;
596ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom    jint (*hook_vfprintf_)(FILE* stream, const char* format, va_list ap);
606ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom    void (*hook_exit_)(jint status);
616ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom    void (*hook_abort_)();
6244753c3908fcd5ccc066bf0dceddeabfeacf9f24Brian Carlstrom    std::tr1::unordered_set<std::string> verbose_;
636ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom    std::vector<std::string> properties_;
646ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom
65a09576416788b916095739e43a16917e7948f3a4Elliott Hughes    bool IsVerbose(const std::string& key) const {
66a09576416788b916095739e43a16917e7948f3a4Elliott Hughes      return verbose_.find(key) != verbose_.end();
67a09576416788b916095739e43a16917e7948f3a4Elliott Hughes    }
68a09576416788b916095739e43a16917e7948f3a4Elliott Hughes
696ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom   private:
700cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers    ParsedOptions() {}
718a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom  };
722ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro
7361e019d291583029c01b61b93bea750f2b663c37Carl Shapiro  // Creates and initializes a new runtime.
742ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro  static Runtime* Create(const Options& options, bool ignore_unrecognized);
7569b15fb098162f19a4c20e6dccdcead04d9c77f0Brian Carlstrom
760a5b14de5115f51e0ed2dd6c3fcc5b84bbce690eBrian Carlstrom  bool IsVerboseStartup() const {
770a5b14de5115f51e0ed2dd6c3fcc5b84bbce690eBrian Carlstrom    return verbose_startup_;
780a5b14de5115f51e0ed2dd6c3fcc5b84bbce690eBrian Carlstrom  }
790a5b14de5115f51e0ed2dd6c3fcc5b84bbce690eBrian Carlstrom
8058ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  const std::string& GetHostPrefix() const {
8158ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom    CHECK(!IsStarted());
8258ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom    return host_prefix_;
8358ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  }
8458ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom
8569b15fb098162f19a4c20e6dccdcead04d9c77f0Brian Carlstrom  // Starts a runtime, which may cause threads to be started and code to run.
8669b15fb098162f19a4c20e6dccdcead04d9c77f0Brian Carlstrom  void Start();
872ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro
8858ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  bool IsStarted() const;
89dcc247493fd8fb243e335c3ec08e5e625896a47cElliott Hughes
902ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro  static Runtime* Current() {
912ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro    return instance_;
922ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro  }
9361e019d291583029c01b61b93bea750f2b663c37Carl Shapiro
9461e019d291583029c01b61b93bea750f2b663c37Carl Shapiro  // Compiles a dex file.
9561e019d291583029c01b61b93bea750f2b663c37Carl Shapiro  static void Compile(const StringPiece& filename);
961fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
97ffe6736397d17457188727510f0a2953f69a383aElliott Hughes  // Aborts semi-cleanly. Used in the implementation of LOG(FATAL), which most
98ffe6736397d17457188727510f0a2953f69a383aElliott Hughes  // callers should prefer.
99ffe6736397d17457188727510f0a2953f69a383aElliott Hughes  // This isn't marked ((noreturn)) because then gcc will merge multiple calls
100ffe6736397d17457188727510f0a2953f69a383aElliott Hughes  // in a single function together. This reduces code size slightly, but means
101ffe6736397d17457188727510f0a2953f69a383aElliott Hughes  // that the native stack trace we get may point at the wrong call site.
102ffe6736397d17457188727510f0a2953f69a383aElliott Hughes  static void Abort(const char* file, int line);
103ffe6736397d17457188727510f0a2953f69a383aElliott Hughes
10461e019d291583029c01b61b93bea750f2b663c37Carl Shapiro  // Attaches the current native thread to the runtime.
1055fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes  void AttachCurrentThread(const char* name, bool as_daemon);
106b557353b22c728eecbd1c68593b482622c7782a8Carl Shapiro
107bf86d0438e9ef9c145ebcf16a2e74c4efaa2686aElliott Hughes  void CallExitHook(jint status);
108bf86d0438e9ef9c145ebcf16a2e74c4efaa2686aElliott Hughes
10961e019d291583029c01b61b93bea750f2b663c37Carl Shapiro  // Detaches the current native thread from the runtime.
110d92bec457dc6c506c80e9da6b8e0c958266b5cdcElliott Hughes  void DetachCurrentThread();
11161e019d291583029c01b61b93bea750f2b663c37Carl Shapiro
1128daa0929f08a3080ea64dbd4e997e72f411e6fc9Elliott Hughes  void Dump(std::ostream& os);
113e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes
11461e019d291583029c01b61b93bea750f2b663c37Carl Shapiro  ~Runtime();
115b557353b22c728eecbd1c68593b482622c7782a8Carl Shapiro
1167ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes  const std::string& GetBootClassPath() const {
1177ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes    return boot_class_path_;
118b765be0d656c3073402693aeaf64e95a0e49f218Brian Carlstrom  }
119b765be0d656c3073402693aeaf64e95a0e49f218Brian Carlstrom
120b765be0d656c3073402693aeaf64e95a0e49f218Brian Carlstrom  ClassLinker* GetClassLinker() const {
1217a90959d4ef7a69f3bcb7b8763f646e12d9267d3Carl Shapiro    return class_linker_;
1227a90959d4ef7a69f3bcb7b8763f646e12d9267d3Carl Shapiro  }
1237a90959d4ef7a69f3bcb7b8763f646e12d9267d3Carl Shapiro
1247ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes  const std::string& GetClassPath() const {
1257ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes    return class_path_;
1267ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes  }
1277ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes
1287ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes  size_t GetDefaultStackSize() const {
1297ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes    return default_stack_size_;
1307ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes  }
1317ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes
132cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes  InternTable* GetInternTable() const {
133cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes    return intern_table_;
134cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes  }
135cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes
1360af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes  JavaVMExt* GetJavaVM() const {
137c5f7c91ab89055cffb573fff7e06dbdd860bccedElliott Hughes    return java_vm_;
138f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes  }
139f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes
1407ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes  const std::vector<std::string>& GetProperties() const {
1417ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes    return properties_;
1427ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes  }
1437ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes
144c33a32bccc4c66ed82ce3a580b16636399385cb4Elliott Hughes  MonitorList* GetMonitorList() const {
145c33a32bccc4c66ed82ce3a580b16636399385cb4Elliott Hughes    return monitor_list_;
146c33a32bccc4c66ed82ce3a580b16636399385cb4Elliott Hughes  }
147c33a32bccc4c66ed82ce3a580b16636399385cb4Elliott Hughes
148d92bec457dc6c506c80e9da6b8e0c958266b5cdcElliott Hughes  ThreadList* GetThreadList() const {
149d92bec457dc6c506c80e9da6b8e0c958266b5cdcElliott Hughes    return thread_list_;
150d92bec457dc6c506c80e9da6b8e0c958266b5cdcElliott Hughes  }
151d92bec457dc6c506c80e9da6b8e0c958266b5cdcElliott Hughes
1527ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes  const char* GetVersion() const {
1537ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes    return "2.0.0";
1547ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes  }
1557ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes
156410c0c876f326e14c176a39ba21fc4dd3f7db8abElliott Hughes  void VisitRoots(Heap::RootVisitor* visitor, void* arg) const;
1571f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom
158e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom  bool HasJniStubArray() const;
159e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom  ByteArray* GetJniStubArray() const;
160e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom  void SetJniStubArray(ByteArray* jni_stub_array);
161ff1ed4770bf7ff024a807b9f909b1a26abb78341Ian Rogers
162e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom  bool HasAbstractMethodErrorStubArray() const;
163e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom  ByteArray* GetAbstractMethodErrorStubArray() const;
164e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom  void SetAbstractMethodErrorStubArray(ByteArray* abstract_method_error_stub_array);
165ff1ed4770bf7ff024a807b9f909b1a26abb78341Ian Rogers
1661cb0a1dfc32531c79a968aeac26ccb5525862497Ian Rogers  enum TrampolineType {
1671cb0a1dfc32531c79a968aeac26ccb5525862497Ian Rogers    kInstanceMethod,
1681cb0a1dfc32531c79a968aeac26ccb5525862497Ian Rogers    kStaticMethod,
1691cb0a1dfc32531c79a968aeac26ccb5525862497Ian Rogers    kUnknownMethod,
1704f0d07c783afef89703dce32c94440fc8621a29bIan Rogers    kLastTrampolineMethodType  // Value used for iteration
1711cb0a1dfc32531c79a968aeac26ccb5525862497Ian Rogers  };
1721cb0a1dfc32531c79a968aeac26ccb5525862497Ian Rogers  static TrampolineType GetTrampolineType(Method* method);
1731cb0a1dfc32531c79a968aeac26ccb5525862497Ian Rogers  bool HasResolutionStubArray(TrampolineType type) const;
1741cb0a1dfc32531c79a968aeac26ccb5525862497Ian Rogers  ByteArray* GetResolutionStubArray(TrampolineType type) const;
1751cb0a1dfc32531c79a968aeac26ccb5525862497Ian Rogers  void SetResolutionStubArray(ByteArray* resolution_stub_array, TrampolineType type);
176ad25ac568407ceb14334e8551dd1c4dd0fd6993cIan Rogers
177ff1ed4770bf7ff024a807b9f909b1a26abb78341Ian Rogers  // Returns a special method that describes all callee saves being spilled to the stack.
1784f0d07c783afef89703dce32c94440fc8621a29bIan Rogers  enum CalleeSaveType {
1794f0d07c783afef89703dce32c94440fc8621a29bIan Rogers    kSaveAll,
1804f0d07c783afef89703dce32c94440fc8621a29bIan Rogers    kRefsOnly,
1814f0d07c783afef89703dce32c94440fc8621a29bIan Rogers    kRefsAndArgs,
1824f0d07c783afef89703dce32c94440fc8621a29bIan Rogers    kLastCalleeSaveType  // Value used for iteration
1834f0d07c783afef89703dce32c94440fc8621a29bIan Rogers  };
1844f0d07c783afef89703dce32c94440fc8621a29bIan Rogers  Method* CreateCalleeSaveMethod(InstructionSet insns, CalleeSaveType type);
1854f0d07c783afef89703dce32c94440fc8621a29bIan Rogers  bool HasCalleeSaveMethod(CalleeSaveType type) const;
1864f0d07c783afef89703dce32c94440fc8621a29bIan Rogers  Method* GetCalleeSaveMethod(CalleeSaveType type) const;
1874f0d07c783afef89703dce32c94440fc8621a29bIan Rogers  void SetCalleeSaveMethod(Method* method, CalleeSaveType type);
1884f0d07c783afef89703dce32c94440fc8621a29bIan Rogers
1894f0d07c783afef89703dce32c94440fc8621a29bIan Rogers  Method* CreateRefOnlyCalleeSaveMethod(InstructionSet insns);
1904f0d07c783afef89703dce32c94440fc8621a29bIan Rogers  Method* CreateRefAndArgsCalleeSaveMethod(InstructionSet insns);
191ff1ed4770bf7ff024a807b9f909b1a26abb78341Ian Rogers
1929d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  int32_t GetStat(int kind);
1939d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
1949d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  RuntimeStats* GetStats();
1959d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
1969d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  bool HasStatsEnabled() const {
1979d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes    return stats_enabled_;
1989d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  }
1999d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
2009d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  void ResetStats(int kinds);
2019d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
2029d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  void SetStatsEnabled(bool new_state);
2039d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
204b557353b22c728eecbd1c68593b482622c7782a8Carl Shapiro private:
205ffe6736397d17457188727510f0a2953f69a383aElliott Hughes  static void PlatformAbort(const char*, int);
206ffe6736397d17457188727510f0a2953f69a383aElliott Hughes
207dcc247493fd8fb243e335c3ec08e5e625896a47cElliott Hughes  Runtime();
20861e019d291583029c01b61b93bea750f2b663c37Carl Shapiro
209c1674ed06662420213441ff2b818f2f71f9098dcElliott Hughes  void BlockSignals();
210c1674ed06662420213441ff2b818f2f71f9098dcElliott Hughes
2118a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom  bool Init(const Options& options, bool ignore_unrecognized);
212038a806df72f884d22283a84a31c9a1d35ba1fdfElliott Hughes  void InitNativeMethods();
213ad7c2a3b4daa2abd707375444f4b0db7d69a3838Elliott Hughes  void RegisterRuntimeNativeMethods(JNIEnv*);
21485d1545e985ac689db4bad7849880e843707c862Elliott Hughes  void StartDaemonThreads();
21561e019d291583029c01b61b93bea750f2b663c37Carl Shapiro
2160a5b14de5115f51e0ed2dd6c3fcc5b84bbce690eBrian Carlstrom  bool verbose_startup_;
2179ca7a1fdd0daa546b790adb6a24dbc13c22df76aElliott Hughes  bool is_zygote_;
2180a5b14de5115f51e0ed2dd6c3fcc5b84bbce690eBrian Carlstrom
21958ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  // The host prefix is used during cross compilation. It is removed
22058ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  // from the start of host paths such as:
22158ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  //    $ANDROID_PRODUCT_OUT/system/framework/core.oat
22234f426c49ac2de8cea70acef6b9ecdd8e62209d2Brian Carlstrom  // to produce target paths such as
22358ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  //    /system/framework/core.oat
22458ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  // Similarly it is prepended to target paths to arrive back at a
22558ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  // host past. In both cases this is necessary because image and oat
22658ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  // files embedded expect paths of dependent files (an image points
22758ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  // to an oat file and an oat files to one or more dex files). These
22858ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  // files contain the expected target path.
22958ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  std::string host_prefix_;
23058ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom
2317ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes  std::string boot_class_path_;
2327ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes  std::string class_path_;
2337ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes  std::vector<std::string> properties_;
2347ede61eceed2f8da14a4fff05c57c748c160d57fElliott Hughes
235b765be0d656c3073402693aeaf64e95a0e49f218Brian Carlstrom  // The default stack size for managed threads created by the runtime.
236be759c63c6bb58b76ac71cad2c5a736bd31f374dElliott Hughes  size_t default_stack_size_;
237b765be0d656c3073402693aeaf64e95a0e49f218Brian Carlstrom
238c33a32bccc4c66ed82ce3a580b16636399385cb4Elliott Hughes  MonitorList* monitor_list_;
239c33a32bccc4c66ed82ce3a580b16636399385cb4Elliott Hughes
240b557353b22c728eecbd1c68593b482622c7782a8Carl Shapiro  ThreadList* thread_list_;
24161e019d291583029c01b61b93bea750f2b663c37Carl Shapiro
242cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes  InternTable* intern_table_;
243cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes
244b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  ClassLinker* class_linker_;
245b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom
246e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes  SignalCatcher* signal_catcher_;
247e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes
248c5f7c91ab89055cffb573fff7e06dbdd860bccedElliott Hughes  JavaVMExt* java_vm_;
249f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes
250161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom  ByteArray* jni_stub_array_;
251161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom
252e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom  ByteArray* abstract_method_error_stub_array_;
253e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom
2544f0d07c783afef89703dce32c94440fc8621a29bIan Rogers  ByteArray* resolution_stub_array_[kLastTrampolineMethodType];
255ad25ac568407ceb14334e8551dd1c4dd0fd6993cIan Rogers
2564f0d07c783afef89703dce32c94440fc8621a29bIan Rogers  Method* callee_save_method_[kLastCalleeSaveType];
257ff1ed4770bf7ff024a807b9f909b1a26abb78341Ian Rogers
258aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  // As returned by ClassLoader.getSystemClassLoader()
259aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  ClassLoader* system_class_loader_;
260aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom
261dcc247493fd8fb243e335c3ec08e5e625896a47cElliott Hughes  bool started_;
262dcc247493fd8fb243e335c3ec08e5e625896a47cElliott Hughes
2636ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom  // Hooks supported by JNI_CreateJavaVM
2646ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom  jint (*vfprintf_)(FILE* stream, const char* format, va_list ap);
2656ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom  void (*exit_)(jint status);
2666ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom  void (*abort_)();
2676ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom
2689d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  bool stats_enabled_;
2699d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  RuntimeStats stats_;
2709d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
2712ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro  // A pointer to the active runtime or NULL.
2722ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro  static Runtime* instance_;
2732ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro
27461e019d291583029c01b61b93bea750f2b663c37Carl Shapiro  DISALLOW_COPY_AND_ASSIGN(Runtime);
2757b21670581d13db32f1384a3b2692bcfc8f57320Carl Shapiro};
2767b21670581d13db32f1384a3b2692bcfc8f57320Carl Shapiro
2776b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapiro}  // namespace art
2787b21670581d13db32f1384a3b2692bcfc8f57320Carl Shapiro
2791fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro#endif  // ART_SRC_RUNTIME_H_
280