Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
WaitHandle.cs
Go to the documentation of this file.
5
6namespace System.Threading;
7
9{
10 internal const int MaxWaitHandles = 64;
11
12 protected static readonly IntPtr InvalidHandle = new IntPtr(-1);
13
15
16 [ThreadStatic]
18
19 internal const int WaitSuccess = 0;
20
21 internal const int WaitAbandoned = 128;
22
23 public const int WaitTimeout = 258;
24
25 [Obsolete("WaitHandleHandle has been deprecated. Use the SafeWaitHandle property instead.")]
26 public virtual IntPtr Handle
27 {
28 get
29 {
30 if (_waitHandle != null)
31 {
33 }
34 return InvalidHandle;
35 }
36 set
37 {
38 if (value == InvalidHandle)
39 {
40 if (_waitHandle != null)
41 {
43 _waitHandle = null;
44 }
45 }
46 else
47 {
48 _waitHandle = new SafeWaitHandle(value, ownsHandle: true);
49 }
50 }
51 }
52
54 {
55 get
56 {
57 return _waitHandle ?? (_waitHandle = new SafeWaitHandle(InvalidHandle, ownsHandle: false));
58 }
59 [param: AllowNull]
60 set
61 {
63 }
64 }
65
66 [MethodImpl(MethodImplOptions.InternalCall)]
67 private static extern int WaitOneCore(IntPtr waitHandle, int millisecondsTimeout);
68
69 internal unsafe static int WaitMultipleIgnoringSyncContext(Span<IntPtr> waitHandles, bool waitAll, int millisecondsTimeout)
70 {
71 fixed (IntPtr* waitHandles2 = &MemoryMarshal.GetReference(waitHandles))
72 {
73 return WaitMultipleIgnoringSyncContext(waitHandles2, waitHandles.Length, waitAll, millisecondsTimeout);
74 }
75 }
76
77 [MethodImpl(MethodImplOptions.InternalCall)]
78 private unsafe static extern int WaitMultipleIgnoringSyncContext(IntPtr* waitHandles, int numHandles, bool waitAll, int millisecondsTimeout);
79
80 private static int SignalAndWaitCore(IntPtr waitHandleToSignal, IntPtr waitHandleToWaitOn, int millisecondsTimeout)
81 {
82 int num = SignalAndWaitNative(waitHandleToSignal, waitHandleToWaitOn, millisecondsTimeout);
83 if (num == 298)
84 {
86 }
87 return num;
88 }
89
90 [MethodImpl(MethodImplOptions.InternalCall)]
91 private static extern int SignalAndWaitNative(IntPtr waitHandleToSignal, IntPtr waitHandleToWaitOn, int millisecondsTimeout);
92
94 {
95 long num = (long)timeout.TotalMilliseconds;
96 if (num < -1)
97 {
99 }
100 if (num > int.MaxValue)
101 {
103 }
104 return (int)num;
105 }
106
107 public virtual void Close()
108 {
109 Dispose();
110 }
111
112 protected virtual void Dispose(bool explicitDisposing)
113 {
115 }
116
117 public void Dispose()
118 {
119 Dispose(explicitDisposing: true);
120 GC.SuppressFinalize(this);
121 }
122
123 public virtual bool WaitOne(int millisecondsTimeout)
124 {
125 if (millisecondsTimeout < -1)
126 {
128 }
130 }
131
133 {
135 bool success = false;
136 try
137 {
138 safeWaitHandle.DangerousAddRef(ref success);
140 int num = ((current == null || !current.IsWaitNotificationRequired()) ? WaitOneCore(safeWaitHandle.DangerousGetHandle(), millisecondsTimeout) : current.Wait(new IntPtr[1] { safeWaitHandle.DangerousGetHandle() }, waitAll: false, millisecondsTimeout));
141 if (num == 128)
142 {
143 throw new AbandonedMutexException();
144 }
145 return num != 258;
146 }
147 finally
148 {
149 if (success)
150 {
151 safeWaitHandle.DangerousRelease();
152 }
153 }
154 }
155
157 {
160 int num = ((array != null) ? array.Length : 0);
161 if (num < capacity)
162 {
163 array = new SafeWaitHandle[Math.Max(capacity, Math.Min(64, 2 * num))];
164 }
165 return array;
166 }
167
168 private static void ReturnSafeWaitHandleArray(SafeWaitHandle[] safeWaitHandles)
169 {
170 t_safeWaitHandlesForRent = safeWaitHandles;
171 }
172
173 private static void ObtainSafeWaitHandles(ReadOnlySpan<WaitHandle> waitHandles, Span<SafeWaitHandle> safeWaitHandles, Span<IntPtr> unsafeWaitHandles)
174 {
175 bool success = true;
176 SafeWaitHandle safeWaitHandle = null;
177 try
178 {
179 for (int i = 0; i < waitHandles.Length; i++)
180 {
181 WaitHandle waitHandle = waitHandles[i];
182 if (waitHandle == null)
183 {
184 throw new ArgumentNullException("waitHandles[" + i + "]", SR.ArgumentNull_ArrayElement);
185 }
186 SafeWaitHandle safeWaitHandle2 = waitHandle._waitHandle ?? throw new ObjectDisposedException(null, SR.ObjectDisposed_Generic);
187 safeWaitHandle = safeWaitHandle2;
188 success = false;
189 safeWaitHandle2.DangerousAddRef(ref success);
190 safeWaitHandles[i] = safeWaitHandle2;
191 unsafeWaitHandles[i] = safeWaitHandle2.DangerousGetHandle();
192 }
193 }
194 catch
195 {
196 for (int j = 0; j < waitHandles.Length; j++)
197 {
198 SafeWaitHandle safeWaitHandle3 = safeWaitHandles[j];
199 if (safeWaitHandle3 == null)
200 {
201 break;
202 }
203 safeWaitHandle3.DangerousRelease();
204 safeWaitHandles[j] = null;
205 if (safeWaitHandle3 == safeWaitHandle)
206 {
207 safeWaitHandle = null;
208 success = true;
209 }
210 }
211 if (!success)
212 {
213 safeWaitHandle.DangerousRelease();
214 }
215 throw;
216 }
217 }
218
219 private static int WaitMultiple(WaitHandle[] waitHandles, bool waitAll, int millisecondsTimeout)
220 {
221 if (waitHandles == null)
222 {
223 throw new ArgumentNullException("waitHandles", SR.ArgumentNull_Waithandles);
224 }
225 return WaitMultiple(new ReadOnlySpan<WaitHandle>(waitHandles), waitAll, millisecondsTimeout);
226 }
227
228 private static int WaitMultiple(ReadOnlySpan<WaitHandle> waitHandles, bool waitAll, int millisecondsTimeout)
229 {
230 if (waitHandles.Length == 0)
231 {
232 throw new ArgumentException(SR.Argument_EmptyWaithandleArray, "waitHandles");
233 }
234 if (waitHandles.Length > 64)
235 {
237 }
238 if (millisecondsTimeout < -1)
239 {
241 }
243 bool flag = current?.IsWaitNotificationRequired() ?? false;
245 try
246 {
247 int num;
248 if (flag)
249 {
250 IntPtr[] array2 = new IntPtr[waitHandles.Length];
251 ObtainSafeWaitHandles(waitHandles, array, array2);
252 num = current.Wait(array2, waitAll, millisecondsTimeout);
253 }
254 else
255 {
256 Span<IntPtr> span = stackalloc IntPtr[waitHandles.Length];
257 ObtainSafeWaitHandles(waitHandles, array, span);
259 }
260 if (num >= 128 && num < 128 + waitHandles.Length)
261 {
262 if (waitAll)
263 {
264 throw new AbandonedMutexException();
265 }
266 num -= 128;
267 throw new AbandonedMutexException(num, waitHandles[num]);
268 }
269 return num;
270 }
271 finally
272 {
273 for (int i = 0; i < waitHandles.Length; i++)
274 {
275 SafeWaitHandle safeWaitHandle = array[i];
276 if (safeWaitHandle != null)
277 {
278 safeWaitHandle.DangerousRelease();
279 array[i] = null;
280 }
281 }
283 }
284 }
285
286 private static int WaitAnyMultiple(ReadOnlySpan<SafeWaitHandle> safeWaitHandles, int millisecondsTimeout)
287 {
289 if (current != null && current.IsWaitNotificationRequired())
290 {
291 IntPtr[] array = new IntPtr[safeWaitHandles.Length];
292 for (int i = 0; i < safeWaitHandles.Length; i++)
293 {
294 array[i] = safeWaitHandles[i].DangerousGetHandle();
295 }
296 return current.Wait(array, waitAll: false, millisecondsTimeout);
297 }
298 Span<IntPtr> waitHandles = stackalloc IntPtr[safeWaitHandles.Length];
299 for (int j = 0; j < safeWaitHandles.Length; j++)
300 {
301 waitHandles[j] = safeWaitHandles[j].DangerousGetHandle();
302 }
303 return WaitMultipleIgnoringSyncContext(waitHandles, waitAll: false, millisecondsTimeout);
304 }
305
306 private static bool SignalAndWait(WaitHandle toSignal, WaitHandle toWaitOn, int millisecondsTimeout)
307 {
308 if (toSignal == null)
309 {
310 throw new ArgumentNullException("toSignal");
311 }
312 if (toWaitOn == null)
313 {
314 throw new ArgumentNullException("toWaitOn");
315 }
316 if (millisecondsTimeout < -1)
317 {
319 }
320 SafeWaitHandle waitHandle = toSignal._waitHandle;
321 SafeWaitHandle waitHandle2 = toWaitOn._waitHandle;
322 if (waitHandle == null || waitHandle2 == null)
323 {
325 }
326 bool success = false;
327 bool success2 = false;
328 try
329 {
330 waitHandle.DangerousAddRef(ref success);
331 waitHandle2.DangerousAddRef(ref success2);
332 int num = SignalAndWaitCore(waitHandle.DangerousGetHandle(), waitHandle2.DangerousGetHandle(), millisecondsTimeout);
333 if (num == 128)
334 {
335 throw new AbandonedMutexException();
336 }
337 return num != 258;
338 }
339 finally
340 {
341 if (success2)
342 {
343 waitHandle2.DangerousRelease();
344 }
345 if (success)
346 {
347 waitHandle.DangerousRelease();
348 }
349 }
350 }
351
352 public virtual bool WaitOne(TimeSpan timeout)
353 {
355 }
356
357 public virtual bool WaitOne()
358 {
359 return WaitOneNoCheck(-1);
360 }
361
362 public virtual bool WaitOne(int millisecondsTimeout, bool exitContext)
363 {
365 }
366
367 public virtual bool WaitOne(TimeSpan timeout, bool exitContext)
368 {
370 }
371
372 public static bool WaitAll(WaitHandle[] waitHandles, int millisecondsTimeout)
373 {
374 return WaitMultiple(waitHandles, waitAll: true, millisecondsTimeout) != 258;
375 }
376
377 public static bool WaitAll(WaitHandle[] waitHandles, TimeSpan timeout)
378 {
379 return WaitMultiple(waitHandles, waitAll: true, ToTimeoutMilliseconds(timeout)) != 258;
380 }
381
382 public static bool WaitAll(WaitHandle[] waitHandles)
383 {
384 return WaitMultiple(waitHandles, waitAll: true, -1) != 258;
385 }
386
387 public static bool WaitAll(WaitHandle[] waitHandles, int millisecondsTimeout, bool exitContext)
388 {
389 return WaitMultiple(waitHandles, waitAll: true, millisecondsTimeout) != 258;
390 }
391
392 public static bool WaitAll(WaitHandle[] waitHandles, TimeSpan timeout, bool exitContext)
393 {
394 return WaitMultiple(waitHandles, waitAll: true, ToTimeoutMilliseconds(timeout)) != 258;
395 }
396
397 public static int WaitAny(WaitHandle[] waitHandles, int millisecondsTimeout)
398 {
399 return WaitMultiple(waitHandles, waitAll: false, millisecondsTimeout);
400 }
401
402 internal static int WaitAny(ReadOnlySpan<SafeWaitHandle> safeWaitHandles, int millisecondsTimeout)
403 {
404 return WaitAnyMultiple(safeWaitHandles, millisecondsTimeout);
405 }
406
407 public static int WaitAny(WaitHandle[] waitHandles, TimeSpan timeout)
408 {
409 return WaitMultiple(waitHandles, waitAll: false, ToTimeoutMilliseconds(timeout));
410 }
411
412 public static int WaitAny(WaitHandle[] waitHandles)
413 {
414 return WaitMultiple(waitHandles, waitAll: false, -1);
415 }
416
417 public static int WaitAny(WaitHandle[] waitHandles, int millisecondsTimeout, bool exitContext)
418 {
419 return WaitMultiple(waitHandles, waitAll: false, millisecondsTimeout);
420 }
421
422 public static int WaitAny(WaitHandle[] waitHandles, TimeSpan timeout, bool exitContext)
423 {
424 return WaitMultiple(waitHandles, waitAll: false, ToTimeoutMilliseconds(timeout));
425 }
426
427 public static bool SignalAndWait(WaitHandle toSignal, WaitHandle toWaitOn)
428 {
429 return SignalAndWait(toSignal, toWaitOn, -1);
430 }
431
432 public static bool SignalAndWait(WaitHandle toSignal, WaitHandle toWaitOn, TimeSpan timeout, bool exitContext)
433 {
434 return SignalAndWait(toSignal, toWaitOn, ToTimeoutMilliseconds(timeout));
435 }
436
437 public static bool SignalAndWait(WaitHandle toSignal, WaitHandle toWaitOn, int millisecondsTimeout, bool exitContext)
438 {
439 return SignalAndWait(toSignal, toWaitOn, millisecondsTimeout);
440 }
441}
static void SuppressFinalize(object obj)
Definition GC.cs:202
Definition GC.cs:8
static byte Min(byte val1, byte val2)
Definition Math.cs:912
static byte Max(byte val1, byte val2)
Definition Math.cs:738
void DangerousAddRef(ref bool success)
Definition SafeHandle.cs:76
static string ArgumentNull_Waithandles
Definition SR.cs:964
static string Threading_WaitHandleTooManyPosts
Definition SR.cs:1998
static string ArgumentNull_ArrayElement
Definition SR.cs:932
static string ArgumentOutOfRange_LessEqualToIntegerMaxVal
Definition SR.cs:1054
static string ArgumentOutOfRange_NeedNonNegOrNegative1
Definition SR.cs:1072
static string NotSupported_MaxWaitHandles
Definition SR.cs:1682
static string ObjectDisposed_Generic
Definition SR.cs:1742
static string Argument_EmptyWaithandleArray
Definition SR.cs:588
Definition SR.cs:7
static ? SynchronizationContext Current
virtual int Wait(IntPtr[] waitHandles, bool waitAll, int millisecondsTimeout)
static int WaitAny(WaitHandle[] waitHandles)
bool WaitOneNoCheck(int millisecondsTimeout)
static int WaitOneCore(IntPtr waitHandle, int millisecondsTimeout)
static bool WaitAll(WaitHandle[] waitHandles)
static int WaitAny(ReadOnlySpan< SafeWaitHandle > safeWaitHandles, int millisecondsTimeout)
static bool WaitAll(WaitHandle[] waitHandles, int millisecondsTimeout, bool exitContext)
static int WaitAny(WaitHandle[] waitHandles, int millisecondsTimeout)
static int WaitMultiple(WaitHandle[] waitHandles, bool waitAll, int millisecondsTimeout)
static bool SignalAndWait(WaitHandle toSignal, WaitHandle toWaitOn, int millisecondsTimeout, bool exitContext)
static int WaitAny(WaitHandle[] waitHandles, TimeSpan timeout, bool exitContext)
static bool SignalAndWait(WaitHandle toSignal, WaitHandle toWaitOn, int millisecondsTimeout)
static bool SignalAndWait(WaitHandle toSignal, WaitHandle toWaitOn)
static int SignalAndWaitCore(IntPtr waitHandleToSignal, IntPtr waitHandleToWaitOn, int millisecondsTimeout)
Definition WaitHandle.cs:80
virtual void Dispose(bool explicitDisposing)
static int ToTimeoutMilliseconds(TimeSpan timeout)
Definition WaitHandle.cs:93
SafeWaitHandle SafeWaitHandle
Definition WaitHandle.cs:54
static int WaitAnyMultiple(ReadOnlySpan< SafeWaitHandle > safeWaitHandles, int millisecondsTimeout)
static SafeWaitHandle[] RentSafeWaitHandleArray(int capacity)
virtual bool WaitOne(int millisecondsTimeout, bool exitContext)
static int WaitAny(WaitHandle[] waitHandles, int millisecondsTimeout, bool exitContext)
static unsafe int WaitMultipleIgnoringSyncContext(Span< IntPtr > waitHandles, bool waitAll, int millisecondsTimeout)
Definition WaitHandle.cs:69
virtual bool WaitOne(TimeSpan timeout, bool exitContext)
static unsafe int WaitMultipleIgnoringSyncContext(IntPtr *waitHandles, int numHandles, bool waitAll, int millisecondsTimeout)
static void ReturnSafeWaitHandleArray(SafeWaitHandle[] safeWaitHandles)
static int SignalAndWaitNative(IntPtr waitHandleToSignal, IntPtr waitHandleToWaitOn, int millisecondsTimeout)
SafeWaitHandle _waitHandle
Definition WaitHandle.cs:14
static bool WaitAll(WaitHandle[] waitHandles, TimeSpan timeout, bool exitContext)
static bool WaitAll(WaitHandle[] waitHandles, int millisecondsTimeout)
static void ObtainSafeWaitHandles(ReadOnlySpan< WaitHandle > waitHandles, Span< SafeWaitHandle > safeWaitHandles, Span< IntPtr > unsafeWaitHandles)
virtual bool WaitOne(int millisecondsTimeout)
static bool SignalAndWait(WaitHandle toSignal, WaitHandle toWaitOn, TimeSpan timeout, bool exitContext)
virtual bool WaitOne(TimeSpan timeout)
static SafeWaitHandle[] t_safeWaitHandlesForRent
Definition WaitHandle.cs:17
static bool WaitAll(WaitHandle[] waitHandles, TimeSpan timeout)
static int WaitMultiple(ReadOnlySpan< WaitHandle > waitHandles, bool waitAll, int millisecondsTimeout)
static readonly IntPtr InvalidHandle
Definition WaitHandle.cs:12
static int WaitAny(WaitHandle[] waitHandles, TimeSpan timeout)
int Length
Definition Span.cs:70