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