NativeHandle<T extends NativeType> constructor

NativeHandle<T extends NativeType>(
  1. Pointer<T> _ptr,
  2. Pointer<NativeFunction<Void Function(Pointer<T>)>> freeFn, {
  3. int externalSize = 4096,
})

Wraps _ptr and attaches a ffi.NativeFinalizer calling freeFn (for example, addresses.EVP_PKEY_free or addresses.X509_free).

Implementation

NativeHandle(
  this._ptr,
  ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<T>)>> freeFn, {
  int externalSize = 4096,
}) : _rawFree = freeFn
         .cast<ffi.NativeFinalizerFunction>()
         .asFunction<void Function(ffi.Pointer<ffi.Void>)>(),
     _finalizer = _finalizers.putIfAbsent(
       freeFn.address,
       () => ffi.NativeFinalizer(freeFn.cast()),
     ) {
  if (_ptr == ffi.nullptr) {
    throw StateError('Cannot wrap nullptr in NativeHandle<$T>');
  }
  _finalizer.attach(
    this,
    _ptr.cast(),
    detach: this,
    externalSize: externalSize,
  );
}