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 (!Monitor_test_synchronised (obj))
+ throw new SynchronizationLockException("Object is not synchronized");
- if (millisecondsTimeout < 0)
- throw new ArgumentException ("negative value for millisecondsTimeout", "millisecondsTimeout");
-
- return Monitor_try_enter (obj, millisecondsTimeout);
+ Monitor_pulse_all (obj);
}
- 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);
- }
-
- // 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 ();
}
}
-#if NET_4_0
[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);
- }
-
-#endif
-
[MethodImplAttribute(MethodImplOptions.InternalCall)]
extern static bool Monitor_test_owner (object obj);
-#if NET_4_5
- public
-#else
- internal
-#endif
- static bool IsEntered (object obj)
+ static bool IsEnteredNative(Object obj)
{
- return Monitor_test_owner(obj);
+ return Monitor_test_owner (obj);
}
}
}