blob: 4f296340b50884461870cbec0d6ae28b5fa97128 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "handle.h"
#include "flutter/fml/logging.h"
#include <iostream>
#include <vector>
#include <zircon/syscalls.h>
static void HandleFree(void* isolate_callback_data, void* peer) {
FML_CHECK(peer);
zircon_dart_handle_t* handle = reinterpret_cast<zircon_dart_handle_t*>(peer);
zircon_dart_handle_free(handle);
}
static void HandlePairFree(void* isolate_callback_data, void* peer) {
FML_CHECK(peer);
zircon_dart_handle_pair_t* handle_pair =
reinterpret_cast<zircon_dart_handle_pair_t*>(peer);
free(handle_pair);
}
void zircon_dart_handle_free(zircon_dart_handle_t* handle) {
FML_CHECK(handle);
if (handle->handle != ZX_HANDLE_INVALID) {
zircon_dart_handle_close(handle);
}
free(handle);
}
int32_t zircon_dart_handle_close(zircon_dart_handle_t* handle) {
FML_CHECK(handle->handle != ZX_HANDLE_INVALID);
zx_status_t status = zx_handle_close(handle->handle);
handle->handle = ZX_HANDLE_INVALID;
if (status == ZX_OK) {
return 1;
} else {
return 0;
}
}
int32_t zircon_dart_handle_is_valid(zircon_dart_handle_t* handle) {
if (!handle || (handle->handle == ZX_HANDLE_INVALID)) {
return 0;
} else {
return 1;
}
}
int zircon_dart_handle_attach_finalizer(Dart_Handle object,
void* pointer,
intptr_t external_allocation_size) {
Dart_FinalizableHandle weak_handle = Dart_NewFinalizableHandle_DL(
object, pointer, external_allocation_size, HandleFree);
if (weak_handle == nullptr) {
FML_LOG(ERROR) << "Unable to attach finalizer: " << std::hex << pointer;
return -1;
}
return 1;
}
int zircon_dart_handle_pair_attach_finalizer(
Dart_Handle object,
void* pointer,
intptr_t external_allocation_size) {
Dart_FinalizableHandle weak_handle = Dart_NewFinalizableHandle_DL(
object, pointer, external_allocation_size, HandlePairFree);
if (weak_handle == nullptr) {
FML_LOG(ERROR) << "Unable to attach finalizer: " << std::hex << pointer;
return -1;
}
return 1;
}
// zircon handle list methods.
using HandleVector = std::vector<zircon_dart_handle_t*>;
using HandleVectorPtr = HandleVector*;
zircon_dart_handle_list_t* zircon_dart_handle_list_create() {
zircon_dart_handle_list_t* result = static_cast<zircon_dart_handle_list_t*>(
malloc(sizeof(zircon_dart_handle_list_t)));
result->size = 0;
result->data = new HandleVector();
return result;
}
void zircon_dart_handle_list_append(zircon_dart_handle_list_t* list,
zircon_dart_handle_t* handle) {
FML_CHECK(list);
FML_CHECK(handle);
list->size++;
auto data = reinterpret_cast<HandleVectorPtr>(list->data);
data->push_back(handle);
}
void zircon_dart_handle_list_free(zircon_dart_handle_list_t* list) {
auto data = reinterpret_cast<HandleVectorPtr>(list->data);
data->clear();
delete data;
free(list);
}