lockAndRun<T> method

FutureOr<T> lockAndRun<T>({
  1. required FutureOr<T> run(
    1. VoidCallback unlock
    ),
  2. Object? completerId,
})

Implementation

FutureOr<T> lockAndRun<T>({
  required FutureOr<T> Function(VoidCallback unlock) run,
  Object? completerId,
}) async {
  final myCompleter = completerId == null
      ? Completer()
      : registerCompleter(completerId);
  _completerQueue.add(myCompleter);
  for (final queuedCompleter in _completerQueue) {
    if (queuedCompleter == myCompleter) break;
    await queuedCompleter.future;
  }
  final value = await run(() => myCompleter.complete());
  if (completerId != null) {
    _completersById.remove(completerId);
  }
  _completerQueue.remove(myCompleter);
  return value;
}