| // Copyright (c) 2023, 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 'dylib_utils.dart'; |
| |
| main() { |
| // Force dlopen so @Native lookups in DynamicLibrary.process() succeed. |
| dlopenGlobalPlatformSpecific('ffi_test_functions'); |
| |
| testAsTypedList(); |
| testRefcounted(); |
| } |
| |
| void testAsTypedList() { |
| const length = 10; |
| final ptr = calloc(length, sizeOf<Int16>()).cast<Int16>(); |
| final typedList = ptr.asTypedList(length, finalizer: freePointer); |
| print(typedList); |
| } |
| |
| @Native<Pointer<Void> Function(IntPtr num, IntPtr size)>(isLeaf: true) |
| external Pointer<Void> calloc(int num, int size); |
| |
| final freePointer = DynamicLibrary.process() |
| .lookup<NativeFunction<Void Function(Pointer<Void>)>>('free'); |
| |
| void testRefcounted() { |
| final peer = allocateRefcountedResource(); |
| final resource = peer.ref.resource; |
| final typedList1 = resource.asTypedList( |
| 128, |
| finalizer: decreaseRefcountPointer.cast(), |
| token: peer.cast(), |
| ); |
| increaseRefcount(peer); |
| print(typedList1); |
| final typedList2 = resource.asTypedList( |
| 128, |
| finalizer: decreaseRefcountPointer.cast(), |
| token: peer.cast(), |
| ); |
| increaseRefcount(peer); |
| print(typedList2); |
| } |
| |
| @Native<Pointer<RefCountedResource> Function()>( |
| symbol: 'AllocateRefcountedResource', |
| isLeaf: true, |
| ) |
| external Pointer<RefCountedResource> allocateRefcountedResource(); |
| |
| @Native<Void Function(Pointer<RefCountedResource>)>( |
| symbol: 'IncreaseRefcount', |
| isLeaf: true, |
| ) |
| external void increaseRefcount(Pointer<RefCountedResource> peer); |
| |
| final decreaseRefcountPointer = DynamicLibrary.process() |
| .lookup<NativeFunction<Void Function(Pointer<RefCountedResource>)>>( |
| 'DecreaseRefcount', |
| ); |
| |
| final class RefCountedResource extends Struct { |
| external Pointer<Int8> resource; |
| |
| @IntPtr() |
| external int refcount; |
| } |