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
- SchemaTypeEmitter.cs
- CqlGenerator.cs
- ErrorFormatterPage.cs
- SelectionRange.cs
- Rotation3DAnimationUsingKeyFrames.cs
- ModelPropertyImpl.cs
- Binding.cs
- basecomparevalidator.cs
- ThaiBuddhistCalendar.cs
- EventLogQuery.cs
- TimeIntervalCollection.cs
- unitconverter.cs
- HyperLinkField.cs
- DateTimeAutomationPeer.cs
- ColumnWidthChangedEvent.cs
- RelatedCurrencyManager.cs
- ConnectionConsumerAttribute.cs
- DropShadowBitmapEffect.cs
- TimeoutException.cs
- WebServiceParameterData.cs
- PKCS1MaskGenerationMethod.cs
- PaintEvent.cs
- HelpInfo.cs
- SerializationException.cs
- GraphicsState.cs
- StylusPointProperties.cs
- WpfKnownMember.cs
- ClientTargetSection.cs
- documentation.cs
- remotingproxy.cs
- HtmlInputImage.cs
- LeaseManager.cs
- DataTrigger.cs
- SQLDouble.cs
- ScriptControl.cs
- XmlBufferReader.cs
- IdentitySection.cs
- HtmlButton.cs
- FilterQueryOptionExpression.cs
- TraceInternal.cs
- PasswordBoxAutomationPeer.cs
- ServiceModelConfigurationSectionCollection.cs
- TableRow.cs
- KnownTypeHelper.cs
- TextTrailingCharacterEllipsis.cs
- SqlInfoMessageEvent.cs
- HttpValueCollection.cs
- FlowDocumentFormatter.cs
- SpeakProgressEventArgs.cs
- StreamHelper.cs
- DBPropSet.cs
- SingleAnimationUsingKeyFrames.cs
- Parser.cs
- PointAnimationUsingPath.cs
- PrefixHandle.cs
- HttpServerUtilityWrapper.cs
- MsmqAppDomainProtocolHandler.cs
- UnaryNode.cs
- DesignerView.Commands.cs
- DataControlFieldCell.cs
- UniqueCodeIdentifierScope.cs
- DataBinding.cs
- ElementHost.cs
- TextEndOfLine.cs
- TriggerAction.cs
- TextBreakpoint.cs
- DeviceContext2.cs
- DictionaryGlobals.cs
- DodSequenceMerge.cs
- SqlBulkCopyColumnMappingCollection.cs
- WindowsImpersonationContext.cs
- COM2IPerPropertyBrowsingHandler.cs
- SeverityFilter.cs
- HttpMethodAttribute.cs
- OrderedDictionary.cs
- XmlReflectionImporter.cs
- ContextMenu.cs
- TypeInitializationException.cs
- BinaryExpressionHelper.cs
- TreeViewImageKeyConverter.cs
- AppearanceEditorPart.cs
- FontWeights.cs
- ControlUtil.cs
- AdapterSwitches.cs
- Label.cs
- SdlChannelSink.cs
- WindowsFormsHostPropertyMap.cs
- XpsS0ValidatingLoader.cs
- CodeExpressionCollection.cs
- JsonQNameDataContract.cs
- WebBrowserBase.cs
- SizeKeyFrameCollection.cs
- WaitForChangedResult.cs
- RuleSettings.cs
- TypeConverterHelper.cs
- CardSpacePolicyElement.cs
- ColorAnimationBase.cs
- Misc.cs
- EntityAdapter.cs
- C14NUtil.cs