6e33c95463
Adds shared libraries for embedding Dart VM and new API (runtime/engine/include/dart_engine.h). TEST=tests/standalone/embedder_samples_test.dart Cq-Include-Trybots: luci.dart.try:vm-aot-android-release-arm64c-try,vm-aot-android-release-arm_x64-try,vm-aot-asan-linux-release-x64-try,vm-aot-dwarf-linux-product-x64-try,vm-aot-dyn-linux-debug-x64-try,vm-aot-linux-debug-simarm_x64-try,vm-aot-linux-debug-simriscv32-try,vm-aot-linux-debug-simriscv64-try,vm-aot-linux-debug-x64-try,vm-aot-linux-debug-x64c-try,vm-aot-linux-product-x64-try,vm-aot-linux-release-arm64-try,vm-aot-linux-release-simarm_x64-try,vm-aot-linux-release-x64-try,vm-aot-mac-product-arm64-try,vm-aot-mac-release-arm64-try,vm-aot-mac-release-x64-try,vm-aot-msan-linux-release-x64-try,vm-aot-obfuscate-linux-release-x64-try,vm-aot-optimization-level-linux-release-x64-try,vm-aot-tsan-linux-release-x64-try,vm-aot-ubsan-linux-release-x64-try,vm-aot-win-debug-x64-try,vm-aot-win-debug-x64c-try,vm-aot-win-product-x64-try,vm-aot-win-release-x64-try,vm-appjit-linux-debug-x64-try,vm-appjit-linux-product-x64-try,vm-appjit-linux-release-x64-try,vm-asan-linux-release-arm64-try,vm-asan-linux-release-x64-try,vm-checked-mac-release-arm64-try,vm-eager-optimization-linux-release-ia32-try,vm-eager-optimization-linux-release-x64-try,vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64c-try,vm-ffi-android-product-arm-try,vm-ffi-android-product-arm64c-try,vm-ffi-android-release-arm-try,vm-ffi-android-release-arm64c-try,vm-ffi-qemu-linux-release-arm-try,vm-ffi-qemu-linux-release-riscv64-try,vm-fuchsia-release-arm64-try,vm-fuchsia-release-x64-try,vm-gcc-linux-try,vm-linux-debug-ia32-try,vm-linux-debug-simriscv32-try,vm-linux-debug-simriscv64-try,vm-linux-debug-x64-try,vm-linux-debug-x64c-try,vm-linux-release-arm64-try,vm-linux-release-ia32-try,vm-linux-release-simarm-try,vm-linux-release-x64-try,vm-mac-debug-arm64-try,vm-mac-debug-x64-try,vm-mac-release-arm64-try,vm-mac-release-x64-try,vm-msan-linux-release-arm64-try,vm-msan-linux-release-x64-try,vm-msvc-windows-try,vm-reload-linux-debug-x64-try,vm-reload-linux-release-x64-try,vm-reload-rollback-linux-debug-x64-try,vm-reload-rollback-linux-release-x64-try,vm-tsan-linux-release-arm64-try,vm-tsan-linux-release-x64-try,vm-ubsan-linux-release-arm64-try,vm-ubsan-linux-release-x64-try,vm-win-debug-x64-try,vm-win-debug-x64c-try,vm-win-release-ia32-try,vm-win-release-x64-try Change-Id: Ia4e4d1b871ddef515cfb2f4639bdaa9fe3676936 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/402860 Reviewed-by: Slava Egorov <vegorov@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com> Commit-Queue: Martin Kustermann <kustermann@google.com>
119 lines
3.3 KiB
C++
119 lines
3.3 KiB
C++
#include <condition_variable>
|
|
#include <iostream>
|
|
#include <mutex>
|
|
#include <queue>
|
|
#include <thread>
|
|
#include "helpers.h"
|
|
#include "include/dart_api.h"
|
|
#include "include/dart_engine.h"
|
|
|
|
// Calls `startTimer` from timer.dart
|
|
void StartTimer(Dart_Isolate isolate, uint32_t millis) {
|
|
WithIsolate(isolate, [&]() {
|
|
std::initializer_list<Dart_Handle> args{Dart_NewInteger(millis)};
|
|
CheckError(
|
|
Dart_Invoke(Dart_RootLibrary(), Dart_NewStringFromCString("startTimer"),
|
|
1, const_cast<Dart_Handle*>(args.begin())),
|
|
"calling startTimer");
|
|
});
|
|
}
|
|
|
|
// Calls `stopTimer` from timer.dart
|
|
void StopTimer(Dart_Isolate isolate) {
|
|
WithIsolate(isolate, [&]() {
|
|
CheckError(Dart_Invoke(Dart_RootLibrary(),
|
|
Dart_NewStringFromCString("stopTimer"), 0, nullptr),
|
|
"calling stopTimer");
|
|
});
|
|
}
|
|
|
|
// Gets `ticks` from timer.dart
|
|
int64_t GetTicks(Dart_Isolate isolate) {
|
|
return WithIsolate<int64_t>(isolate, []() {
|
|
return IntFromHandle(
|
|
Dart_GetField(Dart_RootLibrary(), Dart_NewStringFromCString("ticks")));
|
|
});
|
|
}
|
|
|
|
// Queue-based message handler, running on a separate thread.
|
|
class ThreadedMessageHandler {
|
|
public:
|
|
void Run() {
|
|
is_running = true;
|
|
while (is_running) {
|
|
Dart_Isolate isolate;
|
|
{
|
|
std::unique_lock notifications_lock(notifications_mutex_);
|
|
can_pop_.wait(notifications_lock);
|
|
if (notifications_.empty()) {
|
|
continue;
|
|
}
|
|
isolate = notifications_.front();
|
|
notifications_.pop();
|
|
}
|
|
DartEngine_HandleMessage(isolate);
|
|
}
|
|
}
|
|
|
|
void Notify(Dart_Isolate isolate) {
|
|
std::unique_lock notifications_lock(notifications_mutex_);
|
|
notifications_.push(isolate);
|
|
can_pop_.notify_one();
|
|
}
|
|
|
|
void Stop() {
|
|
is_running = false;
|
|
can_pop_.notify_one();
|
|
}
|
|
|
|
static void ScheduleDartMessage(Dart_Isolate isolate, void* context) {
|
|
reinterpret_cast<ThreadedMessageHandler*>(context)->Notify(isolate);
|
|
}
|
|
|
|
private:
|
|
std::queue<Dart_Isolate> notifications_;
|
|
std::condition_variable can_pop_;
|
|
std::atomic<bool> is_running;
|
|
std::mutex notifications_mutex_;
|
|
};
|
|
|
|
int main(int argc, char** argv) {
|
|
if (argc == 1) {
|
|
std::cerr << "Must specify snapshot path" << std::endl;
|
|
std::exit(1);
|
|
}
|
|
char* error = nullptr;
|
|
|
|
// Start an event loop on a separate thread and use it as a default
|
|
// scheduler.
|
|
ThreadedMessageHandler message_handler;
|
|
std::thread message_handler_thread(&ThreadedMessageHandler::Run,
|
|
&message_handler);
|
|
DartEngine_SetDefaultMessageScheduler(
|
|
{ThreadedMessageHandler::ScheduleDartMessage, &message_handler});
|
|
|
|
// Load snapshot and create an isolate
|
|
DartEngine_SnapshotData snapshot_data = AutoSnapshotFromFile(argv[1], &error);
|
|
CheckError(error, "reading snapshot");
|
|
Dart_Isolate isolate = DartEngine_CreateIsolate(snapshot_data, &error);
|
|
CheckError(error, "creating isolate");
|
|
|
|
// Call Dart function to start a timer.
|
|
StartTimer(isolate, 1);
|
|
|
|
// Wait a bit.
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
|
|
// Stop the timer.
|
|
StopTimer(isolate);
|
|
|
|
// Get timer value.
|
|
std::cout << "Ticks: " << GetTicks(isolate) << std::endl;
|
|
|
|
// Stop event loop.
|
|
message_handler.Stop();
|
|
message_handler_thread.join();
|
|
|
|
DartEngine_Shutdown();
|
|
}
|