mc_gallery/lib/features/core/utils/mutex.dart

27 lines
934 B
Dart
Raw Normal View History

2022-12-23 10:20:46 +00:00
import 'dart:async';
import 'dart:collection';
import 'dart:ui';
/// A simple Mutex implementation using a [Completer].
class Mutex {
2023-01-01 12:04:22 +00:00
final _completerQueue = Queue<Completer<void>>();
2022-12-23 10:20:46 +00:00
/// Runs the given [run] function-block in a thread-safe/blocked zone. A convenient `unlock()`
/// is provided, which can be called anywhere to signal re-entry.
FutureOr<T> lockAndRun<T>({
required FutureOr<T> Function(VoidCallback unlock) run,
}) async {
2023-01-01 12:04:22 +00:00
final completer = Completer<void>();
2022-12-23 10:20:46 +00:00
_completerQueue.add(completer);
if (_completerQueue.first != completer) {
await _completerQueue.removeFirst().future;
}
2023-01-01 12:04:22 +00:00
final value = await run(completer.complete);
2022-12-23 10:20:46 +00:00
return value;
}
2022-12-25 21:17:59 +00:00
/// Allows listening to the completion status of the last worker process to be released.
2022-12-23 10:20:46 +00:00
Future<void> get lastOperationCompletionAwaiter =>
_completerQueue.isNotEmpty ? _completerQueue.last.future : Future.value();
}