acquire method
Waits for a permit, then acquires it (decrements available count). Completes when a permit is available. Throws Object if the underlying future completes with an error.
Implementation
Future<void> acquire() async {
if (_available > 0) {
_available--;
return;
}
final Completer<void> c = Completer<void>();
_waiters.add(() => c.complete());
try {
await c.future;
} on Object catch (e, st) {
if (!c.isCompleted) c.completeError(e, st);
rethrow;
}
_available--;
}