Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / Microsoft / Win32 / SafeHandles / SafeWaitHandle.cs / 1305376 / SafeWaitHandle.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** Class: SafeWaitHandle ** ** ** A wrapper for Win32 events (mutexes, auto reset events, and ** manual reset events). Used by WaitHandle. ** ** ===========================================================*/ using System; using System.Security; using System.Security.Permissions; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; using System.Runtime.ConstrainedExecution; using System.Runtime.Versioning; using Microsoft.Win32; using System.Threading; namespace Microsoft.Win32.SafeHandles { [System.Security.SecurityCritical] // auto-generated_required public sealed class SafeWaitHandle : SafeHandleZeroOrMinusOneIsInvalid { // Special case flags for Mutexes enables workaround for known OS bug at // http://support.microsoft.com/default.aspx?scid=kb;en-us;889318 // One machine-wide mutex serializes all OpenMutex and CloseHandle operations. // bIsMutex: if true, we need to grab machine-wide mutex before doing any Close ops. // Initialized to false by the runtime. private bool bIsMutex; // bIsMutex: if true, we need to avoid grabbing the machine-wide mutex before Close ops, // since that mutex is, of course, this very handle. // Initialized to false by the runtime. private bool bIsReservedMutex; // Called by P/Invoke marshaler private SafeWaitHandle() : base(true) { } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] public SafeWaitHandle(IntPtr existingHandle, bool ownsHandle) : base(ownsHandle) { SetHandle(existingHandle); } [System.Security.SecurityCritical] [ResourceExposure(ResourceScope.Machine)] [ResourceConsumption(ResourceScope.Machine)] override protected bool ReleaseHandle() { #if !FEATURE_CORECLR if (!bIsMutex || Environment.HasShutdownStarted) return Win32Native.CloseHandle(handle); bool bReturn = false; bool bMutexObtained = false; try { if (!bIsReservedMutex) { Mutex.AcquireReservedMutex(ref bMutexObtained); } bReturn = Win32Native.CloseHandle(handle); } finally { if (bMutexObtained) Mutex.ReleaseReservedMutex(); } return bReturn; #else return Win32Native.CloseHandle(handle); #endif } internal void SetAsMutex() { bIsMutex = true; } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] internal void SetAsReservedMutex() { bIsReservedMutex = true; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** Class: SafeWaitHandle ** ** ** A wrapper for Win32 events (mutexes, auto reset events, and ** manual reset events). Used by WaitHandle. ** ** ===========================================================*/ using System; using System.Security; using System.Security.Permissions; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; using System.Runtime.ConstrainedExecution; using System.Runtime.Versioning; using Microsoft.Win32; using System.Threading; namespace Microsoft.Win32.SafeHandles { [System.Security.SecurityCritical] // auto-generated_required public sealed class SafeWaitHandle : SafeHandleZeroOrMinusOneIsInvalid { // Special case flags for Mutexes enables workaround for known OS bug at // http://support.microsoft.com/default.aspx?scid=kb;en-us;889318 // One machine-wide mutex serializes all OpenMutex and CloseHandle operations. // bIsMutex: if true, we need to grab machine-wide mutex before doing any Close ops. // Initialized to false by the runtime. private bool bIsMutex; // bIsMutex: if true, we need to avoid grabbing the machine-wide mutex before Close ops, // since that mutex is, of course, this very handle. // Initialized to false by the runtime. private bool bIsReservedMutex; // Called by P/Invoke marshaler private SafeWaitHandle() : base(true) { } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] public SafeWaitHandle(IntPtr existingHandle, bool ownsHandle) : base(ownsHandle) { SetHandle(existingHandle); } [System.Security.SecurityCritical] [ResourceExposure(ResourceScope.Machine)] [ResourceConsumption(ResourceScope.Machine)] override protected bool ReleaseHandle() { #if !FEATURE_CORECLR if (!bIsMutex || Environment.HasShutdownStarted) return Win32Native.CloseHandle(handle); bool bReturn = false; bool bMutexObtained = false; try { if (!bIsReservedMutex) { Mutex.AcquireReservedMutex(ref bMutexObtained); } bReturn = Win32Native.CloseHandle(handle); } finally { if (bMutexObtained) Mutex.ReleaseReservedMutex(); } return bReturn; #else return Win32Native.CloseHandle(handle); #endif } internal void SetAsMutex() { bIsMutex = true; } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] internal void SetAsReservedMutex() { bIsReservedMutex = true; } } } // 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
- BookmarkManager.cs
- PositiveTimeSpanValidator.cs
- XmlFormatExtensionPrefixAttribute.cs
- CaseInsensitiveHashCodeProvider.cs
- WeakEventManager.cs
- XpsStructure.cs
- WaveHeader.cs
- initElementDictionary.cs
- AppearanceEditorPart.cs
- BevelBitmapEffect.cs
- ArcSegment.cs
- TextParaLineResult.cs
- BoundField.cs
- OracleRowUpdatedEventArgs.cs
- SoapSchemaExporter.cs
- WebPartConnectionsEventArgs.cs
- PreservationFileWriter.cs
- CharacterHit.cs
- SystemInformation.cs
- BuildResultCache.cs
- SiteIdentityPermission.cs
- DependencyPropertyHelper.cs
- MessageAction.cs
- TextAction.cs
- MD5CryptoServiceProvider.cs
- AbsoluteQuery.cs
- XamlWrappingReader.cs
- ZipArchive.cs
- SocketElement.cs
- CharacterMetricsDictionary.cs
- UrlMapping.cs
- WizardStepBase.cs
- DomainConstraint.cs
- httpserverutility.cs
- HealthMonitoringSection.cs
- UpdateRecord.cs
- RequestQueryParser.cs
- GeometryGroup.cs
- FactoryGenerator.cs
- RolePrincipal.cs
- InheritedPropertyChangedEventArgs.cs
- XhtmlBasicListAdapter.cs
- CloseSequence.cs
- isolationinterop.cs
- ChangeTracker.cs
- HttpClientChannel.cs
- DataReceivedEventArgs.cs
- BinHexDecoder.cs
- ConfigurationException.cs
- ObjectMemberMapping.cs
- IncrementalHitTester.cs
- DescendantOverDescendantQuery.cs
- _KerberosClient.cs
- TemplateBuilder.cs
- WebPartCollection.cs
- SqlUnionizer.cs
- GZipStream.cs
- XmlSchemaElement.cs
- TypeDelegator.cs
- XPathEmptyIterator.cs
- AsyncContentLoadedEventArgs.cs
- WmlPhoneCallAdapter.cs
- Int32Converter.cs
- QilReference.cs
- RangeBaseAutomationPeer.cs
- XPathNavigatorKeyComparer.cs
- DiscoveryEndpoint.cs
- ListViewGroupCollectionEditor.cs
- SqlDelegatedTransaction.cs
- smtppermission.cs
- ControlCachePolicy.cs
- ButtonChrome.cs
- EllipseGeometry.cs
- NamespaceCollection.cs
- ErrorFormatter.cs
- DataView.cs
- SafeNativeMethodsMilCoreApi.cs
- _ListenerResponseStream.cs
- XmlAttributeProperties.cs
- ObjectDataSourceDisposingEventArgs.cs
- EditingCommands.cs
- SR.cs
- ResourceReferenceExpression.cs
- QuadraticBezierSegment.cs
- PreviewPageInfo.cs
- ClientSideQueueItem.cs
- ResourceContainer.cs
- XmlWriterTraceListener.cs
- DocumentViewer.cs
- PageCatalogPart.cs
- UnsafeNetInfoNativeMethods.cs
- TransformConverter.cs
- JournalNavigationScope.cs
- FastEncoder.cs
- DbConnectionOptions.cs
- StreamInfo.cs
- AsyncCallback.cs
- WsatRegistrationHeader.cs
- Point3DIndependentAnimationStorage.cs
- EntityProviderServices.cs