criticalShared<T> method

Future<T> criticalShared<T>(
  1. FutureOr<T> func(), {
  2. Duration? timeLimit,
})

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();
  }
}