closeAndDrain method

void closeAndDrain()

Releases every retained handle that arrived but was never delivered, then closes.

Two halves, because a handle can be stranded in either of two places:

  1. Controller buffer — parsed into a Sample but not yet delivered. Disposed directly from _undelivered.
  2. Port queue — still an unparsed NativePort message. Closing the port in the same turn discards these; deferring the close by one event-loop turn delivers them, and the listener's isClosed branch disposes each as it lands. So the close is deferred.

Implementation

void closeAndDrain() {
  for (final retained in _undelivered) {
    retained.dispose();
  }
  _undelivered.clear();
  // isClosed flips synchronously here — that is what arms the listener's
  // drain branch for half 2 above.
  unawaited(_controller.close());
  unawaited(Future<void>(receivePort.close));
}