| // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| #ifndef RUNTIME_VM_DART_H_ | |
| #define RUNTIME_VM_DART_H_ | |
| #include "include/dart_api.h" | |
| #include "include/dart_tools_api.h" | |
| #include "vm/allocation.h" | |
| #include "vm/isolate.h" | |
| #include "vm/lockers.h" | |
| #include "vm/os_thread.h" | |
| #include "vm/snapshot.h" | |
| namespace dart { | |
| // Forward declarations. | |
| class Isolate; | |
| class LocalHandle; | |
| class ThreadPool; | |
| namespace kernel { | |
| class Program; | |
| } | |
| class Dart : public AllStatic { | |
| public: | |
| // Returns null if initialization succeeds, otherwise returns an error message | |
| // (caller owns error message and has to free it). | |
| static char* Init(const Dart_InitializeParams* params); | |
| // Returns null if cleanup succeeds, otherwise returns an error message | |
| // (caller owns error message and has to free it). | |
| static char* Cleanup(); | |
| // Returns true if the VM is initialized. | |
| static bool IsInitialized(); | |
| static bool IsShuttingDown(); | |
| // Used to Indicate that a Dart API call is active. | |
| static bool SetActiveApiCall(); | |
| static void ResetActiveApiCall(); | |
| static Isolate* CreateIsolate(const char* name_prefix, | |
| const Dart_IsolateFlags& api_flags, | |
| IsolateGroup* isolate_group); | |
| // Initialize an isolate group either from a snapshot or from a Kernel binary. | |
| // On success, returns nullptr. On failure, returns an error message that the | |
| // caller must free. | |
| static char* InitializeIsolateGroup(Thread* T, | |
| const uint8_t* snapshot_data, | |
| const uint8_t* snapshot_text, | |
| const uint8_t* kernel_buffer, | |
| intptr_t kernel_buffer_size); | |
| static char* InitIsolateGroupFromSnapshot(Thread* T, | |
| const uint8_t* snapshot_data, | |
| const uint8_t* snapshot_text, | |
| const uint8_t* kernel_buffer, | |
| intptr_t kernel_buffer_size); | |
| static ErrorPtr InitializeIsolate(Thread* T, | |
| bool is_first_isolate_in_group, | |
| void* isolate_data); | |
| static void RunShutdownCallback(); | |
| static void ShutdownIsolate(Thread* T); | |
| static ThreadPool* thread_pool() { return thread_pool_; } | |
| static int64_t UptimeMicros(); | |
| static int64_t UptimeMillis() { | |
| return UptimeMicros() / kMicrosecondsPerMillisecond; | |
| } | |
| // The returned string has to be free()ed. | |
| static char* FeaturesString(IsolateGroup* isolate_group, Snapshot::Kind kind); | |
| static Dart_ThreadStartCallback thread_start_callback() { | |
| return thread_start_callback_; | |
| } | |
| static void set_thread_start_callback(Dart_ThreadStartCallback cback) { | |
| thread_start_callback_ = cback; | |
| } | |
| static Dart_ThreadExitCallback thread_exit_callback() { | |
| return thread_exit_callback_; | |
| } | |
| static void set_thread_exit_callback(Dart_ThreadExitCallback cback) { | |
| thread_exit_callback_ = cback; | |
| } | |
| static void SetFileCallbacks(Dart_FileOpenCallback file_open, | |
| Dart_FileReadCallback file_read, | |
| Dart_FileWriteCallback file_write, | |
| Dart_FileCloseCallback file_close) { | |
| file_open_callback_ = file_open; | |
| file_read_callback_ = file_read; | |
| file_write_callback_ = file_write; | |
| file_close_callback_ = file_close; | |
| } | |
| static Dart_FileOpenCallback file_open_callback() { | |
| return file_open_callback_; | |
| } | |
| static Dart_FileReadCallback file_read_callback() { | |
| return file_read_callback_; | |
| } | |
| static Dart_FileWriteCallback file_write_callback() { | |
| return file_write_callback_; | |
| } | |
| static Dart_FileCloseCallback file_close_callback() { | |
| return file_close_callback_; | |
| } | |
| static void set_entropy_source_callback(Dart_EntropySource entropy_source) { | |
| entropy_source_callback_ = entropy_source; | |
| } | |
| static Dart_EntropySource entropy_source_callback() { | |
| return entropy_source_callback_; | |
| } | |
| static void set_dwarf_stacktrace_footnote_callback( | |
| Dart_DwarfStackTraceFootnoteCallback cb) { | |
| dwarf_stacktrace_footnote_callback_ = cb; | |
| } | |
| static Dart_DwarfStackTraceFootnoteCallback | |
| dwarf_stacktrace_footnote_callback() { | |
| return dwarf_stacktrace_footnote_callback_; | |
| } | |
| private: | |
| static char* DartInit(const Dart_InitializeParams* params); | |
| static constexpr const char* kVmIsolateName = "vm-isolate"; | |
| static void WaitForIsolateShutdown(); | |
| static void WaitForApplicationIsolateShutdown(); | |
| static int64_t start_time_micros_; | |
| static ThreadPool* thread_pool_; | |
| static Dart_ThreadStartCallback thread_start_callback_; | |
| static Dart_ThreadExitCallback thread_exit_callback_; | |
| static Dart_FileOpenCallback file_open_callback_; | |
| static Dart_FileReadCallback file_read_callback_; | |
| static Dart_FileWriteCallback file_write_callback_; | |
| static Dart_FileCloseCallback file_close_callback_; | |
| static Dart_EntropySource entropy_source_callback_; | |
| static Dart_DwarfStackTraceFootnoteCallback | |
| dwarf_stacktrace_footnote_callback_; | |
| }; | |
| } // namespace dart | |
| #endif // RUNTIME_VM_DART_H_ |