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