blob: 9d9e711dbfcc351f98ac0b30fb984d31a044de32 [file] [log] [blame]
// 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* vm_snapshot_data;
const uint8_t* vm_snapshot_instructions;
const uint8_t* vm_isolate_data;
const uint8_t* vm_isolate_instructions;
};
};
} 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.
*
* \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_