X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Threading%2FThreadPool.cs;h=7dfee45fc808f18c8f9e64f52a3fc26afed7434b;hb=2d23bfcbce7a3f7e54dcd5911adb88b244baca35;hp=9dc755dcaf4c94ed7497001cb8219d0200a4086e;hpb=5a7278b07806a3212d3c79066b46d5301ee21394;p=mono.git diff --git a/mcs/class/corlib/System.Threading/ThreadPool.cs b/mcs/class/corlib/System.Threading/ThreadPool.cs index 9dc755dcaf4..7dfee45fc80 100644 --- a/mcs/class/corlib/System.Threading/ThreadPool.cs +++ b/mcs/class/corlib/System.Threading/ThreadPool.cs @@ -38,26 +38,13 @@ using System.Security.Permissions; namespace System.Threading { -#if NET_2_0 public static class ThreadPool { -#else - public sealed class ThreadPool { - - private ThreadPool () - { - /* nothing to do */ - } -#endif - -#if NET_2_0 [Obsolete("This method is obsolete, use BindHandle(SafeHandle) instead")] -#endif public static bool BindHandle (IntPtr osHandle) { return true; } -#if NET_2_0 public static bool BindHandle (SafeHandle osHandle) { if (osHandle == null) @@ -65,11 +52,11 @@ namespace System.Threading { return true; } -#endif - + +#if !NET_2_1 [MethodImplAttribute(MethodImplOptions.InternalCall)] public static extern void GetAvailableThreads (out int workerThreads, out int completionPortThreads); - +#endif [MethodImplAttribute(MethodImplOptions.InternalCall)] public static extern void GetMaxThreads (out int workerThreads, out int completionPortThreads); @@ -81,12 +68,9 @@ namespace System.Threading { [SecurityPermission (SecurityAction.Demand, ControlThread=true)] public static extern bool SetMinThreads (int workerThreads, int completionPortThreads); -#if NET_2_0 - [MonoTODO("The max number of threads cannot be decremented.")] [MethodImplAttribute(MethodImplOptions.InternalCall)] [SecurityPermission (SecurityAction.Demand, ControlThread=true)] public static extern bool SetMaxThreads (int workerThreads, int completionPortThreads); -#endif public static bool QueueUserWorkItem (WaitCallback callBack) { @@ -95,15 +79,29 @@ namespace System.Threading { public static bool QueueUserWorkItem (WaitCallback callBack, object state) { -#if NET_2_1 && !MONOTOUCH + if (callBack == null) + throw new ArgumentNullException ("callBack"); + +#if MOONLIGHT callBack = MoonlightHandler (callBack); #endif - IAsyncResult ar = callBack.BeginInvoke (state, null, null); - if (ar == null) - return false; + if (callBack.IsTransparentProxy ()) { + IAsyncResult ar = callBack.BeginInvoke (state, null, null); + if (ar == null) + return false; + } else { + if (!callBack.HasSingleTarget) + throw new Exception ("The delegate must have only one target"); + + AsyncResult ares = new AsyncResult (callBack, state, true); + pool_queue (ares); + } return true; } + [MethodImplAttribute(MethodImplOptions.InternalCall)] + static extern void pool_queue (AsyncResult ares); + public static RegisteredWaitHandle RegisterWaitForSingleObject (WaitHandle waitObject, WaitOrTimerCallback callBack, object state, @@ -156,30 +154,37 @@ namespace System.Threading { (long) millisecondsTimeOutInterval, executeOnlyOnce); } -#if NET_2_0 +#if !NET_2_1 + [CLSCompliant (false)] unsafe public static bool UnsafeQueueNativeOverlapped (NativeOverlapped *overlapped) { throw new NotImplementedException (); } -#endif [SecurityPermission (SecurityAction.Demand, ControlEvidence=true, ControlPolicy=true)] public static bool UnsafeQueueUserWorkItem (WaitCallback callBack, object state) { // no stack propagation here (that's why it's unsafe and requires extra security permissions) - IAsyncResult ar = null; + if (!callBack.IsTransparentProxy ()) { + if (!callBack.HasSingleTarget) + throw new Exception ("The delegate must have only one target"); + + AsyncResult ares = new AsyncResult (callBack, state, false); + pool_queue (ares); + return true; + } try { if (!ExecutionContext.IsFlowSuppressed ()) ExecutionContext.SuppressFlow (); // on current thread only - - ar = callBack.BeginInvoke (state, null, null); - } - finally { + IAsyncResult ar = callBack.BeginInvoke (state, null, null); + if (ar == null) + return false; + } finally { if (ExecutionContext.IsFlowSuppressed ()) ExecutionContext.RestoreFlow (); } - return (ar != null); + return true; } [MonoTODO("Not implemented")] @@ -219,7 +224,9 @@ namespace System.Threading { throw new NotImplementedException (); } -#if NET_2_1 && !MONOTOUCH +#endif + +#if MOONLIGHT static WaitCallback MoonlightHandler (WaitCallback callback) { return delegate (object o) {