destroy method

  1. @override
Future<void> destroy()

Destroys the inlet and cleans up resources. You can no longer use the inlet after calling this method.

Implementation

@override
Future<void> destroy() async {
  if (destroyed || !created) {
    return; // Already destroyed
  }
  super.destroy();
  // A listener's thread is inside a pull on this inlet. It has to be out
  // before the inlet is freed, whether or not its subscription was
  // cancelled first.
  await Future.wait([
    for (final stop in _listeners.toList(growable: false))
      stop('The inlet was destroyed while this stream was listened to'),
  ]);
  // Clean up resources
  if (_useIsolates) {
    await _isolateManagerBang.sendMessage(
      LSLMessage(LSLMessageType.destroy, {}),
    );
    _isolateManagerBang.dispose();
  } else if (_ref case final ref?) {
    // Closes and destroys the inlet if it is [_managed]. The listeners
    // have let go of it above, so that happens here and now.
    _ref = null;
    lslDartInletFinalizer.detach(this);
    lslDartInletRelease(ref);
  }
  _inlet = null;
  _isolateManager = null;
  _buffer?.free();
  _buffer = null;
  _tcScratch?.free();
  _tcScratch = null;
  _chunkBuffer?.free();
  _chunkBuffer = null;
  // Ours: lsl_get_fullinfo hands over a copy. The Dart fields of
  // [streamInfo] stay readable.
  _fullInfo?.destroy();
  _fullInfo = null;
}