[mini]Add test for PtrToStruct<T>
[mono.git] / mcs / class / corlib / System.Threading / Monitor.cs
index 026f46c3797430f24db8ba3911b8a03bd84749fd..9ec94ff97f9985ce8764e276fc3cae5cfe8dd964 100644 (file)
@@ -37,200 +37,82 @@ using System.Runtime.InteropServices;
 
 namespace System.Threading
 {
-       [ComVisible (true)]
-       public static class Monitor
+       public static partial class Monitor
        {
-               // Grabs the mutex on object 'obj', with a maximum
-               // wait time 'ms' but doesn't block - if it can't get
-               // the lock it returns false, true if it can
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               private extern static bool Monitor_try_enter(object obj, int ms);
+               extern static bool Monitor_test_synchronised(object obj);
 
-               // Enter/Exit are implemented directly as icalls for performance reasons
-
-               // Acquires the mutex on object 'obj'
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               public extern static void Enter(object obj);
-
-               // Releases the mutex on object 'obj'
-               [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               public extern static void Exit(object obj);
-
-               // Signals one of potentially many objects waiting on
-               // object 'obj'
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               private extern static void Monitor_pulse(object obj);
-
-               // Checks whether object 'obj' is currently synchronised
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               private extern static bool Monitor_test_synchronised(object obj);
+               extern static void Monitor_pulse(object obj);
 
-               public static void Pulse(object obj) {
-                       if(obj==null) {
-                               throw new ArgumentNullException("obj");
-                       }
-                       if(Monitor_test_synchronised(obj)==false) {
+               static void ObjPulse(Object obj)
+               {
+                       if (!Monitor_test_synchronised (obj))
                                throw new SynchronizationLockException("Object is not synchronized");
-                       }
 
-                       Monitor_pulse(obj);
+                       Monitor_pulse (obj);
                }
 
-               // Signals all of potentially many objects waiting on
-               // object 'obj'
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               private extern static void Monitor_pulse_all(object obj);
-
-               public static void PulseAll(object obj) {
-                       if(obj==null) {
-                               throw new ArgumentNullException("obj");
-                       }
-                       if(Monitor_test_synchronised(obj)==false) {
-                               throw new SynchronizationLockException("Object is not synchronized");
-                       }
+               extern static void Monitor_pulse_all(object obj);
 
-                       Monitor_pulse_all(obj);
-               }
-
-               public static bool TryEnter (object obj)
-               {
-                       return TryEnter (obj, 0);
-               }
-
-               public static bool TryEnter (object obj, int millisecondsTimeout)
+               static void ObjPulseAll(Object obj)
                {
-                       if (obj == null)
-                               throw new ArgumentNullException ("obj");
-
-                       if (millisecondsTimeout == Timeout.Infinite) {
-                               Enter (obj);
-                               return true;
-                       }
-
-                       if (millisecondsTimeout < 0)
-                               throw new ArgumentException ("negative value for millisecondsTimeout", "millisecondsTimeout");
-                       
-                       return Monitor_try_enter (obj, millisecondsTimeout);
-               }
+                       if (!Monitor_test_synchronised (obj))
+                               throw new SynchronizationLockException("Object is not synchronized");
 
-               public static bool TryEnter (object obj, TimeSpan timeout)
-               {
-                       long ms = (long) timeout.TotalMilliseconds;
-                       if (ms < Timeout.Infinite || ms > Int32.MaxValue)
-                               throw new ArgumentOutOfRangeException ("timeout", "timeout out of range");
-                       
-                       return TryEnter (obj, (int) ms);
+                       Monitor_pulse_all (obj);
                }
 
-               // Waits for a signal on object 'obj' with maximum
-               // wait time 'ms'. Returns true if the object was
-               // signalled, false if it timed out
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               private extern static bool Monitor_wait(object obj, int ms);
+               extern static bool Monitor_wait(object obj, int ms);
 
-               public static bool Wait (object obj)
+               static bool ObjWait(bool exitContext, int millisecondsTimeout, Object obj)
                {
-                       return Wait (obj, Timeout.Infinite);
-               }
-
-               public static bool Wait (object obj, int millisecondsTimeout)
-               {
-                       if (obj == null)
-                               throw new ArgumentNullException ("obj");
-
-                       if (millisecondsTimeout < Timeout.Infinite)
-                               throw new ArgumentOutOfRangeException ("millisecondsTimeout", "timeout out of range");
-
+                       if (millisecondsTimeout < 0 && millisecondsTimeout != (int) Timeout.Infinite)
+                               throw new ArgumentOutOfRangeException ("millisecondsTimeout");
                        if (!Monitor_test_synchronised (obj))
                                throw new SynchronizationLockException ("Object is not synchronized");
 
-                       return Monitor_wait (obj, millisecondsTimeout);
-               }
-
-               public static bool Wait (object obj, TimeSpan timeout)
-               {
-                       long ms = (long) timeout.TotalMilliseconds;
-                       if (ms < Timeout.Infinite || ms > Int32.MaxValue)
-                               throw new ArgumentOutOfRangeException ("timeout", "timeout out of range");
-
-                       return Wait (obj, (int) ms);
-               }
-
-               public static bool Wait(object obj, int millisecondsTimeout, bool exitContext) {
                        try {
-                               if (exitContext) {
-#if MONOTOUCH
-                                       throw new NotSupportedException ("exitContext == true is not supported");
-#else
+#if !DISABLE_REMOTING
+                               if (exitContext)
                                        SynchronizationAttribute.ExitContext ();
 #endif
-                               }
-                               return Wait (obj, millisecondsTimeout);
-                       }
-                       finally {
-                               if (exitContext) SynchronizationAttribute.EnterContext ();
-                       }
-               }
 
-               public static bool Wait(object obj, TimeSpan timeout, bool exitContext) {
-                       try {
-                               if (exitContext) {
-#if MONOTOUCH
-                                       throw new NotSupportedException ("exitContext == true is not supported");
-#else
-                                       SynchronizationAttribute.ExitContext ();
+                               return Monitor_wait (obj, millisecondsTimeout);
+                       } finally {
+#if !DISABLE_REMOTING
+                               if (exitContext)
+                                       SynchronizationAttribute.EnterContext ();
 #endif
-                               }
-                               return Wait (obj, timeout);
-                       }
-                       finally {
-                               if (exitContext) SynchronizationAttribute.EnterContext ();
                        }
                }
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                extern static void try_enter_with_atomic_var (object obj, int millisecondsTimeout, ref bool lockTaken);
 
-               public static void Enter (object obj, ref bool lockTaken)
+               static void ReliableEnterTimeout(Object obj, int timeout, ref bool lockTaken)
                {
-                       TryEnter (obj, Timeout.Infinite, ref lockTaken);
-               }
+                       if (obj == null)
+                               throw new ArgumentNullException ("obj");
+                       if (timeout < 0 && timeout != (int) Timeout.Infinite)
+                               throw new ArgumentOutOfRangeException ("millisecondsTimeout");
 
-               public static void TryEnter (object obj, ref bool lockTaken)
-               {
-                       TryEnter (obj, 0, ref lockTaken);
+                       try_enter_with_atomic_var (obj, timeout, ref lockTaken);
                }
 
-               public static void TryEnter (object obj, TimeSpan timeout, ref bool lockTaken)
+               static void ReliableEnter(Object obj, ref bool lockTaken)
                {
-                       long ms = (long) timeout.TotalMilliseconds;
-                       if (ms < Timeout.Infinite || ms > Int32.MaxValue)
-                               throw new ArgumentOutOfRangeException ("timeout", "timeout out of range");
-                       TryEnter (obj, (int)ms, ref lockTaken);
+                       ReliableEnterTimeout (obj, (int) Timeout.Infinite, ref lockTaken);
                }
 
-               public static void TryEnter (object obj, int millisecondsTimeout, ref bool lockTaken)
-               {
-                       if (obj == null)
-                               throw new ArgumentNullException ("obj");
-                       if (lockTaken)
-                               throw new ArgumentException ("lockTaken");
-
-                       if (millisecondsTimeout < 0 && millisecondsTimeout != Timeout.Infinite)
-                               throw new ArgumentException ("negative value for millisecondsTimeout", "millisecondsTimeout");
-
-                       try_enter_with_atomic_var (obj, millisecondsTimeout, ref lockTaken);
-               }               
-
-
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                extern static bool Monitor_test_owner (object obj);
 
-               public
-               static bool IsEntered (object obj)
+               static bool IsEnteredNative(Object obj)
                {
-                       return Monitor_test_owner(obj);
+                       return Monitor_test_owner (obj);
                }
        }
 }