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

Last change on this file since 297 was 297, checked in by NoWest, 17 years ago

タイプミスを修正

File size: 1.3 KB
RevLine 
[261]1'Classes/ActiveBasic/Windows/CriticalSection.ab
2
3#require <Classes/System/index.ab>
4
5Namespace ActiveBasic
6Namespace Windows
7
[269]8Namespace Detail
9 Const InterlockedExchangeAnyPointer(p, x) = InterlockedExchangePointer(VarPtr(p) As VoidPtr, x)
10End Namespace
11
[261]12Class CriticalSection
[269]13' Inherits System.IDisposable
[261]14Public
15 Sub CriticalSection()
16 disposed = 0
17 InitializeCriticalSection(cs)
18 End Sub
19
20 Sub ~CriticalSection()
21 Dispose()
22 End Sub
23
[269]24 /*Override*/ Sub Dispose()
[261]25 If InterlockedIncrement(disposed) = 0 Then
26 DeleteCriticalSection(cs)
27 End If
28 End Sub
29
[269]30 Function Enter() As ActiveBasic.Windows.CriticalSectionLock
[261]31 Return New CriticalSectionLock(cs)
32 End Function
33Private
34 cs As CRITICAL_SECTION
35 disposed As Long
36End Class
37
38Class CriticalSectionLock
[269]39' Inherits System.IDisposable
[261]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
[269]54 /*Override*/ Sub Dispose()
[297]55 Dim pcs = Detail.InterlockedExchangeAnyPointer(pcs, 0)
56 If pcs <> 0 Then
57 LeaveCriticalSection(ByVal pcs)
[261]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.