runtime.h revision be759c63c6bb58b76ac71cad2c5a736bd31f374d
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
151f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom#include "heap.h"
16578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "globals.h"
17578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "macros.h"
18578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "stringpiece.h"
1944753c3908fcd5ccc066bf0dceddeabfeacf9f24Brian Carlstrom#include "unordered_set.h"
20b557353b22c728eecbd1c68593b482622c7782a8Carl Shapiro
216b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapironamespace art {
227b21670581d13db32f1384a3b2692bcfc8f57320Carl Shapiro
2361e019d291583029c01b61b93bea750f2b663c37Carl Shapiroclass ClassLinker;
24fc322c72d7a89a6f7a05c8bdc232d780aecd9232Carl Shapiroclass DexFile;
2561e019d291583029c01b61b93bea750f2b663c37Carl Shapiroclass Heap;
26cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughesclass InternTable;
27c5f7c91ab89055cffb573fff7e06dbdd860bccedElliott Hughesclass JavaVMExt;
28e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughesclass SignalCatcher;
296ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstromclass String;
3061e019d291583029c01b61b93bea750f2b663c37Carl Shapiroclass ThreadList;
3161e019d291583029c01b61b93bea750f2b663c37Carl Shapiro
321fb8620309a4e94d11879aabc33364acfa733904Carl Shapiroclass Runtime {
337b21670581d13db32f1384a3b2692bcfc8f57320Carl Shapiro public:
348a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom
358a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom  typedef std::vector<std::pair<StringPiece, const void*> > Options;
368a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom
378a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom  class ParsedOptions {
388a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom   public:
396ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom    // returns null if problem parsing and ignore_unrecognized is false
406ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom    static ParsedOptions* Create(const Options& options, bool ignore_unrecognized);
418a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom
429ea1cb1a22be5b85dc2622e3836c46a1c48e3f25Brian Carlstrom    std::vector<const DexFile*> boot_class_path_;
4369b15fb098162f19a4c20e6dccdcead04d9c77f0Brian Carlstrom    std::vector<const DexFile*> class_path_;
448a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom    const char* boot_image_;
4569b15fb098162f19a4c20e6dccdcead04d9c77f0Brian Carlstrom    std::vector<const char*> images_;
46515a5bc89282d6f910cae4d5852bb77124a47825Elliott Hughes    bool check_jni_;
47a09576416788b916095739e43a16917e7948f3a4Elliott Hughes    std::string jni_trace_;
488a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom    size_t heap_initial_size_;
498a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom    size_t heap_maximum_size_;
50f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom    size_t stack_size_;
516ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom    jint (*hook_vfprintf_)(FILE* stream, const char* format, va_list ap);
526ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom    void (*hook_exit_)(jint status);
536ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom    void (*hook_abort_)();
5444753c3908fcd5ccc066bf0dceddeabfeacf9f24Brian Carlstrom    std::tr1::unordered_set<std::string> verbose_;
556ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom    std::vector<std::string> properties_;
566ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom
57a09576416788b916095739e43a16917e7948f3a4Elliott Hughes    bool IsVerbose(const std::string& key) const {
58a09576416788b916095739e43a16917e7948f3a4Elliott Hughes      return verbose_.find(key) != verbose_.end();
59a09576416788b916095739e43a16917e7948f3a4Elliott Hughes    }
60a09576416788b916095739e43a16917e7948f3a4Elliott Hughes
616ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom   private:
620cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers    ParsedOptions() {}
638a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom  };
642ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro
6561e019d291583029c01b61b93bea750f2b663c37Carl Shapiro  // Creates and initializes a new runtime.
662ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro  static Runtime* Create(const Options& options, bool ignore_unrecognized);
6769b15fb098162f19a4c20e6dccdcead04d9c77f0Brian Carlstrom
6869b15fb098162f19a4c20e6dccdcead04d9c77f0Brian Carlstrom  // Starts a runtime, which may cause threads to be started and code to run.
6969b15fb098162f19a4c20e6dccdcead04d9c77f0Brian Carlstrom  void Start();
702ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro
71dcc247493fd8fb243e335c3ec08e5e625896a47cElliott Hughes  bool IsStarted();
72dcc247493fd8fb243e335c3ec08e5e625896a47cElliott Hughes
732ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro  static Runtime* Current() {
742ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro    return instance_;
752ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro  }
7661e019d291583029c01b61b93bea750f2b663c37Carl Shapiro
7761e019d291583029c01b61b93bea750f2b663c37Carl Shapiro  // Compiles a dex file.
7861e019d291583029c01b61b93bea750f2b663c37Carl Shapiro  static void Compile(const StringPiece& filename);
791fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
80ffe6736397d17457188727510f0a2953f69a383aElliott Hughes  // Aborts semi-cleanly. Used in the implementation of LOG(FATAL), which most
81ffe6736397d17457188727510f0a2953f69a383aElliott Hughes  // callers should prefer.
82ffe6736397d17457188727510f0a2953f69a383aElliott Hughes  // This isn't marked ((noreturn)) because then gcc will merge multiple calls
83ffe6736397d17457188727510f0a2953f69a383aElliott Hughes  // in a single function together. This reduces code size slightly, but means
84ffe6736397d17457188727510f0a2953f69a383aElliott Hughes  // that the native stack trace we get may point at the wrong call site.
85ffe6736397d17457188727510f0a2953f69a383aElliott Hughes  static void Abort(const char* file, int line);
86ffe6736397d17457188727510f0a2953f69a383aElliott Hughes
8761e019d291583029c01b61b93bea750f2b663c37Carl Shapiro  // Attaches the current native thread to the runtime.
885fe594f576225dd7d333835e39c448a71ea9b433Elliott Hughes  void AttachCurrentThread(const char* name, bool as_daemon);
89b557353b22c728eecbd1c68593b482622c7782a8Carl Shapiro
90bf86d0438e9ef9c145ebcf16a2e74c4efaa2686aElliott Hughes  void CallExitHook(jint status);
91bf86d0438e9ef9c145ebcf16a2e74c4efaa2686aElliott Hughes
9261e019d291583029c01b61b93bea750f2b663c37Carl Shapiro  // Detaches the current native thread from the runtime.
93d92bec457dc6c506c80e9da6b8e0c958266b5cdcElliott Hughes  void DetachCurrentThread();
9461e019d291583029c01b61b93bea750f2b663c37Carl Shapiro
95e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes  void DumpStatistics(std::ostream& os);
96e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes
9761e019d291583029c01b61b93bea750f2b663c37Carl Shapiro  ~Runtime();
98b557353b22c728eecbd1c68593b482622c7782a8Carl Shapiro
99be759c63c6bb58b76ac71cad2c5a736bd31f374dElliott Hughes  size_t GetDefaultStackSize() const {
100be759c63c6bb58b76ac71cad2c5a736bd31f374dElliott Hughes    return default_stack_size_;
101b765be0d656c3073402693aeaf64e95a0e49f218Brian Carlstrom  }
102b765be0d656c3073402693aeaf64e95a0e49f218Brian Carlstrom
103b765be0d656c3073402693aeaf64e95a0e49f218Brian Carlstrom  ClassLinker* GetClassLinker() const {
1047a90959d4ef7a69f3bcb7b8763f646e12d9267d3Carl Shapiro    return class_linker_;
1057a90959d4ef7a69f3bcb7b8763f646e12d9267d3Carl Shapiro  }
1067a90959d4ef7a69f3bcb7b8763f646e12d9267d3Carl Shapiro
107cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes  InternTable* GetInternTable() const {
108cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes    return intern_table_;
109cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes  }
110cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes
1110af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes  JavaVMExt* GetJavaVM() const {
112c5f7c91ab89055cffb573fff7e06dbdd860bccedElliott Hughes    return java_vm_;
113f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes  }
114f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes
115d92bec457dc6c506c80e9da6b8e0c958266b5cdcElliott Hughes  ThreadList* GetThreadList() const {
116d92bec457dc6c506c80e9da6b8e0c958266b5cdcElliott Hughes    return thread_list_;
117d92bec457dc6c506c80e9da6b8e0c958266b5cdcElliott Hughes  }
118d92bec457dc6c506c80e9da6b8e0c958266b5cdcElliott Hughes
119410c0c876f326e14c176a39ba21fc4dd3f7db8abElliott Hughes  void VisitRoots(Heap::RootVisitor* visitor, void* arg) const;
1201f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom
121b557353b22c728eecbd1c68593b482622c7782a8Carl Shapiro private:
122ffe6736397d17457188727510f0a2953f69a383aElliott Hughes  static void PlatformAbort(const char*, int);
123ffe6736397d17457188727510f0a2953f69a383aElliott Hughes
124dcc247493fd8fb243e335c3ec08e5e625896a47cElliott Hughes  Runtime();
12561e019d291583029c01b61b93bea750f2b663c37Carl Shapiro
126c1674ed06662420213441ff2b818f2f71f9098dcElliott Hughes  void BlockSignals();
127c1674ed06662420213441ff2b818f2f71f9098dcElliott Hughes
1288a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom  bool Init(const Options& options, bool ignore_unrecognized);
129ad7c2a3b4daa2abd707375444f4b0db7d69a3838Elliott Hughes  void InitLibraries();
130ad7c2a3b4daa2abd707375444f4b0db7d69a3838Elliott Hughes  void RegisterRuntimeNativeMethods(JNIEnv*);
13161e019d291583029c01b61b93bea750f2b663c37Carl Shapiro
132b765be0d656c3073402693aeaf64e95a0e49f218Brian Carlstrom  // The default stack size for managed threads created by the runtime.
133be759c63c6bb58b76ac71cad2c5a736bd31f374dElliott Hughes  size_t default_stack_size_;
134b765be0d656c3073402693aeaf64e95a0e49f218Brian Carlstrom
135b557353b22c728eecbd1c68593b482622c7782a8Carl Shapiro  ThreadList* thread_list_;
13661e019d291583029c01b61b93bea750f2b663c37Carl Shapiro
137cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes  InternTable* intern_table_;
138cf4c6c41b0084dc4567ff709fb8ce9ebd72b26acElliott Hughes
139b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  ClassLinker* class_linker_;
140b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom
141e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes  SignalCatcher* signal_catcher_;
142e27955ca3ca960928d4dbd6cb79711fce06950b3Elliott Hughes
143c5f7c91ab89055cffb573fff7e06dbdd860bccedElliott Hughes  JavaVMExt* java_vm_;
144f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes
145dcc247493fd8fb243e335c3ec08e5e625896a47cElliott Hughes  bool started_;
146dcc247493fd8fb243e335c3ec08e5e625896a47cElliott Hughes
1476ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom  // Hooks supported by JNI_CreateJavaVM
1486ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom  jint (*vfprintf_)(FILE* stream, const char* format, va_list ap);
1496ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom  void (*exit_)(jint status);
1506ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom  void (*abort_)();
1516ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom
1522ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro  // A pointer to the active runtime or NULL.
1532ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro  static Runtime* instance_;
1542ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro
15561e019d291583029c01b61b93bea750f2b663c37Carl Shapiro  DISALLOW_COPY_AND_ASSIGN(Runtime);
1567b21670581d13db32f1384a3b2692bcfc8f57320Carl Shapiro};
1577b21670581d13db32f1384a3b2692bcfc8f57320Carl Shapiro
1586b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapiro}  // namespace art
1597b21670581d13db32f1384a3b2692bcfc8f57320Carl Shapiro
1601fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro#endif  // ART_SRC_RUNTIME_H_
161