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);
+ 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);
-
- 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");
- }
-
- Monitor_pulse_all(obj);
- }
+ extern static void Monitor_pulse_all(object obj);
- public static bool TryEnter (object obj)
+ static void ObjPulseAll(Object obj)
{
- return TryEnter (obj, 0);
- }
-
- public static bool TryEnter (object obj, int millisecondsTimeout)
- {
- 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);
-
- public static bool Wait (object obj)
- {
- return Wait (obj, Timeout.Infinite);
- }
+ extern static bool Monitor_wait(object obj, int ms);
- public static bool Wait (object obj, int millisecondsTimeout)
+ static bool ObjWait(bool exitContext, int millisecondsTimeout, Object obj)
{
- 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 !DISABLE_REMOTING
if (exitContext)
SynchronizationAttribute.ExitContext ();
#endif
- return Wait (obj, millisecondsTimeout);
- }
- finally {
-#if !DISABLE_REMOTING
- if (exitContext)
- SynchronizationAttribute.EnterContext ();
-#endif
- }
- }
- public static bool Wait(object obj, TimeSpan timeout, bool exitContext) {
- try {
-#if !DISABLE_REMOTING
- if (exitContext)
- SynchronizationAttribute.ExitContext ();
-#endif
- return Wait (obj, timeout);
- }
- finally {
+ return Monitor_wait (obj, millisecondsTimeout);
+ } finally {
#if !DISABLE_REMOTING
if (exitContext)
SynchronizationAttribute.EnterContext ();
[MethodImplAttribute(MethodImplOptions.InternalCall)]
extern static void try_enter_with_atomic_var (object obj, int millisecondsTimeout, ref bool lockTaken);
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- extern static void enter_with_atomic_var (object obj, ref bool lockTaken);
-
- // Can't make this an icall since it has the same name as the other Enter method
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static void Enter (object obj, ref bool lockTaken)
+ static void ReliableEnterTimeout(Object obj, int timeout, ref bool lockTaken)
{
- enter_with_atomic_var (obj, 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);
}
}
}
[HostProtection(Synchronization=true, ExternalThreading=true)]
[System.Runtime.InteropServices.ComVisible(true)]
- public static class Monitor
+ public static partial class Monitor
{
/*=========================================================================
** Obtain the monitor lock of obj. Will block if another thread holds the lock
throw new ArgumentException(Environment.GetResourceString("Argument_MustBeFalse"), "lockTaken");
}
+#if !MONO
[System.Security.SecuritySafeCritical]
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private static extern void ReliableEnter(Object obj, ref bool lockTaken);
-
+#endif
/*=========================================================================
ReliableEnterTimeout(obj, MillisecondsTimeoutFromTimeSpan(timeout), ref lockTaken);
}
+#if !MONO
[System.Security.SecuritySafeCritical]
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private static extern void ReliableEnterTimeout(Object obj, int timeout, ref bool lockTaken);
+#endif
[System.Security.SecuritySafeCritical]
public static bool IsEntered(object obj)
return IsEnteredNative(obj);
}
+#if !MONO
[System.Security.SecurityCritical]
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private static extern bool IsEnteredNative(Object obj);
+#endif
/*========================================================================
** Waits for notification from the object (via a Pulse/PulseAll).
**
** Exceptions: ArgumentNullException if object is null.
========================================================================*/
+#if !MONO
[System.Security.SecurityCritical] // auto-generated
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private static extern bool ObjWait(bool exitContext, int millisecondsTimeout, Object obj);
+#endif
[System.Security.SecuritySafeCritical] // auto-generated
public static bool Wait(Object obj, int millisecondsTimeout, bool exitContext)
* Exceptions: SynchronizationLockException if this method is not called inside
* a synchronized block of code.
========================================================================*/
+#if !MONO
[System.Security.SecurityCritical] // auto-generated
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private static extern void ObjPulse(Object obj);
+#endif
[System.Security.SecuritySafeCritical] // auto-generated
public static void Pulse(Object obj)
/*========================================================================
** Sends a notification to all waiting objects.
========================================================================*/
+#if !MONO
[System.Security.SecurityCritical] // auto-generated
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private static extern void ObjPulseAll(Object obj);
+#endif
[System.Security.SecuritySafeCritical] // auto-generated
public static void PulseAll(Object obj)