| Index: runtime/vm/native_api_impl.cc
|
| ===================================================================
|
| --- runtime/vm/native_api_impl.cc (revision 0)
|
| +++ runtime/vm/native_api_impl.cc (revision 0)
|
| @@ -0,0 +1,136 @@
|
| +// 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.
|
| +
|
| +#include "include/dart_native_api.h"
|
| +
|
| +#include "platform/assert.h"
|
| +#include "vm/dart_api_impl.h"
|
| +#include "vm/dart_api_message.h"
|
| +#include "vm/dart_api_state.h"
|
| +#include "vm/message.h"
|
| +#include "vm/native_message_handler.h"
|
| +#include "vm/port.h"
|
| +
|
| +namespace dart {
|
| +
|
| +// --- Message sending/receiving from native code ---
|
| +
|
| +static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
|
| + void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size);
|
| + return reinterpret_cast<uint8_t*>(new_ptr);
|
| +}
|
| +
|
| +
|
| +DART_EXPORT bool Dart_PostCObject(Dart_Port port_id, Dart_CObject* message) {
|
| + uint8_t* buffer = NULL;
|
| + ApiMessageWriter writer(&buffer, allocator);
|
| + bool success = writer.WriteCMessage(message);
|
| +
|
| + if (!success) return success;
|
| +
|
| + // Post the message at the given port.
|
| + return PortMap::PostMessage(new Message(
|
| + port_id, Message::kIllegalPort, buffer, writer.BytesWritten(),
|
| + Message::kNormalPriority));
|
| +}
|
| +
|
| +
|
| +DART_EXPORT Dart_Port Dart_NewNativePort(const char* name,
|
| + Dart_NativeMessageHandler handler,
|
| + bool handle_concurrently) {
|
| + if (name == NULL) {
|
| + name = "<UnnamedNativePort>";
|
| + }
|
| + if (handler == NULL) {
|
| + OS::PrintErr("%s expects argument 'handler' to be non-null.\n",
|
| + CURRENT_FUNC);
|
| + return ILLEGAL_PORT;
|
| + }
|
| + // Start the native port without a current isolate.
|
| + IsolateSaver saver(Isolate::Current());
|
| + Isolate::SetCurrent(NULL);
|
| +
|
| + NativeMessageHandler* nmh = new NativeMessageHandler(name, handler);
|
| + Dart_Port port_id = PortMap::CreatePort(nmh);
|
| + nmh->Run(Dart::thread_pool(), NULL, NULL, 0);
|
| + return port_id;
|
| +}
|
| +
|
| +
|
| +DART_EXPORT bool Dart_CloseNativePort(Dart_Port native_port_id) {
|
| + // Close the native port without a current isolate.
|
| + IsolateSaver saver(Isolate::Current());
|
| + Isolate::SetCurrent(NULL);
|
| +
|
| + // TODO(turnidge): Check that the port is native before trying to close.
|
| + return PortMap::ClosePort(native_port_id);
|
| +}
|
| +
|
| +
|
| +// --- Profiling support ---
|
| +
|
| +// TODO(7565): Dartium should use the new VM flag "generate_pprof_symbols" for
|
| +// pprof profiling. Then these symbols should be removed.
|
| +
|
| +DART_EXPORT void Dart_InitPprofSupport() { }
|
| +
|
| +DART_EXPORT void Dart_GetPprofSymbolInfo(void** buffer, int* buffer_size) {
|
| + *buffer = NULL;
|
| + *buffer_size = 0;
|
| +}
|
| +
|
| +
|
| +// --- Heap Profiler ---
|
| +
|
| +DART_EXPORT Dart_Handle Dart_HeapProfile(Dart_FileWriteCallback callback,
|
| + void* stream) {
|
| + Isolate* isolate = Isolate::Current();
|
| + CHECK_ISOLATE(isolate);
|
| + if (callback == NULL) {
|
| + RETURN_NULL_ERROR(callback);
|
| + }
|
| + isolate->heap()->Profile(callback, stream);
|
| + return Api::Success();
|
| +}
|
| +
|
| +
|
| +// --- Verification tools ---
|
| +
|
| +static void CompileAll(Isolate* isolate, Dart_Handle* result) {
|
| + ASSERT(isolate != NULL);
|
| + const Error& error = Error::Handle(isolate, Library::CompileAll());
|
| + if (error.IsNull()) {
|
| + *result = Api::Success();
|
| + } else {
|
| + *result = Api::NewHandle(isolate, error.raw());
|
| + }
|
| +}
|
| +
|
| +
|
| +DART_EXPORT Dart_Handle Dart_CompileAll() {
|
| + Isolate* isolate = Isolate::Current();
|
| + DARTSCOPE(isolate);
|
| + Dart_Handle result = Api::CheckIsolateState(isolate);
|
| + if (::Dart_IsError(result)) {
|
| + return result;
|
| + }
|
| + CHECK_CALLBACK_STATE(isolate);
|
| + CompileAll(isolate, &result);
|
| + return result;
|
| +}
|
| +
|
| +
|
| +DART_EXPORT Dart_Handle Dart_CheckFunctionFingerprints() {
|
| + Isolate* isolate = Isolate::Current();
|
| + DARTSCOPE(isolate);
|
| + Dart_Handle result = Api::CheckIsolateState(isolate);
|
| + if (::Dart_IsError(result)) {
|
| + return result;
|
| + }
|
| + CHECK_CALLBACK_STATE(isolate);
|
| + Library::CheckFunctionFingerprints();
|
| + return result;
|
| +}
|
| +
|
| +} // namespace dart
|
|
|