Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ EnterAsync()

Task System.Threading.AsyncMutex.EnterAsync ( CancellationToken cancellationToken)
inline

Definition at line 32 of file AsyncMutex.cs.

33 {
34 if (!cancellationToken.IsCancellationRequested)
35 {
36 if (Interlocked.Decrement(ref _gate) < 0)
37 {
38 return Contended(cancellationToken);
39 }
40 return Task.CompletedTask;
41 }
43 Task Contended(CancellationToken cancellationToken)
44 {
45 Waiter waiter4 = new Waiter(this);
46 waiter4.CancellationRegistration = cancellationToken.UnsafeRegister(delegate(object s, CancellationToken token)
47 {
48 OnCancellation(s, token);
49 }, waiter4);
50 lock (SyncObj)
51 {
53 {
54 waiter4.CancellationRegistration.Unregister();
56 return Task.CompletedTask;
57 }
58 if (cancellationToken.IsCancellationRequested)
59 {
60 waiter4.TrySetCanceled(cancellationToken);
61 return waiter4.Task;
62 }
63 if (_waitersTail == null)
64 {
65 Waiter next2 = (waiter4.Prev = waiter4);
66 waiter4.Next = next2;
67 }
68 else
69 {
70 waiter4.Next = _waitersTail;
71 waiter4.Prev = _waitersTail.Prev;
72 Waiter prev = waiter4.Prev;
73 Waiter next2 = (waiter4.Next.Prev = waiter4);
74 prev.Next = next2;
75 }
76 _waitersTail = waiter4;
77 }
78 return waiter4.Task;
79 }
80 static void OnCancellation(object state, CancellationToken cancellationToken)
81 {
82 Waiter waiter = (Waiter)state;
83 AsyncMutex owner = waiter.Owner;
84 lock (owner.SyncObj)
85 {
86 if (waiter.Next != null)
87 {
88 Interlocked.Increment(ref owner._gate);
89 if (waiter.Next == waiter)
90 {
91 owner._waitersTail = null;
92 }
93 else
94 {
95 waiter.Next.Prev = waiter.Prev;
96 waiter.Prev.Next = waiter.Next;
97 if (owner._waitersTail == waiter)
98 {
99 owner._waitersTail = waiter.Next;
100 }
101 }
102 Waiter waiter2 = waiter;
103 Waiter next = (waiter.Prev = null);
104 waiter2.Next = next;
105 }
106 else
107 {
108 waiter = null;
109 }
110 }
112 }
113 }
bool TrySetCanceled(CancellationToken tokenToRecord)
Definition Task.cs:2555
static Task FromCanceled(CancellationToken cancellationToken)
Definition Task.cs:3363
static Task CompletedTask
Definition Task.cs:1120

References System.Threading.AsyncMutex._gate, System.Threading.AsyncMutex._lockedSemaphoreFull, System.Threading.AsyncMutex._waitersTail, System.Threading.AsyncMutex.Waiter.CancellationRegistration, System.cancellationToken, System.Threading.Tasks.Task< TResult >.CompletedTask, System.Threading.Interlocked.Decrement(), System.Threading.Tasks.Task< TResult >.FromCanceled(), System.Threading.Interlocked.Increment(), System.Threading.AsyncMutex.Waiter.Next, System.Threading.AsyncMutex.Waiter.Owner, System.Threading.AsyncMutex.Waiter.Prev, System.s, System.state, System.Threading.AsyncMutex.SyncObj, System.Threading.Tasks.TaskCompletionSource< TResult >.Task, System.Threading.Tasks.TaskCompletionSource< TResult >.TrySetCanceled(), and System.Threading.CancellationTokenRegistration.Unregister().

Referenced by System.Net.WebSockets.ManagedWebSocket.CloseAsyncPrivate(), System.Net.WebSockets.ManagedWebSocket._003CReceiveAsyncPrivate_003Ed__63< TResult >.MoveNext(), and System.Net.WebSockets.ManagedWebSocket.SendFrameAsync().