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
- Figure.cs
- ValidatorCompatibilityHelper.cs
- MultiplexingFormatMapping.cs
- _NativeSSPI.cs
- CustomBindingElement.cs
- PageRanges.cs
- MemberHolder.cs
- updatecommandorderer.cs
- DataGridViewCellValidatingEventArgs.cs
- TreeChangeInfo.cs
- EditCommandColumn.cs
- SEHException.cs
- AccessViolationException.cs
- MergePropertyDescriptor.cs
- ActivityMarkupSerializer.cs
- CodeExpressionStatement.cs
- LicFileLicenseProvider.cs
- SmtpSection.cs
- SimpleTypeResolver.cs
- String.cs
- SlotInfo.cs
- WebPartDisplayModeCancelEventArgs.cs
- RowsCopiedEventArgs.cs
- ChtmlCalendarAdapter.cs
- ScalarConstant.cs
- MimeFormatExtensions.cs
- Stroke.cs
- RangeValuePattern.cs
- GenericAuthenticationEventArgs.cs
- BitmapData.cs
- WeakKeyDictionary.cs
- StateMachine.cs
- Model3DGroup.cs
- DataGridRowHeaderAutomationPeer.cs
- Type.cs
- SqlNotificationEventArgs.cs
- DataGridViewImageCell.cs
- SecurityContext.cs
- WpfXamlLoader.cs
- Attribute.cs
- OdbcCommand.cs
- ControlCachePolicy.cs
- CompiledXpathExpr.cs
- WebPartManager.cs
- GeneralTransform3DGroup.cs
- BamlBinaryReader.cs
- NominalTypeEliminator.cs
- EdmSchemaError.cs
- DrawingContextDrawingContextWalker.cs
- VoiceSynthesis.cs
- SoapEnumAttribute.cs
- Normalization.cs
- Win32MouseDevice.cs
- PartialClassGenerationTask.cs
- PagesChangedEventArgs.cs
- DiagnosticTraceSchemas.cs
- SqlLiftIndependentRowExpressions.cs
- CellParagraph.cs
- GroupedContextMenuStrip.cs
- Cursors.cs
- OutputScope.cs
- Automation.cs
- InvalidFilterCriteriaException.cs
- ProtocolElement.cs
- PriorityQueue.cs
- RelatedImageListAttribute.cs
- PoisonMessageException.cs
- LocalizabilityAttribute.cs
- XmlSignificantWhitespace.cs
- ReadOnlyHierarchicalDataSourceView.cs
- XmlNodeList.cs
- DataException.cs
- ValueChangedEventManager.cs
- SerializableAuthorizationContext.cs
- NameScopePropertyAttribute.cs
- DefaultMemberAttribute.cs
- GroupBox.cs
- MetadataSerializer.cs
- DesignerForm.cs
- SqlUtils.cs
- DescendantQuery.cs
- InputBindingCollection.cs
- GridItem.cs
- XmlElementAttribute.cs
- CompoundFileStorageReference.cs
- InkCanvasSelection.cs
- PageClientProxyGenerator.cs
- FilePrompt.cs
- ClientUtils.cs
- CompositeCollectionView.cs
- DataGridViewEditingControlShowingEventArgs.cs
- IEnumerable.cs
- MatrixTransform.cs
- _ServiceNameStore.cs
- ToolBarPanel.cs
- PaperSource.cs
- PropertiesTab.cs
- CodeDelegateInvokeExpression.cs
- NumberSubstitution.cs
- KeyValueConfigurationElement.cs