From a47b85ff85002c27ec367a7eee883cc05f05a3aa Mon Sep 17 00:00:00 2001 From: JustArchi Date: Thu, 21 May 2020 23:08:02 +0200 Subject: [PATCH] Allow CrossProcessFileBasedSemaphore to sleep asynchronously --- .../Helpers/CrossProcessFileBasedSemaphore.cs | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/ArchiSteamFarm/Helpers/CrossProcessFileBasedSemaphore.cs b/ArchiSteamFarm/Helpers/CrossProcessFileBasedSemaphore.cs index d9d04c222..5014f4323 100644 --- a/ArchiSteamFarm/Helpers/CrossProcessFileBasedSemaphore.cs +++ b/ArchiSteamFarm/Helpers/CrossProcessFileBasedSemaphore.cs @@ -71,22 +71,22 @@ namespace ArchiSteamFarm.Helpers { bool success = false; try { - lock (LocalSemaphore) { - if (FileLock != null) { - throw new ArgumentNullException(nameof(FileLock)); - } + while (true) { + try { + lock (LocalSemaphore) { + if (FileLock != null) { + throw new ArgumentNullException(nameof(FileLock)); + } - while (true) { - EnsureFileExists(); + EnsureFileExists(); - try { FileLock = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Read, FileShare.None); success = true; return; - } catch (IOException) { - Thread.Sleep(SpinLockDelay); } + } catch (IOException) { + await Task.Delay(SpinLockDelay).ConfigureAwait(false); } } } finally { @@ -116,28 +116,34 @@ namespace ArchiSteamFarm.Helpers { return false; } - lock (LocalSemaphore) { - if (FileLock != null) { - throw new ArgumentNullException(nameof(FileLock)); - } - + try { while (true) { - EnsureFileExists(); - try { - FileLock = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Read, FileShare.None); - success = true; + lock (LocalSemaphore) { + if (FileLock != null) { + throw new ArgumentNullException(nameof(FileLock)); + } - return true; + EnsureFileExists(); + + FileLock = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Read, FileShare.None); + success = true; + + return true; + } } catch (IOException) { if (millisecondsTimeout <= SpinLockDelay) { return false; } - Thread.Sleep(SpinLockDelay); + await Task.Delay(SpinLockDelay).ConfigureAwait(false); millisecondsTimeout -= SpinLockDelay; } } + } finally { + if (!success) { + LocalSemaphore.Release(); + } } } finally { if (!success) {