// Copyright (c) 2025, 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_ENGINE_INCLUDE_DART_ENGINE_H_ #define RUNTIME_ENGINE_INCLUDE_DART_ENGINE_H_ #include "include/dart_api.h" /** * Initializes the Dart engine. * * \param[out] error Set to NULL if initialization was successful. * Otherwise is set to a description of error which occurred during * initialization. The caller is responsible for freeing the error string. * * \return true if initialization is successful and false otherwise. */ DART_EXPORT bool DartEngine_Init(char** error); /** * Shuts down the Dart engine. * * Stops all isolates and frees all resources. */ DART_EXPORT void DartEngine_Shutdown(); /** * Kind of a snapshot represented by DartEngine_SnapshotData. */ typedef enum { DartEngine_SnapshotKind_Kernel, DartEngine_SnapshotKind_AOT, } DartEngine_SnapshotKind; /** * Dart snapshot data, sufficient to create an isolate. */ typedef struct DartEngine_SnapshotData { /** * Uniquely identifies a snapshot. * * It is passed to \ref Dart_CreateIsolateGroup or * \ref Dart_CreateIsolateGroupFromKernel. */ const char* script_uri; /** * Whether this snapshot data reprents Kernel or AOT snapshot. */ DartEngine_SnapshotKind kind; union { struct { const uint8_t* kernel_buffer; intptr_t kernel_buffer_size; }; struct { const uint8_t* snapshot_data; const uint8_t* snapshot_text; }; }; } DartEngine_SnapshotData; /** * Creates a new isolate for a given snapshot. * * \param snapshot_data Snapshot to start an isolate from. * \param[out] error Set to NULL if an isolate is created successfully. * Otherwise is set to a description of error which occurred during * isolate creation. The caller is responsible for freeing the error string. * * \return The new isolate on success, or NULL if isolate creation failed. */ DART_EXPORT Dart_Isolate DartEngine_CreateIsolate(DartEngine_SnapshotData snapshot_data, char** error); /** * Blocks until the isolate is available for entering and enters an isolate. * * This is an alternative to \ref Dart_EnterIsolate, which can be used when * multiple threads may try to enter the same isolate at the same time. * * Use \ref DartEngine_ReleaseIsolate instead of `Dart_ExitIsolate` if you * use this function. */ DART_EXPORT void DartEngine_AcquireIsolate(Dart_Isolate isolate); /** * Exits an isolate and makes it available for entering by other threads. * * This is an alternative to \ref Dart_ExitIsolate, which should be used * if you use \ref DartEngine_AcquireIsolate. */ DART_EXPORT void DartEngine_ReleaseIsolate(); /** * A callback invoked when there's an error handling isolate message. * * \param error Dart error happened during handling a message. * \param destination_isolate The isolate where the error occurred. */ typedef void (*DartEngine_HandleMessageErrorCallback)( Dart_Handle error, Dart_Isolate destination_isolate); /** * Sets the callback for errors during handling isolate messages. */ DART_EXPORT void DartEngine_SetHandleMessageErrorCallback( DartEngine_HandleMessageErrorCallback handle_message_error_callback); /** * Drains the microtasks queue. Requires to be an active isolate. * * Normally the microtasks queue is drained after handling each * isolate message, but when the engine calls into Dart, it might be * required to manually drain the microtasks queue. * * If a microtask throws, the error is returned to the caller, * and the queue may still contain more entries. * The caller should continue to drain the queue after handling the error. * * \return Dart_Handle invocation result. */ DART_EXPORT Dart_Handle DartEngine_DrainMicrotasksQueue(); /** * Handles a single message for an isolate. */ DART_EXPORT void DartEngine_HandleMessage(Dart_Isolate isolate); /** * Message scheduling callback. * * Dart Engine calls this callback whenever there's a new message for an * isolate, and the callback should schedule an execution of * DartEngine_HandleMessage with given isolate. * * \param isolate Destination isolate for a mesage. * \param context Context from \ref DartEngine_MessageScheduler. */ typedef void (*DartEngine_ScheduleMessageCallback)(Dart_Isolate isolate, void* context); /** * Scheduler for isolate messages. * * Whenever Dart isolate has a new message, the Dart engine will * call schedule_callback and pass context into it. */ typedef struct DartEngine_MessageScheduler { DartEngine_ScheduleMessageCallback schedule_callback; void* context; } DartEngine_MessageScheduler; /** * Sets default message scheduler for all isolates. */ DART_EXPORT void DartEngine_SetDefaultMessageScheduler( DartEngine_MessageScheduler scheduler); /** * Sets message scheduler for isolate. */ DART_EXPORT void DartEngine_SetMessageScheduler( DartEngine_MessageScheduler scheduler, Dart_Isolate isolate); /** * Loads \ref DartEngine_SnapshotData from file * * User should not free uri and buffer. * * \param[out] error Set to NULL if snapshot could be loaded successfully. * Otherwise is set to a description of error which occurred during * snapshot loading. The caller is responsible for freeing the error string. * * \return Snapshot data with kind set to \ref DartEngine_SnapshotKind_Kernel. */ DART_EXPORT DartEngine_SnapshotData DartEngine_KernelFromFile(const char* path, char** error); /** * Loads \ref DartEngine_SnapshotData from file * * User should not free uri and buffers. * * \param[out] error Set to NULL if snapshot could be loaded successfully. * Otherwise is set to a description of error which occurred during * snapshot loading. The caller is responsible for freeing the error string. * * \return Snapshot data with kind set to \ref DartEngine_SnapshotKind_AOT. */ DART_EXPORT DartEngine_SnapshotData DartEngine_AotSnapshotFromFile(const char* path, char** error); #endif // RUNTIME_ENGINE_INCLUDE_DART_ENGINE_H_