Skip to content

Commit bbe45fc

Browse files
authored
[Observation] Correct potential alignment of locks to ensure that os_unfair_lock is properly at an aligned address (#64153)
1 parent a5765ab commit bbe45fc

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

stdlib/public/Observation/Sources/Observation/Locking.swift

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,16 @@ func _lockUnlock(_: UnsafeRawPointer)
2424

2525
@available(SwiftStdlib 5.9, *)
2626
internal struct _ManagedCriticalState<State> {
27-
final private class LockedBuffer: ManagedBuffer<State, UInt8> { }
27+
final private class LockedBuffer: ManagedBuffer<State, UnsafeRawPointer> { }
2828

29-
private let buffer: ManagedBuffer<State, UInt8>
29+
private let buffer: ManagedBuffer<State, UnsafeRawPointer>
3030

31-
internal init(_ buffer: ManagedBuffer<State, UInt8>) {
31+
internal init(_ buffer: ManagedBuffer<State, UnsafeRawPointer>) {
3232
self.buffer = buffer
3333
}
3434

3535
internal init(_ initial: State) {
36-
self.init(LockedBuffer.create(minimumCapacity: _lockSize()) { buffer in
36+
self.init(LockedBuffer.create(minimumCapacity: Swift.max(_lockSize() / MemoryLayout<UnsafeRawPointer>.size, 1)) { buffer in
3737
buffer.withUnsafeMutablePointerToElements { _lockInit(UnsafeRawPointer($0)) }
3838
return initial
3939
})
@@ -44,7 +44,9 @@ internal struct _ManagedCriticalState<State> {
4444
) rethrows -> R {
4545
try buffer.withUnsafeMutablePointers { header, lock in
4646
_lockLock(UnsafeRawPointer(lock))
47-
defer { _lockUnlock(UnsafeRawPointer(lock)) }
47+
defer {
48+
_lockUnlock(UnsafeRawPointer(lock))
49+
}
4850
return try critical(&header.pointee)
4951
}
5052
}
@@ -58,7 +60,7 @@ internal protocol _Deinitializable {
5860
@available(SwiftStdlib 5.9, *)
5961
extension _ManagedCriticalState where State: _Deinitializable {
6062
final private class DeinitializingLockedBuffer:
61-
ManagedBuffer<State, UInt8> {
63+
ManagedBuffer<State, UnsafeRawPointer> {
6264
deinit {
6365
withUnsafeMutablePointers { header, lock in
6466
header.pointee.deinitialize()
@@ -67,7 +69,7 @@ extension _ManagedCriticalState where State: _Deinitializable {
6769
}
6870

6971
internal init(managing initial: State) {
70-
self.init(DeinitializingLockedBuffer.create(minimumCapacity: _lockSize()) { buffer in
72+
self.init(DeinitializingLockedBuffer.create(minimumCapacity: Swift.max(_lockSize() / MemoryLayout<UnsafeRawPointer>.size, 1)) { buffer in
7173
buffer.withUnsafeMutablePointerToElements { _lockInit(UnsafeRawPointer($0)) }
7274
return initial
7375
})

0 commit comments

Comments
 (0)