source: Include/Classes/ActiveBasic/Windows/CriticalSection.ab@ 288

Last change on this file since 288 was 288, checked in by dai, 17 years ago

いくつかタイプミスを修正。
エラーになるコードを排除、
enumクラスのビット演算メソッドをコメントアウト(仕様未確定なため)。

File size: 1.3 KB
Line 
1'Classes/ActiveBasic/Windows/CriticalSection.ab
2
3#require <Classes/System/index.ab>
4
5Namespace ActiveBasic
6Namespace Windows
7
8Namespace Detail
9 Const InterlockedExchangeAnyPointer(p, x) = InterlockedExchangePointer(VarPtr(p) As VoidPtr, x)
10End Namespace
11
12Class CriticalSection
13' Inherits System.IDisposable
14Public
15 Sub CriticalSection()
16 disposed = 0
17 InitializeCriticalSection(cs)
18 End Sub
19
20 Sub ~CriticalSection()
21 Dispose()
22 End Sub
23
24 /*Override*/ Sub Dispose()
25 If InterlockedIncrement(disposed) = 0 Then
26 DeleteCriticalSection(cs)
27 End If
28 End Sub
29
30 Function Enter() As ActiveBasic.Windows.CriticalSectionLock
31 Return New CriticalSectionLock(cs)
32 End Function
33Private
34 cs As CRITICAL_SECTION
35 disposed As Long
36End Class
37
38Class CriticalSectionLock
39' Inherits System.IDisposable
40Public
41 Sub CriticalSectionLock(ByRef cs As CRITICAL_SECTION)
42 pcs = VarPtr(cs)
43 EnterCriticalSection(cs)
44 End Sub
45
46 Sub ~CriticalSectionLock()
47 Dispose()
48 End Sub
49
50 Sub Leave()
51 Dispose()
52 End Sub
53
54 /*Override*/ Sub Dispose()
55 Dim p = Detail.InterlockedExchangeAnyPointer(pcs, 0)
56 If p <> 0 Then
57 LeaveCriticalSection(ByVal p)
58 End If
59 End Sub
60Private
61 pcs As *CRITICAL_SECTION
62End Class
63
64End Namespace 'Windows
65End Namespace 'ActiveBasic
Note: See TracBrowser for help on using the repository browser.