| /* | |
| * Copyright (c) 2013, 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_INCLUDE_DART_NATIVE_API_H_ | |
| #define RUNTIME_INCLUDE_DART_NATIVE_API_H_ | |
| #include "dart_api.h" /* NOLINT */ | |
| /* | |
| * ========================================== | |
| * Message sending/receiving from native code | |
| * ========================================== | |
| */ | |
| /** | |
| * A Dart_CObject is used for representing Dart objects as native C | |
| * data outside the Dart heap. These objects are totally detached from | |
| * the Dart heap. Only a subset of the Dart objects have a | |
| * representation as a Dart_CObject. | |
| * | |
| * The string encoding in the 'value.as_string' is UTF-8. | |
| * | |
| * All the different types from dart:typed_data are exposed as type | |
| * kTypedData. The specific type from dart:typed_data is in the type | |
| * field of the as_typed_data structure. The length in the | |
| * as_typed_data structure is always in bytes. | |
| * | |
| * The data for kTypedData is copied on message send and ownership remains with | |
| * the caller. The ownership of data for kExternalTyped is passed to the VM on | |
| * message send and returned when the VM invokes the | |
| * Dart_HandleFinalizer callback; a non-NULL callback must be provided. | |
| * | |
| * Note that Dart_CObject_kNativePointer is intended for internal use by | |
| * dart:io implementation and has no connection to dart:ffi Pointer class. | |
| * It represents a pointer to a native resource of a known type. | |
| * The receiving side will only see this pointer as an integer and will not | |
| * see the specified finalizer. | |
| * The specified finalizer will only be invoked if the message is not delivered. | |
| */ | |
| typedef enum { | |
| Dart_CObject_kNull = 0, | |
| Dart_CObject_kBool, | |
| Dart_CObject_kInt32, | |
| Dart_CObject_kInt64, | |
| Dart_CObject_kDouble, | |
| Dart_CObject_kString, | |
| Dart_CObject_kArray, | |
| Dart_CObject_kTypedData, | |
| Dart_CObject_kExternalTypedData, | |
| Dart_CObject_kSendPort, | |
| Dart_CObject_kCapability, | |
| Dart_CObject_kNativePointer, | |
| Dart_CObject_kUnsupported, | |
| Dart_CObject_kUnmodifiableExternalTypedData, | |
| Dart_CObject_kNumberOfTypes | |
| } Dart_CObject_Type; | |
| // This enum is versioned by DART_API_DL_MAJOR_VERSION, only add at the end | |
| // and bump the DART_API_DL_MINOR_VERSION. | |
| typedef struct _Dart_CObject { | |
| Dart_CObject_Type type; | |
| union { | |
| bool as_bool; | |
| int32_t as_int32; | |
| int64_t as_int64; | |
| double as_double; | |
| const char* as_string; | |
| struct { | |
| Dart_Port id; | |
| Dart_Port origin_id; | |
| } as_send_port; | |
| struct { | |
| int64_t id; | |
| } as_capability; | |
| struct { | |
| intptr_t length; | |
| struct _Dart_CObject** values; | |
| } as_array; | |
| struct { | |
| Dart_TypedData_Type type; | |
| intptr_t length; /* in elements, not bytes */ | |
| const uint8_t* values; | |
| } as_typed_data; | |
| struct { | |
| Dart_TypedData_Type type; | |
| intptr_t length; /* in elements, not bytes */ | |
| uint8_t* data; | |
| void* peer; | |
| Dart_HandleFinalizer callback; | |
| } as_external_typed_data; | |
| struct { | |
| intptr_t ptr; | |
| intptr_t size; | |
| Dart_HandleFinalizer callback; | |
| } as_native_pointer; | |
| } value; | |
| } Dart_CObject; | |
| // This struct is versioned by DART_API_DL_MAJOR_VERSION, bump the version when | |
| // changing this struct. | |
| /** | |
| * Posts a message on some port. The message will contain the Dart_CObject | |
| * object graph rooted in 'message'. | |
| * | |
| * While the message is being sent the state of the graph of Dart_CObject | |
| * structures rooted in 'message' should not be accessed, as the message | |
| * generation will make temporary modifications to the data. When the message | |
| * has been sent the graph will be fully restored. | |
| * | |
| * If true is returned, the message was enqueued, and finalizers for external | |
| * typed data will eventually run, even if the receiving isolate shuts down | |
| * before processing the message. If false is returned, the message was not | |
| * enqueued and ownership of external typed data in the message remains with the | |
| * caller. | |
| * | |
| * This function may be called on any thread when the VM is running (that is, | |
| * after Dart_Initialize has returned and before Dart_Cleanup has been called). | |
| * | |
| * \param port_id The destination port. | |
| * \param message The message to send. | |
| * | |
| * \return True if the message was posted. | |
| */ | |
| DART_EXPORT bool Dart_PostCObject(Dart_Port port_id, Dart_CObject* message); | |
| /** | |
| * Posts a message on some port. The message will contain the integer 'message'. | |
| * | |
| * \param port_id The destination port. | |
| * \param message The message to send. | |
| * | |
| * \return True if the message was posted. | |
| */ | |
| DART_EXPORT bool Dart_PostInteger(Dart_Port port_id, int64_t message); | |
| /** | |
| * A native message handler. | |
| * | |
| * This handler is associated with a native port by calling | |
| * Dart_NewNativePort. | |
| * | |
| * The message received is decoded into the message structure. The | |
| * lifetime of the message data is controlled by the caller. All the | |
| * data references from the message are allocated by the caller and | |
| * will be reclaimed when returning to it. | |
| */ | |
| typedef void (*Dart_NativeMessageHandler)(Dart_Port dest_port_id, | |
| Dart_CObject* message); | |
| /** | |
| * Creates a new native port. When messages are received on this | |
| * native port, then they will be dispatched to the provided native | |
| * message handler. | |
| * | |
| * \param name The name of this port in debugging messages. | |
| * \param handler The C handler to run when messages arrive on the port. | |
| * \param handle_concurrently Is it okay to process requests on this | |
| * native port concurrently? | |
| * | |
| * \return If successful, returns the port id for the native port. In | |
| * case of error, returns ILLEGAL_PORT. | |
| */ | |
| DART_EXPORT Dart_Port Dart_NewNativePort(const char* name, | |
| Dart_NativeMessageHandler handler, | |
| bool handle_concurrently); | |
| /** | |
| * Creates a new native port. When messages are received on this | |
| * native port, then they will be dispatched to the provided native | |
| * message handler using up to |max_concurrency| concurrent threads. | |
| * | |
| * \param name The name of this port in debugging messages. | |
| * \param handler The C handler to run when messages arrive on the port. | |
| * \param max_concurrency Size of the thread pool used by the native port. | |
| * | |
| * \return If successful, returns the port id for the native port. In | |
| * case of error, returns ILLEGAL_PORT. | |
| */ | |
| DART_EXPORT Dart_Port | |
| Dart_NewConcurrentNativePort(const char* name, | |
| Dart_NativeMessageHandler handler, | |
| intptr_t max_concurrency); | |
| /** | |
| * Closes the native port with the given id. | |
| * | |
| * The port must have been allocated by a call to Dart_NewNativePort. | |
| * | |
| * \param native_port_id The id of the native port to close. | |
| * | |
| * \return Returns true if the port was closed successfully. | |
| */ | |
| DART_EXPORT bool Dart_CloseNativePort(Dart_Port native_port_id); | |
| /* | |
| * ================== | |
| * Verification Tools | |
| * ================== | |
| */ | |
| /** | |
| * Forces all loaded classes and functions to be compiled eagerly in | |
| * the current isolate.. | |
| * | |
| * TODO(turnidge): Document. | |
| */ | |
| DART_EXPORT DART_API_WARN_UNUSED_RESULT Dart_Handle Dart_CompileAll(void); | |
| /** | |
| * Finalizes all classes. | |
| */ | |
| DART_EXPORT DART_API_WARN_UNUSED_RESULT Dart_Handle | |
| Dart_FinalizeAllClasses(void); | |
| /* This function is intentionally undocumented. | |
| * | |
| * It should not be used outside internal tests. | |
| */ | |
| DART_EXPORT void* Dart_ExecuteInternalCommand(const char* command, void* arg); | |
| #endif /* INCLUDE_DART_NATIVE_API_H_ */ /* NOLINT */ |