38e250b4d5
Includes all the files which required no manual treatment. Change-Id: I3d493bcbc238a2016579a0f804d32f4829efb87b Cq-Include-Trybots: dart/try:vm-aot-android-release-arm_x64-try,vm-aot-linux-debug-x64-try,vm-aot-linux-debug-x64c-try,vm-aot-mac-release-arm64-try,vm-aot-mac-release-x64-try,vm-aot-win-debug-x64c-try,vm-checked-mac-release-arm64-try,vm-ffi-qemu-linux-release-arm-try,vm-ffi-qemu-linux-release-riscv64-try,vm-linux-debug-ia32-try,vm-linux-debug-x64-try,vm-linux-debug-x64c-try,vm-mac-debug-arm64-try,vm-reload-linux-debug-x64-try,vm-reload-rollback-linux-debug-x64-try,vm-win-release-ia32-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/399102 Reviewed-by: Bob Nystrom <rnystrom@google.com> Commit-Queue: Daco Harkes <dacoharkes@google.com>
89 lines
2.1 KiB
Dart
89 lines
2.1 KiB
Dart
// Copyright (c) 2022, 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.
|
|
//
|
|
// SharedObjects=ffi_test_functions
|
|
|
|
import 'dart:ffi';
|
|
import 'dart:io';
|
|
|
|
import 'ffi_test_helpers.dart';
|
|
|
|
void main() {
|
|
testMallocFree();
|
|
print('end of test, shutting down');
|
|
}
|
|
|
|
void testMallocFree() {
|
|
if (Platform.isWindows) {
|
|
// malloc and free not supported.
|
|
return;
|
|
}
|
|
|
|
print('freePtr $freePtr');
|
|
|
|
{
|
|
final resource = MyNativeResource();
|
|
resource.close();
|
|
doGC();
|
|
}
|
|
|
|
{
|
|
MyNativeResource();
|
|
doGC();
|
|
}
|
|
|
|
// Run finalizer on shutdown (or on a GC that runs before shutdown).
|
|
MyNativeResource();
|
|
}
|
|
|
|
class MyNativeResource implements Finalizable {
|
|
final Pointer<Void> pointer;
|
|
|
|
bool _closed = false;
|
|
|
|
MyNativeResource._(this.pointer, {int? externalSize}) {
|
|
print('pointer $pointer');
|
|
freeFinalizer.attach(
|
|
this,
|
|
pointer,
|
|
externalSize: externalSize,
|
|
detach: this,
|
|
);
|
|
}
|
|
|
|
factory MyNativeResource() {
|
|
const num = 1;
|
|
const size = 16;
|
|
final pointer = calloc(num, size);
|
|
return MyNativeResource._(pointer, externalSize: size);
|
|
}
|
|
|
|
/// Eagerly stop using the native resource. Cancelling the finalizer.
|
|
void close() {
|
|
_closed = true;
|
|
freeFinalizer.detach(this);
|
|
free(pointer);
|
|
}
|
|
|
|
void useResource() {
|
|
if (_closed) {
|
|
throw UnsupportedError('The native resource has already been released');
|
|
}
|
|
print(pointer.address);
|
|
}
|
|
}
|
|
|
|
final DynamicLibrary stdlib = DynamicLibrary.process();
|
|
|
|
typedef PosixCallocNative = Pointer<Void> Function(IntPtr num, IntPtr size);
|
|
typedef PosixCalloc = Pointer<Void> Function(int num, int size);
|
|
final PosixCalloc calloc = stdlib
|
|
.lookupFunction<PosixCallocNative, PosixCalloc>('calloc');
|
|
|
|
typedef PosixFreeNative = Void Function(Pointer<Void>);
|
|
final freePtr = stdlib.lookup<NativeFunction<PosixFreeNative>>('free');
|
|
final free = freePtr.asFunction<void Function(Pointer<Void>)>();
|
|
|
|
final freeFinalizer = NativeFinalizer(freePtr);
|