criticalShared<T> method
Critical section with lockShared and unlockShared.
If timeLimit
is not null
, this might throw TimeoutException
when lockShared() is timed out.
Usage
var ret = await mutex.criticalShared(someSyncCriticalFunc1);
var ret = await mutex.criticalShared(someAsyncCriticalFunc1);
var ret = await mutex.criticalShared(() => someSyncCriticalFunc2(arg1, arg2));
var ret = await mutex.criticalShared(() => someAsyncCriticalFunc2(arg1, arg2));
late RetType ret1;
var ret2 = await mutex.criticalShared(() {
ret1 = someSyncCriticalFunc3();
return someSyncCriticalFunc4();
});
late RetType ret1;
var ret2 = await mutex.criticalShared(() async {
ret1 = await someAsyncCriticalFunc3();
return await someAsyncCriticalFunc4();
});
Implementation
Future<T> criticalShared<T>(FutureOr<T> Function() func,
{Duration? timeLimit}) async {
await lockShared(timeLimit: timeLimit);
try {
if (func is Future<T> Function()) {
return await func();
} else {
return func();
}
} finally {
unlockShared();
}
}