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:
- Controller buffer — parsed into a Sample but not yet delivered.
Disposed directly from
_undelivered. - 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
isClosedbranch 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));
}