Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / whidbey / NetFxQFE / ndp / clr / src / BCL / System / Threading / Monitor.cs / 1 / Monitor.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================================== ** ** Class: Monitor ** ** ** Purpose: Synchronizes access to a shared resource or region of code in a multi-threaded ** program. ** ** =============================================================================*/ namespace System.Threading { using System; using System.Security.Permissions; using System.Runtime.Remoting; using System.Threading; using System.Runtime.CompilerServices; using System.Runtime.ConstrainedExecution; [HostProtection(Synchronization=true, ExternalThreading=true)] [System.Runtime.InteropServices.ComVisible(true)] public static class Monitor { /*========================================================================= ** Obtain the monitor lock of obj. Will block if another thread holds the lock ** Will not block if the current thread holds the lock, ** however the caller must ensure that the same number of Exit ** calls are made as there were Enter calls. ** ** Exceptions: ArgumentNullException if object is null. =========================================================================*/ [MethodImplAttribute(MethodImplOptions.InternalCall)] public static extern void Enter(Object obj); // This should be made public in a future version. // Use a ref bool instead of out to ensure that unverifiable code must // initialize this value to something. If we used out, the value // could be uninitialized if we threw an exception in our prolog. [MethodImplAttribute(MethodImplOptions.InternalCall)] internal static extern void ReliableEnter(Object obj, ref bool tookLock); /*========================================================================= ** Release the monitor lock. If one or more threads are waiting to acquire the ** lock, and the current thread has executed as many Exits as ** Enters, one of the threads will be unblocked and allowed to proceed. ** ** Exceptions: ArgumentNullException if object is null. ** SynchronizationLockException if the current thread does not ** own the lock. =========================================================================*/ [MethodImplAttribute(MethodImplOptions.InternalCall)] [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] public static extern void Exit(Object obj); /*========================================================================= ** Similar to Enter, but will never block. That is, if the current thread can ** acquire the monitor lock without blocking, it will do so and TRUE will ** be returned. Otherwise FALSE will be returned. ** ** Exceptions: ArgumentNullException if object is null. =========================================================================*/ public static bool TryEnter(Object obj) { return TryEnterTimeout(obj, 0); } /*========================================================================== ** Version of TryEnter that will block, but only up to a timeout period ** expressed in milliseconds. If timeout == Timeout.Infinite the method ** becomes equivalent to Enter. ** ** Exceptions: ArgumentNullException if object is null. ** ArgumentException if timeout < 0. =========================================================================*/ public static bool TryEnter(Object obj, int millisecondsTimeout) { return TryEnterTimeout(obj, millisecondsTimeout); } public static bool TryEnter(Object obj, TimeSpan timeout) { long tm = (long)timeout.TotalMilliseconds; if (tm < -1 || tm > (long) Int32.MaxValue) throw new ArgumentOutOfRangeException("timeout", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1")); return TryEnterTimeout(obj, (int)tm); } [MethodImplAttribute(MethodImplOptions.InternalCall)] private static extern bool TryEnterTimeout(Object obj, int timeout); /*======================================================================= ** Waits for notification from the object (via a Pulse/PulseAll). ** timeout indicates how long to wait before the method returns. ** This method acquires the monitor waithandle for the object ** If this thread holds the monitor lock for the object, it releases it. ** On exit from the method, it obtains the monitor lock back. ** If exitContext is true then the synchronization domain for the context ** (if in a synchronized context) is exited before the wait and reacquired ** ** Exceptions: ArgumentNullException if object is null. ========================================================================*/ [MethodImplAttribute(MethodImplOptions.InternalCall)] private static extern bool ObjWait(bool exitContext, int millisecondsTimeout,Object obj); public static bool Wait(Object obj, int millisecondsTimeout, bool exitContext) { if (obj == null) throw (new ArgumentNullException("obj")); return ObjWait(exitContext, millisecondsTimeout, obj); } public static bool Wait(Object obj, TimeSpan timeout, bool exitContext) { long tm = (long)timeout.TotalMilliseconds; if (tm < -1 || tm > (long) Int32.MaxValue) throw new ArgumentOutOfRangeException("timeout", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1")); return Wait(obj, (int)tm, exitContext); } public static bool Wait(Object obj, int millisecondsTimeout) { return Wait(obj,millisecondsTimeout,false); } public static bool Wait(Object obj, TimeSpan timeout) { long tm = (long)timeout.TotalMilliseconds; if (tm < -1 || tm > (long) Int32.MaxValue) throw new ArgumentOutOfRangeException("timeout", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1")); return Wait(obj,(int)tm,false); } public static bool Wait(Object obj) { return Wait(obj,Timeout.Infinite,false); } /*======================================================================== ** Sends a notification to a single waiting object. * Exceptions: SynchronizationLockException if this method is not called inside * a synchronized block of code. ========================================================================*/ [MethodImplAttribute(MethodImplOptions.InternalCall)] private static extern void ObjPulse(Object obj); public static void Pulse(Object obj) { if (obj==null) { throw new ArgumentNullException("obj"); } ObjPulse(obj); } /*======================================================================== ** Sends a notification to all waiting objects. ========================================================================*/ [MethodImplAttribute(MethodImplOptions.InternalCall)] private static extern void ObjPulseAll(Object obj); public static void PulseAll(Object obj) { if (obj==null) { throw new ArgumentNullException("obj"); } ObjPulseAll(obj); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================================== ** ** Class: Monitor ** ** ** Purpose: Synchronizes access to a shared resource or region of code in a multi-threaded ** program. ** ** =============================================================================*/ namespace System.Threading { using System; using System.Security.Permissions; using System.Runtime.Remoting; using System.Threading; using System.Runtime.CompilerServices; using System.Runtime.ConstrainedExecution; [HostProtection(Synchronization=true, ExternalThreading=true)] [System.Runtime.InteropServices.ComVisible(true)] public static class Monitor { /*========================================================================= ** Obtain the monitor lock of obj. Will block if another thread holds the lock ** Will not block if the current thread holds the lock, ** however the caller must ensure that the same number of Exit ** calls are made as there were Enter calls. ** ** Exceptions: ArgumentNullException if object is null. =========================================================================*/ [MethodImplAttribute(MethodImplOptions.InternalCall)] public static extern void Enter(Object obj); // This should be made public in a future version. // Use a ref bool instead of out to ensure that unverifiable code must // initialize this value to something. If we used out, the value // could be uninitialized if we threw an exception in our prolog. [MethodImplAttribute(MethodImplOptions.InternalCall)] internal static extern void ReliableEnter(Object obj, ref bool tookLock); /*========================================================================= ** Release the monitor lock. If one or more threads are waiting to acquire the ** lock, and the current thread has executed as many Exits as ** Enters, one of the threads will be unblocked and allowed to proceed. ** ** Exceptions: ArgumentNullException if object is null. ** SynchronizationLockException if the current thread does not ** own the lock. =========================================================================*/ [MethodImplAttribute(MethodImplOptions.InternalCall)] [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] public static extern void Exit(Object obj); /*========================================================================= ** Similar to Enter, but will never block. That is, if the current thread can ** acquire the monitor lock without blocking, it will do so and TRUE will ** be returned. Otherwise FALSE will be returned. ** ** Exceptions: ArgumentNullException if object is null. =========================================================================*/ public static bool TryEnter(Object obj) { return TryEnterTimeout(obj, 0); } /*========================================================================== ** Version of TryEnter that will block, but only up to a timeout period ** expressed in milliseconds. If timeout == Timeout.Infinite the method ** becomes equivalent to Enter. ** ** Exceptions: ArgumentNullException if object is null. ** ArgumentException if timeout < 0. =========================================================================*/ public static bool TryEnter(Object obj, int millisecondsTimeout) { return TryEnterTimeout(obj, millisecondsTimeout); } public static bool TryEnter(Object obj, TimeSpan timeout) { long tm = (long)timeout.TotalMilliseconds; if (tm < -1 || tm > (long) Int32.MaxValue) throw new ArgumentOutOfRangeException("timeout", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1")); return TryEnterTimeout(obj, (int)tm); } [MethodImplAttribute(MethodImplOptions.InternalCall)] private static extern bool TryEnterTimeout(Object obj, int timeout); /*======================================================================= ** Waits for notification from the object (via a Pulse/PulseAll). ** timeout indicates how long to wait before the method returns. ** This method acquires the monitor waithandle for the object ** If this thread holds the monitor lock for the object, it releases it. ** On exit from the method, it obtains the monitor lock back. ** If exitContext is true then the synchronization domain for the context ** (if in a synchronized context) is exited before the wait and reacquired ** ** Exceptions: ArgumentNullException if object is null. ========================================================================*/ [MethodImplAttribute(MethodImplOptions.InternalCall)] private static extern bool ObjWait(bool exitContext, int millisecondsTimeout,Object obj); public static bool Wait(Object obj, int millisecondsTimeout, bool exitContext) { if (obj == null) throw (new ArgumentNullException("obj")); return ObjWait(exitContext, millisecondsTimeout, obj); } public static bool Wait(Object obj, TimeSpan timeout, bool exitContext) { long tm = (long)timeout.TotalMilliseconds; if (tm < -1 || tm > (long) Int32.MaxValue) throw new ArgumentOutOfRangeException("timeout", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1")); return Wait(obj, (int)tm, exitContext); } public static bool Wait(Object obj, int millisecondsTimeout) { return Wait(obj,millisecondsTimeout,false); } public static bool Wait(Object obj, TimeSpan timeout) { long tm = (long)timeout.TotalMilliseconds; if (tm < -1 || tm > (long) Int32.MaxValue) throw new ArgumentOutOfRangeException("timeout", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegOrNegative1")); return Wait(obj,(int)tm,false); } public static bool Wait(Object obj) { return Wait(obj,Timeout.Infinite,false); } /*======================================================================== ** Sends a notification to a single waiting object. * Exceptions: SynchronizationLockException if this method is not called inside * a synchronized block of code. ========================================================================*/ [MethodImplAttribute(MethodImplOptions.InternalCall)] private static extern void ObjPulse(Object obj); public static void Pulse(Object obj) { if (obj==null) { throw new ArgumentNullException("obj"); } ObjPulse(obj); } /*======================================================================== ** Sends a notification to all waiting objects. ========================================================================*/ [MethodImplAttribute(MethodImplOptions.InternalCall)] private static extern void ObjPulseAll(Object obj); public static void PulseAll(Object obj) { if (obj==null) { throw new ArgumentNullException("obj"); } ObjPulseAll(obj); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SectionXmlInfo.cs
- EventPrivateKey.cs
- ColorConverter.cs
- ActivityTypeCodeDomSerializer.cs
- LinkConverter.cs
- EntityContainerRelationshipSetEnd.cs
- MetadataSection.cs
- XPathDocumentBuilder.cs
- GrammarBuilder.cs
- DesignerRegionCollection.cs
- VectorConverter.cs
- OutputCacheProfile.cs
- Cursor.cs
- DrawingBrush.cs
- Application.cs
- SHA512Managed.cs
- ErrorInfoXmlDocument.cs
- IArgumentProvider.cs
- ToolStripStatusLabel.cs
- _Connection.cs
- AdPostCacheSubstitution.cs
- ActivityValidator.cs
- Tokenizer.cs
- RSACryptoServiceProvider.cs
- Transform.cs
- SqlCrossApplyToCrossJoin.cs
- DataGridViewDataErrorEventArgs.cs
- ViewgenGatekeeper.cs
- ComponentSerializationService.cs
- Random.cs
- XslVisitor.cs
- InstanceContextMode.cs
- WindowsButton.cs
- MasterPage.cs
- DrawingImage.cs
- DesignTimeResourceProviderFactoryAttribute.cs
- SqlCommand.cs
- StackBuilderSink.cs
- XmlQueryStaticData.cs
- DeflateInput.cs
- PersonalizableAttribute.cs
- DrawToolTipEventArgs.cs
- XmlSerializerOperationGenerator.cs
- Int32Rect.cs
- RbTree.cs
- PathFigureCollection.cs
- ThicknessKeyFrameCollection.cs
- DirectionalLight.cs
- DateTimeOffset.cs
- SchemaImporter.cs
- MatrixTransform3D.cs
- Clipboard.cs
- HelpProvider.cs
- OutputCacheProfileCollection.cs
- AppDomainFactory.cs
- SessionSymmetricMessageSecurityProtocolFactory.cs
- DataListItemEventArgs.cs
- DataGridColumnFloatingHeader.cs
- RotateTransform3D.cs
- OleDbCommandBuilder.cs
- AdvancedBindingPropertyDescriptor.cs
- ThemeInfoAttribute.cs
- NullableFloatSumAggregationOperator.cs
- ArrayWithOffset.cs
- XmlBinaryReader.cs
- ContextConfiguration.cs
- RSACryptoServiceProvider.cs
- CapabilitiesRule.cs
- InputScopeAttribute.cs
- ClientTarget.cs
- DeferredTextReference.cs
- PriorityBindingExpression.cs
- MetadataCache.cs
- SchemaImporter.cs
- SharedUtils.cs
- EdmComplexPropertyAttribute.cs
- Psha1DerivedKeyGeneratorHelper.cs
- InputElement.cs
- SqlNode.cs
- PathStreamGeometryContext.cs
- WebRequestModuleElementCollection.cs
- SqlAliasesReferenced.cs
- PropertyInformation.cs
- StringConcat.cs
- ClientFormsIdentity.cs
- DrawListViewSubItemEventArgs.cs
- ServiceNameCollection.cs
- HybridDictionary.cs
- ViewBase.cs
- GacUtil.cs
- precedingsibling.cs
- GroupJoinQueryOperator.cs
- DataServiceStreamResponse.cs
- OperationContextScope.cs
- HTMLTextWriter.cs
- SafeTimerHandle.cs
- UnsafeMethods.cs
- SingleStorage.cs
- ParserOptions.cs
- FilterQueryOptionExpression.cs