30
30
import Darwin
31
31
#elseif canImport(Glibc)
32
32
import Glibc
33
+ #elseif os(Windows)
34
+ import WinSDK
33
35
#endif
34
36
37
+ #if os(Windows)
38
+ @usableFromInline
39
+ typealias LockPrimitive = SRWLOCK
40
+ #else
35
41
@usableFromInline
36
42
typealias LockPrimitive = pthread_mutex_t
43
+ #endif
37
44
38
45
@usableFromInline
39
46
enum LockOperations { }
@@ -43,35 +50,51 @@ extension LockOperations {
43
50
static func create( _ mutex: UnsafeMutablePointer < LockPrimitive > ) {
44
51
mutex. assertValidAlignment ( )
45
52
53
+ #if os(Windows)
54
+ InitializeSRWLock ( mutex)
55
+ #else
46
56
var attr = pthread_mutexattr_t ( )
47
57
pthread_mutexattr_init ( & attr)
48
58
49
59
let err = pthread_mutex_init ( mutex, & attr)
50
60
precondition ( err == 0 , " \( #function) failed in pthread_mutex with error \( err) " )
61
+ #endif
51
62
}
52
63
53
64
@inlinable
54
65
static func destroy( _ mutex: UnsafeMutablePointer < LockPrimitive > ) {
55
66
mutex. assertValidAlignment ( )
56
67
68
+ #if os(Windows)
69
+ // SRWLOCK does not need to be freed
70
+ #else
57
71
let err = pthread_mutex_destroy ( mutex)
58
72
precondition ( err == 0 , " \( #function) failed in pthread_mutex with error \( err) " )
73
+ #endif
59
74
}
60
75
61
76
@inlinable
62
77
static func lock( _ mutex: UnsafeMutablePointer < LockPrimitive > ) {
63
78
mutex. assertValidAlignment ( )
64
79
80
+ #if os(Windows)
81
+ AcquireSRWLockExclusive ( mutex)
82
+ #else
65
83
let err = pthread_mutex_lock ( mutex)
66
84
precondition ( err == 0 , " \( #function) failed in pthread_mutex with error \( err) " )
85
+ #endif
67
86
}
68
87
69
88
@inlinable
70
89
static func unlock( _ mutex: UnsafeMutablePointer < LockPrimitive > ) {
71
90
mutex. assertValidAlignment ( )
72
91
92
+ #if os(Windows)
93
+ ReleaseSRWLockExclusive ( mutex)
94
+ #else
73
95
let err = pthread_mutex_unlock ( mutex)
74
96
precondition ( err == 0 , " \( #function) failed in pthread_mutex with error \( err) " )
97
+ #endif
75
98
}
76
99
}
77
100
0 commit comments