// Kazuki Oikawa (kazuki@panicode.com)
//
-#if NET_2_0
using System;
using System.Runtime.ConstrainedExecution;
protected IntPtr handle;
bool _disposed = false;
+ [ReliabilityContract (Consistency.WillNotCorruptState, Cer.MayFail)]
protected CriticalHandle (IntPtr invalidHandleValue)
{
handle = invalidHandleValue;
[ReliabilityContract (Consistency.WillNotCorruptState, Cer.Success)]
~CriticalHandle ()
{
- Dispose ();
+ Dispose (false);
}
[ReliabilityContract (Consistency.WillNotCorruptState, Cer.Success)]
public void Close ()
{
- Dispose ();
+ Dispose (true);
}
[ReliabilityContract (Consistency.WillNotCorruptState, Cer.Success)]
public void Dispose ()
{
- if (_disposed)
- return;
+ Dispose (true);
+ }
- _disposed = true;
- if (IsInvalid)
+ [ReliabilityContract (Consistency.WillNotCorruptState, Cer.Success)]
+ protected virtual void Dispose (bool disposing)
+ {
+ if (_disposed)
return;
- if (ReleaseHandle ()) {
- GC.SuppressFinalize (this);
- } else {
- // Failed in release...
+ if (!IsInvalid){
+ if (!_disposed && !ReleaseHandle ()) {
+ GC.SuppressFinalize (this);
+ } else {
+ // Failed in release...
+ }
}
+ _disposed = true;
}
[ReliabilityContract (Consistency.WillNotCorruptState, Cer.Success)]
}
}
}
-#endif