tgstation-server  4.3.2
The /tg/station 13 server suite
SemaphoreSlimContext.cs
Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4 
5 namespace Tgstation.Server.Host.Core
6 {
10  public sealed class SemaphoreSlimContext : IDisposable
11  {
18  public static async Task<SemaphoreSlimContext> Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
19  {
20  if (semaphore == null)
21  throw new ArgumentNullException(nameof(semaphore));
22  cancellationToken.ThrowIfCancellationRequested();
23  await semaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
24  return new SemaphoreSlimContext(semaphore);
25  }
26 
30  readonly SemaphoreSlim lockedSemaphore;
31 
35  readonly object disposeLock;
36 
40  bool disposed;
41 
46  SemaphoreSlimContext(SemaphoreSlim lockedSemaphore)
47  {
48  this.lockedSemaphore = lockedSemaphore;
49  disposeLock = new object();
50  }
51 
55 #pragma warning disable CA1821 // Remove empty Finalizers //TODO remove this when https://github.com/dotnet/roslyn-analyzers/issues/1241 is fixed
56  ~SemaphoreSlimContext() => Dispose();
57 #pragma warning restore CA1821 // Remove empty Finalizers
58 
62  public void Dispose()
63  {
64  lock (disposeLock)
65  {
66  if (disposed)
67  return;
68  disposed = true;
69  }
70 
71  GC.SuppressFinalize(this);
72  lockedSemaphore.Release();
73  }
74  }
75 }
readonly SemaphoreSlim lockedSemaphore
The locked SemaphoreSlim
SemaphoreSlimContext(SemaphoreSlim lockedSemaphore)
Construct a SemaphoreSlimContext
void Dispose()
Release the lock on lockedSemaphore
readonly object disposeLock
object for disposed.
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore