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
- ObjectStateFormatter.cs
- BamlVersionHeader.cs
- CompModSwitches.cs
- AgileSafeNativeMemoryHandle.cs
- StrokeNode.cs
- PerformanceCounterLib.cs
- ServicePerformanceCounters.cs
- QilXmlWriter.cs
- ProfilePropertySettings.cs
- ContainerVisual.cs
- DiscoveryExceptionDictionary.cs
- KeyNotFoundException.cs
- FileUtil.cs
- FontSizeConverter.cs
- CallSite.cs
- PassportPrincipal.cs
- SqlCacheDependencySection.cs
- ExpandCollapseProviderWrapper.cs
- IArgumentProvider.cs
- ObjectContextServiceProvider.cs
- SpAudioStreamWrapper.cs
- DataSourceConverter.cs
- HostElement.cs
- BitmapEffectInputData.cs
- CqlGenerator.cs
- PersonalizationState.cs
- TagMapCollection.cs
- WebPartTracker.cs
- XmlSchemaObjectCollection.cs
- SelectionHighlightInfo.cs
- EnumMember.cs
- HttpHostedTransportConfiguration.cs
- RSACryptoServiceProvider.cs
- ConnectionStringsExpressionBuilder.cs
- HostUtils.cs
- TextElement.cs
- PopupRootAutomationPeer.cs
- EntryPointNotFoundException.cs
- SqlDataSourceWizardForm.cs
- MyContact.cs
- ServiceHttpHandlerFactory.cs
- CommandManager.cs
- SupportingTokenParameters.cs
- EnumType.cs
- GridViewRowEventArgs.cs
- HyperLinkDesigner.cs
- QueryRewriter.cs
- PartitionResolver.cs
- XmlDictionaryReaderQuotas.cs
- WindowsTitleBar.cs
- FormParameter.cs
- SerializationSectionGroup.cs
- EntityContainerEmitter.cs
- BindingExpressionUncommonField.cs
- RSAProtectedConfigurationProvider.cs
- CacheMemory.cs
- PathGeometry.cs
- ReadOnlyNameValueCollection.cs
- QuadraticBezierSegment.cs
- AuthorizationRuleCollection.cs
- Cursors.cs
- IisTraceWebEventProvider.cs
- ALinqExpressionVisitor.cs
- CodeEntryPointMethod.cs
- XPathNodeIterator.cs
- ListViewCancelEventArgs.cs
- StateBag.cs
- ReliableChannelListener.cs
- XmlElementCollection.cs
- HttpApplicationFactory.cs
- OperationAbortedException.cs
- SQLResource.cs
- DesignerLabelAdapter.cs
- ConstructorNeedsTagAttribute.cs
- ExpressionPrinter.cs
- Label.cs
- ILGenerator.cs
- Table.cs
- RowToParametersTransformer.cs
- AdornerLayer.cs
- ErrorTableItemStyle.cs
- SqlPersonalizationProvider.cs
- Grant.cs
- CommandBinding.cs
- Vector3DValueSerializer.cs
- TypeCodeDomSerializer.cs
- GridErrorDlg.cs
- HtmlString.cs
- ConsumerConnectionPointCollection.cs
- Animatable.cs
- MenuItem.cs
- BuiltInExpr.cs
- DefaultTextStore.cs
- Visitor.cs
- TabPanel.cs
- RoleManagerSection.cs
- SocketCache.cs
- SqlBuffer.cs
- UpdateTracker.cs
- CngAlgorithmGroup.cs