2005-03-04 Kazuki Oikawa <kazuki@panicode.com>
[mono.git] / mcs / class / corlib / System.Runtime.InteropServices / CriticalHandle.cs
1 //\r
2 // System.Runtime.InteropServices.CriticalHandle\r
3 //\r
4 // Author:\r
5 //   Kazuki Oikawa  (kazuki@panicode.com)\r
6 //\r
7 \r
8 #if NET_2_0\r
9 \r
10 using System;\r
11 using System.Runtime.ConstrainedExecution;\r
12 using System.Runtime.Serialization;\r
13 \r
14 namespace System.Runtime.InteropServices\r
15 {\r
16         public abstract class CriticalHandle : CriticalFinalizerObject, IDisposable\r
17         {\r
18                 protected IntPtr handle;\r
19                 bool _disposed = false;\r
20 \r
21                 protected CriticalHandle (IntPtr invalidHandleValue)\r
22                 {\r
23                         handle = invalidHandleValue;\r
24                 }\r
25 \r
26                 ~CriticalHandle ()\r
27                 {\r
28                         Dispose ();\r
29                 }\r
30 \r
31                 [ReliabilityContract (Consistency.WillNotCorruptState, CER.Success)]\r
32                 public void Close ()\r
33                 {\r
34                         Dispose ();\r
35                 }\r
36 \r
37                 [ReliabilityContract (Consistency.WillNotCorruptState, CER.Success)]\r
38                 public void Dispose ()\r
39                 {\r
40                         if (_disposed)\r
41                                 return;\r
42 \r
43                         _disposed = true;\r
44                         if (IsInvalid)\r
45                                 return;\r
46 \r
47                         if (ReleaseHandle ()) {\r
48                                 GC.SuppressFinalize (this);\r
49                         } else {\r
50                                 // Failed in release...\r
51                         }\r
52                 }\r
53 \r
54                 [ReliabilityContract (Consistency.WillNotCorruptState, CER.Success)]\r
55                 protected abstract bool ReleaseHandle ();\r
56 \r
57                 [ReliabilityContract (Consistency.WillNotCorruptState, CER.Success)]\r
58                 protected void SetHandle (IntPtr handle)\r
59                 {\r
60                         this.handle = handle;\r
61                 }\r
62 \r
63                 [ReliabilityContract (Consistency.WillNotCorruptState, CER.Success)]\r
64                 public void SetHandleAsInvalid()\r
65                 {\r
66                         _disposed = true;\r
67                 }\r
68 \r
69                 public bool IsClosed {\r
70                         [ReliabilityContract (Consistency.WillNotCorruptState, CER.Success)]\r
71                         get { return _disposed; }\r
72                 }\r
73 \r
74                 public abstract bool IsInvalid {\r
75                         [ReliabilityContract (Consistency.WillNotCorruptState, CER.Success)]\r
76                         get;\r
77                 }\r
78         }\r
79 }\r
80 #endif