We need you! We're working hard on the next version of Developer Fusion -
Let us know what you think we should be up to!
- namespace System.Threading
- {
- using System.Security;
- using System.Threading;
- using System.Runtime.Remoting;
- using System.Security.Permissions;
- using System;
- using Microsoft.Win32;
- using System.Runtime.CompilerServices;
- using System.Runtime.ConstrainedExecution;
- using System.Runtime.InteropServices;
-
- internal sealed class RegisteredWaitHandleSafe : CriticalFinalizerObject
- {
- private static readonly IntPtr InvalidHandle = Win32Native.INVALID_HANDLE_VALUE;
- private IntPtr registeredWaitHandle;
- private WaitHandle m_internalWaitObject;
- private bool bReleaseNeeded = false;
- private int m_lock = 0;
-
- internal RegisteredWaitHandleSafe()
- {
- registeredWaitHandle = InvalidHandle;
- }
-
- internal IntPtr GetHandle()
- {
- return registeredWaitHandle;
- }
-
- internal void SetHandle(IntPtr handle)
- {
- registeredWaitHandle = handle;
- }
-
- [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
- internal void SetWaitObject(WaitHandle waitObject)
- {
-
- RuntimeHelpers.PrepareConstrainedRegions();
- try {
- }
- finally {
- m_internalWaitObject = waitObject;
- if (waitObject != null) {
- m_internalWaitObject.SafeWaitHandle.DangerousAddRef(ref bReleaseNeeded);
- }
- }
- }
-
- [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
-
- internal bool Unregister(WaitHandle waitObject)
- {
- bool result = false;
-
- RuntimeHelpers.PrepareConstrainedRegions();
- try {
- }
- finally {
-
-
- bool bLockTaken = false;
- do {
- if (Interlocked.CompareExchange(ref m_lock, 1, 0) == 0) {
- bLockTaken = true;
- try {
- if (ValidHandle()) {
- result = UnregisterWaitNative(GetHandle(), waitObject == null ? null : waitObject.SafeWaitHandle);
- if (result == true) {
- if (bReleaseNeeded) {
- m_internalWaitObject.SafeWaitHandle.DangerousRelease();
- bReleaseNeeded = false;
- }
-
- SetHandle(InvalidHandle);
- m_internalWaitObject = null;
- GC.SuppressFinalize(this);
- }
- }
- }
- finally {
- m_lock = 0;
- }
- }
- Thread.SpinWait(1);
-
- }
- while (!bLockTaken);
- }
- return result;
- }
-
- private bool ValidHandle()
- {
- return (registeredWaitHandle != InvalidHandle && registeredWaitHandle != IntPtr.Zero);
- }
-
- ~RegisteredWaitHandleSafe()
- {
-
-
-
-
-
-
-
-
-
-
- bool bLockTaken = false;
- do {
- if (Interlocked.CompareExchange(ref m_lock, 1, 0) == 0) {
- bLockTaken = true;
- try {
- if (ValidHandle()) {
- WaitHandleCleanupNative(registeredWaitHandle);
- if (bReleaseNeeded) {
- m_internalWaitObject.SafeWaitHandle.DangerousRelease();
- bReleaseNeeded = false;
- }
- SetHandle(InvalidHandle);
- m_internalWaitObject = null;
- }
- }
- finally {
- m_lock = 0;
- }
- }
- Thread.SpinWait(1);
-
- }
- while (!bLockTaken);
- }
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private static extern void WaitHandleCleanupNative(IntPtr handle);
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private static extern bool UnregisterWaitNative(IntPtr handle, SafeHandle waitObject);
- }
-
- [System.Runtime.InteropServices.ComVisible(true)]
- public sealed class RegisteredWaitHandle : MarshalByRefObject
- {
- private RegisteredWaitHandleSafe internalRegisteredWait;
-
- internal RegisteredWaitHandle()
- {
- internalRegisteredWait = new RegisteredWaitHandleSafe();
- }
-
- internal void SetHandle(IntPtr handle)
- {
- internalRegisteredWait.SetHandle(handle);
- }
-
- internal void SetWaitObject(WaitHandle waitObject)
- {
- internalRegisteredWait.SetWaitObject(waitObject);
- }
-
-
- [System.Runtime.InteropServices.ComVisible(true)]
-
-
- public bool Unregister(WaitHandle waitObject)
- {
- return internalRegisteredWait.Unregister(waitObject);
- }
- }
-
- [System.Runtime.InteropServices.ComVisible(true)]
- public delegate void WaitCallback(object state);
-
- [System.Runtime.InteropServices.ComVisible(true)]
- public delegate void WaitOrTimerCallback(object state, bool timedOut);
-
- internal class _ThreadPoolWaitCallback
- {
- WaitCallback _waitCallback;
- ExecutionContext _executionContext;
- object _state;
-
- static internal ContextCallback _ccb = new ContextCallback(WaitCallback_Context);
- static internal void WaitCallback_Context(object state)
- {
- _ThreadPoolWaitCallback obj = (_ThreadPoolWaitCallback)state;
- obj._waitCallback(obj._state);
- }
-
-
- internal _ThreadPoolWaitCallback(WaitCallback waitCallback, object state, bool compressStack, ref StackCrawlMark stackMark)
- {
- _waitCallback = waitCallback;
- _state = state;
- if (compressStack && !ExecutionContext.IsFlowSuppressed()) {
-
- _executionContext = ExecutionContext.Capture(ref stackMark);
- ExecutionContext.ClearSyncContext(_executionContext);
- }
- }
-
-
- static internal void PerformWaitCallback(object state)
- {
- _ThreadPoolWaitCallback helper = (_ThreadPoolWaitCallback)state;
-
- BCLDebug.Assert(helper != null, "Null state passed to PerformWaitCallback!");
-
- if (helper._executionContext == null) {
- WaitCallback callback = helper._waitCallback;
- callback(helper._state);
- }
- else {
- ExecutionContext.Run(helper._executionContext, _ccb, helper);
- }
- }
- }
-
- internal class _ThreadPoolWaitOrTimerCallback
- {
- WaitOrTimerCallback _waitOrTimerCallback;
- ExecutionContext _executionContext;
- object _state;
- private static ContextCallback _ccbt = new ContextCallback(WaitOrTimerCallback_Context_t);
- private static ContextCallback _ccbf = new ContextCallback(WaitOrTimerCallback_Context_f);
-
- internal _ThreadPoolWaitOrTimerCallback(WaitOrTimerCallback waitOrTimerCallback, object state, bool compressStack, ref StackCrawlMark stackMark)
- {
- _waitOrTimerCallback = waitOrTimerCallback;
- _state = state;
- if (compressStack && !ExecutionContext.IsFlowSuppressed()) {
-
- _executionContext = ExecutionContext.Capture(ref stackMark);
- ExecutionContext.ClearSyncContext(_executionContext);
- }
- }
- private static void WaitOrTimerCallback_Context_t(object state)
- {
- WaitOrTimerCallback_Context(state, true);
- }
- private static void WaitOrTimerCallback_Context_f(object state)
- {
- WaitOrTimerCallback_Context(state, false);
- }
-
- private static void WaitOrTimerCallback_Context(object state, bool timedOut)
- {
- _ThreadPoolWaitOrTimerCallback helper = (_ThreadPoolWaitOrTimerCallback)state;
- helper._waitOrTimerCallback(helper._state, timedOut);
- }
-
-
-
- static internal void PerformWaitOrTimerCallback(object state, bool timedOut)
- {
- _ThreadPoolWaitOrTimerCallback helper = (_ThreadPoolWaitOrTimerCallback)state;
- BCLDebug.Assert(helper != null, "Null state passed to PerformWaitOrTimerCallback!");
-
- if (helper._executionContext == null) {
- WaitOrTimerCallback callback = helper._waitOrTimerCallback;
- callback(helper._state, timedOut);
- }
- else {
- if (timedOut)
- ExecutionContext.Run(helper._executionContext.CreateCopy(), _ccbt, helper);
- else
- ExecutionContext.Run(helper._executionContext.CreateCopy(), _ccbf, helper);
- }
- }
- }
-
- [CLSCompliant(false)]
- [System.Runtime.InteropServices.ComVisible(true)]
-
-
-
- unsafe public delegate void IOCompletionCallback(uint errorCode, uint numBytes, NativeOverlapped* pOVERLAP);
-
- [HostProtection(Synchronization = true, ExternalThreading = true)]
- public static class ThreadPool
- {
-
- [SecurityPermissionAttribute(SecurityAction.Demand, ControlThread = true)]
- public static bool SetMaxThreads(int workerThreads, int completionPortThreads)
- {
- return SetMaxThreadsNative(workerThreads, completionPortThreads);
- }
-
- public static void GetMaxThreads(out int workerThreads, out int completionPortThreads)
- {
- GetMaxThreadsNative(out workerThreads, out completionPortThreads);
- }
-
- [SecurityPermissionAttribute(SecurityAction.Demand, ControlThread = true)]
- public static bool SetMinThreads(int workerThreads, int completionPortThreads)
- {
- return SetMinThreadsNative(workerThreads, completionPortThreads);
- }
-
- public static void GetMinThreads(out int workerThreads, out int completionPortThreads)
- {
- GetMinThreadsNative(out workerThreads, out completionPortThreads);
- }
-
- public static void GetAvailableThreads(out int workerThreads, out int completionPortThreads)
- {
- GetAvailableThreadsNative(out workerThreads, out completionPortThreads);
- }
-
- [CLSCompliant(false)]
-
-
- public static RegisteredWaitHandle RegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, object state, uint millisecondsTimeOutInterval, bool executeOnlyOnce)
- {
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return RegisterWaitForSingleObject(waitObject, callBack, state, millisecondsTimeOutInterval, executeOnlyOnce, ref stackMark, true);
- }
-
- [CLSCompliant(false), SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.ControlEvidence | SecurityPermissionFlag.ControlPolicy)]
-
-
- public static RegisteredWaitHandle UnsafeRegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, object state, uint millisecondsTimeOutInterval, bool executeOnlyOnce)
- {
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return RegisterWaitForSingleObject(waitObject, callBack, state, millisecondsTimeOutInterval, executeOnlyOnce, ref stackMark, false);
- }
-
-
-
-
- private static RegisteredWaitHandle RegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, object state, uint millisecondsTimeOutInterval, bool executeOnlyOnce, ref StackCrawlMark stackMark, bool compressStack)
- {
- if (RemotingServices.IsTransparentProxy(waitObject))
- throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_WaitOnTransparentProxy"));
- RegisteredWaitHandle registeredWaitHandle = new RegisteredWaitHandle();
-
- if (callBack != null) {
- _ThreadPoolWaitOrTimerCallback callBackHelper = new _ThreadPoolWaitOrTimerCallback(callBack, state, compressStack, ref stackMark);
- state = (object)callBackHelper;
-
-
- registeredWaitHandle.SetWaitObject(waitObject);
- IntPtr nativeRegisteredWaitHandle = RegisterWaitForSingleObjectNative(waitObject, state, millisecondsTimeOutInterval, executeOnlyOnce, registeredWaitHandle, ref stackMark, compressStack);
- registeredWaitHandle.SetHandle(nativeRegisteredWaitHandle);
- }
- else {
- throw new ArgumentNullException("WaitOrTimerCallback");
- }
- return registeredWaitHandle;
- }
-
-
-
-
-
- public static RegisteredWaitHandle RegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, object state, int millisecondsTimeOutInterval, bool executeOnlyOnce)
- {
- if (millisecondsTimeOutInterval < -1)
- throw new ArgumentOutOfRangeException("millisecondsTimeOutInterval", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1"));
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return RegisterWaitForSingleObject(waitObject, callBack, state, (UInt32)millisecondsTimeOutInterval, executeOnlyOnce, ref stackMark, true);
- }
-
- [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.ControlEvidence | SecurityPermissionFlag.ControlPolicy)]
-
-
- public static RegisteredWaitHandle UnsafeRegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, object state, int millisecondsTimeOutInterval, bool executeOnlyOnce)
- {
- if (millisecondsTimeOutInterval < -1)
- throw new ArgumentOutOfRangeException("millisecondsTimeOutInterval", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1"));
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return RegisterWaitForSingleObject(waitObject, callBack, state, (UInt32)millisecondsTimeOutInterval, executeOnlyOnce, ref stackMark, false);
- }
-
-
-
- public static RegisteredWaitHandle RegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, object state, long millisecondsTimeOutInterval, bool executeOnlyOnce)
- {
- if (millisecondsTimeOutInterval < -1)
- throw new ArgumentOutOfRangeException("millisecondsTimeOutInterval", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1"));
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return RegisterWaitForSingleObject(waitObject, callBack, state, (UInt32)millisecondsTimeOutInterval, executeOnlyOnce, ref stackMark, true);
- }
-
- [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.ControlEvidence | SecurityPermissionFlag.ControlPolicy)]
-
-
- public static RegisteredWaitHandle UnsafeRegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, object state, long millisecondsTimeOutInterval, bool executeOnlyOnce)
- {
- if (millisecondsTimeOutInterval < -1)
- throw new ArgumentOutOfRangeException("millisecondsTimeOutInterval", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1"));
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return RegisterWaitForSingleObject(waitObject, callBack, state, (UInt32)millisecondsTimeOutInterval, executeOnlyOnce, ref stackMark, false);
- }
-
-
- public static RegisteredWaitHandle RegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, object state, TimeSpan timeout, bool executeOnlyOnce)
- {
- long tm = (long)timeout.TotalMilliseconds;
- if (tm < -1)
- throw new ArgumentOutOfRangeException("timeout", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1"));
- if (tm > (long)Int32.MaxValue)
- throw new ArgumentOutOfRangeException("timeout", Environment.GetResourceString("ArgumentOutOfRange_LessEqualToIntegerMaxVal"));
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return RegisterWaitForSingleObject(waitObject, callBack, state, (UInt32)tm, executeOnlyOnce, ref stackMark, true);
- }
-
- [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.ControlEvidence | SecurityPermissionFlag.ControlPolicy)]
- public static RegisteredWaitHandle UnsafeRegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, object state, TimeSpan timeout, bool executeOnlyOnce)
- {
- long tm = (long)timeout.TotalMilliseconds;
- if (tm < -1)
- throw new ArgumentOutOfRangeException("timeout", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1"));
- if (tm > (long)Int32.MaxValue)
- throw new ArgumentOutOfRangeException("timeout", Environment.GetResourceString("ArgumentOutOfRange_LessEqualToIntegerMaxVal"));
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return RegisterWaitForSingleObject(waitObject, callBack, state, (UInt32)tm, executeOnlyOnce, ref stackMark, false);
- }
-
-
- public static bool QueueUserWorkItem(WaitCallback callBack, object state)
- {
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return QueueUserWorkItemHelper(callBack, state, ref stackMark, true);
- }
-
-
- public static bool QueueUserWorkItem(WaitCallback callBack)
- {
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return QueueUserWorkItemHelper(callBack, null, ref stackMark, true);
- }
-
- [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.ControlEvidence | SecurityPermissionFlag.ControlPolicy)]
-
- public static bool UnsafeQueueUserWorkItem(WaitCallback callBack, object state)
- {
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return QueueUserWorkItemHelper(callBack, state, ref stackMark, false);
- }
-
- private static bool QueueUserWorkItemHelper(WaitCallback callBack, object state, ref StackCrawlMark stackMark, bool compressStack)
- {
- if (callBack != null) {
- _ThreadPoolWaitCallback callBackHelper = new _ThreadPoolWaitCallback(callBack, state, compressStack, ref stackMark);
- state = (object)callBackHelper;
- return QueueUserWorkItem(state, ref stackMark, compressStack);
- }
- else {
- throw new ArgumentNullException("WaitCallback");
- }
-
- }
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private static extern bool QueueUserWorkItem(object state, ref StackCrawlMark stackMark, bool compressStack);
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- unsafe private static extern bool PostQueuedCompletionStatus(NativeOverlapped* overlapped);
-
- [CLSCompliant(false)]
- [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.ControlEvidence | SecurityPermissionFlag.ControlPolicy)]
- unsafe public static bool UnsafeQueueNativeOverlapped(NativeOverlapped* overlapped)
- {
- return PostQueuedCompletionStatus(overlapped);
- }
-
-
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private static extern bool SetMinThreadsNative(int workerThreads, int completionPortThreads);
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private static extern bool SetMaxThreadsNative(int workerThreads, int completionPortThreads);
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private static extern void GetMinThreadsNative(out int workerThreads, out int completionPortThreads);
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private static extern void GetMaxThreadsNative(out int workerThreads, out int completionPortThreads);
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private static extern void GetAvailableThreadsNative(out int workerThreads, out int completionPortThreads);
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private static extern IntPtr RegisterWaitForSingleObjectNative(WaitHandle waitHandle, object state, uint timeOutInterval, bool executeOnlyOnce, RegisteredWaitHandle registeredWaitHandle, ref StackCrawlMark stackMark, bool compressStack);
-
- [Obsolete("ThreadPool.BindHandle(IntPtr) has been deprecated. Please use ThreadPool.BindHandle(SafeHandle) instead.", false)]
- [SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
- public static bool BindHandle(IntPtr osHandle)
- {
- return BindIOCompletionCallbackNative(osHandle);
- }
-
- [SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
- public static bool BindHandle(SafeHandle osHandle)
- {
- if (osHandle == null)
- throw new ArgumentNullException("osHandle");
-
- bool ret = false;
- bool mustReleaseSafeHandle = false;
- RuntimeHelpers.PrepareConstrainedRegions();
- try {
- osHandle.DangerousAddRef(ref mustReleaseSafeHandle);
- ret = BindIOCompletionCallbackNative(osHandle.DangerousGetHandle());
- }
- finally {
- if (mustReleaseSafeHandle)
- osHandle.DangerousRelease();
- }
- return ret;
- }
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
- private static extern bool BindIOCompletionCallbackNative(IntPtr fileHandle);
- }
- }