runtime.h revision c5f7c91ab89055cffb573fff7e06dbdd860bcced
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 86ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom#include <string> 9fc322c72d7a89a6f7a05c8bdc232d780aecd9232Carl Shapiro#include <utility> 106ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom#include <vector> 11578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom 12c5f7c91ab89055cffb573fff7e06dbdd860bccedElliott Hughes#include <jni.h> 13c5f7c91ab89055cffb573fff7e06dbdd860bccedElliott Hughes 14578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "globals.h" 15578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "macros.h" 16f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes#include "scoped_ptr.h" 17578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "stringpiece.h" 1844753c3908fcd5ccc066bf0dceddeabfeacf9f24Brian Carlstrom#include "unordered_set.h" 19b557353b22c728eecbd1c68593b482622c7782a8Carl Shapiro 206b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapironamespace art { 217b21670581d13db32f1384a3b2692bcfc8f57320Carl Shapiro 2261e019d291583029c01b61b93bea750f2b663c37Carl Shapiroclass ClassLinker; 23fc322c72d7a89a6f7a05c8bdc232d780aecd9232Carl Shapiroclass DexFile; 2461e019d291583029c01b61b93bea750f2b663c37Carl Shapiroclass Heap; 25c5f7c91ab89055cffb573fff7e06dbdd860bccedElliott Hughesclass JavaVMExt; 266ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstromclass String; 2761e019d291583029c01b61b93bea750f2b663c37Carl Shapiroclass ThreadList; 2861e019d291583029c01b61b93bea750f2b663c37Carl Shapiro 291fb8620309a4e94d11879aabc33364acfa733904Carl Shapiroclass Runtime { 307b21670581d13db32f1384a3b2692bcfc8f57320Carl Shapiro public: 318a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom 328a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom typedef std::vector<std::pair<StringPiece, const void*> > Options; 338a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom 348a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom class ParsedOptions { 358a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom public: 366ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom // returns null if problem parsing and ignore_unrecognized is false 376ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom static ParsedOptions* Create(const Options& options, bool ignore_unrecognized); 388a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom 398a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom std::vector<DexFile*> boot_class_path_; 408a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom const char* boot_image_; 41515a5bc89282d6f910cae4d5852bb77124a47825Elliott Hughes bool check_jni_; 428a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom size_t heap_initial_size_; 438a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom size_t heap_maximum_size_; 44f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom size_t stack_size_; 456ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom jint (*hook_vfprintf_)(FILE* stream, const char* format, va_list ap); 466ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom void (*hook_exit_)(jint status); 476ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom void (*hook_abort_)(); 4844753c3908fcd5ccc066bf0dceddeabfeacf9f24Brian Carlstrom std::tr1::unordered_set<std::string> verbose_; 496ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom std::vector<std::string> properties_; 506ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom 516ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom private: 526ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom ParsedOptions() {}; 538a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom }; 542ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro 5561e019d291583029c01b61b93bea750f2b663c37Carl Shapiro // Creates and initializes a new runtime. 562ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro static Runtime* Create(const Options& options, bool ignore_unrecognized); 578a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom static Runtime* Create(const std::vector<const DexFile*>& boot_class_path); 582ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro 592ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro static Runtime* Current() { 602ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro return instance_; 612ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro } 6261e019d291583029c01b61b93bea750f2b663c37Carl Shapiro 6361e019d291583029c01b61b93bea750f2b663c37Carl Shapiro // Compiles a dex file. 6461e019d291583029c01b61b93bea750f2b663c37Carl Shapiro static void Compile(const StringPiece& filename); 651fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro 66ffe6736397d17457188727510f0a2953f69a383aElliott Hughes // Aborts semi-cleanly. Used in the implementation of LOG(FATAL), which most 67ffe6736397d17457188727510f0a2953f69a383aElliott Hughes // callers should prefer. 68ffe6736397d17457188727510f0a2953f69a383aElliott Hughes // This isn't marked ((noreturn)) because then gcc will merge multiple calls 69ffe6736397d17457188727510f0a2953f69a383aElliott Hughes // in a single function together. This reduces code size slightly, but means 70ffe6736397d17457188727510f0a2953f69a383aElliott Hughes // that the native stack trace we get may point at the wrong call site. 71ffe6736397d17457188727510f0a2953f69a383aElliott Hughes static void Abort(const char* file, int line); 72ffe6736397d17457188727510f0a2953f69a383aElliott Hughes 7361e019d291583029c01b61b93bea750f2b663c37Carl Shapiro // Attaches the current native thread to the runtime. 7440ef99eb9dd91c2fa549f40973964529c927bb3cElliott Hughes bool AttachCurrentThread(const char* name, JNIEnv** jni_env); 7540ef99eb9dd91c2fa549f40973964529c927bb3cElliott Hughes bool AttachCurrentThreadAsDaemon(const char* name, JNIEnv** jni_env); 76b557353b22c728eecbd1c68593b482622c7782a8Carl Shapiro 7761e019d291583029c01b61b93bea750f2b663c37Carl Shapiro // Detaches the current native thread from the runtime. 7861e019d291583029c01b61b93bea750f2b663c37Carl Shapiro bool DetachCurrentThread(); 7961e019d291583029c01b61b93bea750f2b663c37Carl Shapiro 8061e019d291583029c01b61b93bea750f2b663c37Carl Shapiro ~Runtime(); 81b557353b22c728eecbd1c68593b482622c7782a8Carl Shapiro 82b765be0d656c3073402693aeaf64e95a0e49f218Brian Carlstrom size_t GetStackSize() const { 83b765be0d656c3073402693aeaf64e95a0e49f218Brian Carlstrom return stack_size_; 84b765be0d656c3073402693aeaf64e95a0e49f218Brian Carlstrom } 85b765be0d656c3073402693aeaf64e95a0e49f218Brian Carlstrom 86b765be0d656c3073402693aeaf64e95a0e49f218Brian Carlstrom ClassLinker* GetClassLinker() const { 877a90959d4ef7a69f3bcb7b8763f646e12d9267d3Carl Shapiro return class_linker_; 887a90959d4ef7a69f3bcb7b8763f646e12d9267d3Carl Shapiro } 897a90959d4ef7a69f3bcb7b8763f646e12d9267d3Carl Shapiro 900af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes JavaVMExt* GetJavaVM() const { 91c5f7c91ab89055cffb573fff7e06dbdd860bccedElliott Hughes return java_vm_; 92f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes } 93f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes 94b557353b22c728eecbd1c68593b482622c7782a8Carl Shapiro private: 95ffe6736397d17457188727510f0a2953f69a383aElliott Hughes static void PlatformAbort(const char*, int); 96ffe6736397d17457188727510f0a2953f69a383aElliott Hughes 97b765be0d656c3073402693aeaf64e95a0e49f218Brian Carlstrom Runtime() : stack_size_(0), thread_list_(NULL), class_linker_(NULL) {} 9861e019d291583029c01b61b93bea750f2b663c37Carl Shapiro 9961e019d291583029c01b61b93bea750f2b663c37Carl Shapiro // Initializes a new uninitialized runtime. 1008a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom bool Init(const Options& options, bool ignore_unrecognized); 10161e019d291583029c01b61b93bea750f2b663c37Carl Shapiro 102b765be0d656c3073402693aeaf64e95a0e49f218Brian Carlstrom // The default stack size for managed threads created by the runtime. 103b765be0d656c3073402693aeaf64e95a0e49f218Brian Carlstrom size_t stack_size_; 104b765be0d656c3073402693aeaf64e95a0e49f218Brian Carlstrom 105b557353b22c728eecbd1c68593b482622c7782a8Carl Shapiro ThreadList* thread_list_; 10661e019d291583029c01b61b93bea750f2b663c37Carl Shapiro 107b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom ClassLinker* class_linker_; 108b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom 109c5f7c91ab89055cffb573fff7e06dbdd860bccedElliott Hughes JavaVMExt* java_vm_; 110f2682d5a6ce0f7de58da8fd4ec8aec200c43b92eElliott Hughes 1116ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom // Hooks supported by JNI_CreateJavaVM 1126ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom jint (*vfprintf_)(FILE* stream, const char* format, va_list ap); 1136ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom void (*exit_)(jint status); 1146ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom void (*abort_)(); 1156ea095ad30bf13cc00b4fee7afbbe4731a349c83Brian Carlstrom 1162ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro // A pointer to the active runtime or NULL. 1172ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro static Runtime* instance_; 1182ed144c2b49ae1da6c464d7a1be0062870530802Carl Shapiro 11961e019d291583029c01b61b93bea750f2b663c37Carl Shapiro DISALLOW_COPY_AND_ASSIGN(Runtime); 1207b21670581d13db32f1384a3b2692bcfc8f57320Carl Shapiro}; 1217b21670581d13db32f1384a3b2692bcfc8f57320Carl Shapiro 1226b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapiro} // namespace art 1237b21670581d13db32f1384a3b2692bcfc8f57320Carl Shapiro 1241fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro#endif // ART_SRC_RUNTIME_H_ 125