Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
ThreadPoolBoundHandle.cs
Go to the documentation of this file.
2
3namespace System.Threading;
4
5public sealed class ThreadPoolBoundHandle : IDisposable
6{
7 private readonly SafeHandle _handle;
8
9 private bool _isDisposed;
10
12
17
19 {
20 if (handle == null)
21 {
22 throw new ArgumentNullException("handle");
23 }
24 if (handle.IsClosed || handle.IsInvalid)
25 {
26 throw new ArgumentException(SR.Argument_InvalidHandle, "handle");
27 }
28 return BindHandleCore(handle);
29 }
30
31 [CLSCompliant(false)]
32 public unsafe NativeOverlapped* AllocateNativeOverlapped(IOCompletionCallback callback, object? state, object? pinData)
33 {
34 return AllocateNativeOverlapped(callback, state, pinData, flowExecutionContext: true);
35 }
36
37 [CLSCompliant(false)]
38 public unsafe NativeOverlapped* UnsafeAllocateNativeOverlapped(IOCompletionCallback callback, object? state, object? pinData)
39 {
40 return AllocateNativeOverlapped(callback, state, pinData, flowExecutionContext: false);
41 }
42
43 private unsafe NativeOverlapped* AllocateNativeOverlapped(IOCompletionCallback callback, object state, object pinData, bool flowExecutionContext)
44 {
45 if (callback == null)
46 {
47 throw new ArgumentNullException("callback");
48 }
50 ThreadPoolBoundHandleOverlapped threadPoolBoundHandleOverlapped = new ThreadPoolBoundHandleOverlapped(callback, state, pinData, null, flowExecutionContext);
51 threadPoolBoundHandleOverlapped._boundHandle = this;
52 return threadPoolBoundHandleOverlapped._nativeOverlapped;
53 }
54
55 [CLSCompliant(false)]
57 {
58 if (preAllocated == null)
59 {
60 throw new ArgumentNullException("preAllocated");
61 }
63 preAllocated.AddRef();
64 try
65 {
66 ThreadPoolBoundHandleOverlapped overlapped = preAllocated._overlapped;
67 if (overlapped._boundHandle != null)
68 {
70 }
71 overlapped._boundHandle = this;
72 return overlapped._nativeOverlapped;
73 }
74 catch
75 {
76 preAllocated.Release();
77 throw;
78 }
79 }
80
81 [CLSCompliant(false)]
82 public unsafe void FreeNativeOverlapped(NativeOverlapped* overlapped)
83 {
84 if (overlapped == null)
85 {
86 throw new ArgumentNullException("overlapped");
87 }
88 ThreadPoolBoundHandleOverlapped overlappedWrapper = GetOverlappedWrapper(overlapped);
89 if (overlappedWrapper._boundHandle != this)
90 {
92 }
93 if (overlappedWrapper._preAllocated != null)
94 {
95 overlappedWrapper._preAllocated.Release();
96 }
97 else
98 {
99 Overlapped.Free(overlapped);
100 }
101 }
102
103 [CLSCompliant(false)]
104 public unsafe static object? GetNativeOverlappedState(NativeOverlapped* overlapped)
105 {
106 if (overlapped == null)
107 {
108 throw new ArgumentNullException("overlapped");
109 }
110 ThreadPoolBoundHandleOverlapped overlappedWrapper = GetOverlappedWrapper(overlapped);
111 return overlappedWrapper._userState;
112 }
113
115 {
116 try
117 {
119 }
120 catch (NullReferenceException innerException)
121 {
122 throw new ArgumentException(SR.Argument_NativeOverlappedAlreadyFree, "overlapped", innerException);
123 }
124 }
125
126 public void Dispose()
127 {
128 _isDisposed = true;
129 }
130
131 private void EnsureNotDisposed()
132 {
133 if (_isDisposed)
134 {
135 throw new ObjectDisposedException(GetType().ToString());
136 }
137 }
138
140 {
141 try
142 {
143 bool flag = ThreadPool.BindHandle(handle);
144 }
145 catch (Exception ex)
146 {
147 if (ex.HResult == -2147024890)
148 {
149 throw new ArgumentException(SR.Argument_InvalidHandle, "handle");
150 }
151 if (ex.HResult == -2147024809)
152 {
154 }
155 throw;
156 }
157 return new ThreadPoolBoundHandle(handle);
158 }
159}
static string Argument_PreAllocatedAlreadyAllocated
Definition SR.cs:842
static string Argument_NativeOverlappedWrongBoundHandle
Definition SR.cs:790
static string Argument_AlreadyBoundOrSyncHandle
Definition SR.cs:468
static string Argument_InvalidHandle
Definition SR.cs:24
static string Argument_NativeOverlappedAlreadyFree
Definition SR.cs:788
Definition SR.cs:7
static unsafe Overlapped Unpack(NativeOverlapped *nativeOverlappedPtr)
static unsafe void Free(NativeOverlapped *nativeOverlappedPtr)
readonly ThreadPoolBoundHandleOverlapped _overlapped
static ThreadPoolBoundHandle BindHandle(SafeHandle handle)
static ThreadPoolBoundHandle BindHandleCore(SafeHandle handle)
unsafe void FreeNativeOverlapped(NativeOverlapped *overlapped)
unsafe NativeOverlapped * AllocateNativeOverlapped(PreAllocatedOverlapped preAllocated)
unsafe NativeOverlapped * AllocateNativeOverlapped(IOCompletionCallback callback, object? state, object? pinData)
unsafe NativeOverlapped * AllocateNativeOverlapped(IOCompletionCallback callback, object state, object pinData, bool flowExecutionContext)
unsafe NativeOverlapped * UnsafeAllocateNativeOverlapped(IOCompletionCallback callback, object? state, object? pinData)
static unsafe ThreadPoolBoundHandleOverlapped GetOverlappedWrapper(NativeOverlapped *overlapped)
static unsafe? object GetNativeOverlappedState(NativeOverlapped *overlapped)
static bool BindHandle(IntPtr osHandle)
unsafe delegate void IOCompletionCallback(uint errorCode, uint numBytes, NativeOverlapped *pOVERLAP)