Skip to content

Commit c5018f3

Browse files
authored
[Observation] Ensure lock storage rounding works for non-integral lock types (#66832)
1 parent e6d282f commit c5018f3

File tree

1 file changed

+2
-25
lines changed

1 file changed

+2
-25
lines changed

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

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ internal struct _ManagedCriticalState<State> {
3333
}
3434

3535
internal init(_ initial: State) {
36-
self.init(LockedBuffer.create(minimumCapacity: Swift.max(_lockSize() / MemoryLayout<UnsafeRawPointer>.size, 1)) { buffer in
36+
let roundedSize = (_lockSize() + MemoryLayout<UnsafeRawPointer>.size - 1) / MemoryLayout<UnsafeRawPointer>.size
37+
self.init(LockedBuffer.create(minimumCapacity: Swift.max(roundedSize, 1)) { buffer in
3738
buffer.withUnsafeMutablePointerToElements { _lockInit(UnsafeRawPointer($0)) }
3839
return initial
3940
})
@@ -52,30 +53,6 @@ internal struct _ManagedCriticalState<State> {
5253
}
5354
}
5455

55-
@available(SwiftStdlib 5.9, *)
56-
internal protocol _Deinitializable {
57-
mutating func deinitialize()
58-
}
59-
60-
@available(SwiftStdlib 5.9, *)
61-
extension _ManagedCriticalState where State: _Deinitializable {
62-
final private class DeinitializingLockedBuffer:
63-
ManagedBuffer<State, UnsafeRawPointer> {
64-
deinit {
65-
withUnsafeMutablePointers { header, lock in
66-
header.pointee.deinitialize()
67-
}
68-
}
69-
}
70-
71-
internal init(managing initial: State) {
72-
self.init(DeinitializingLockedBuffer.create(minimumCapacity: Swift.max(_lockSize() / MemoryLayout<UnsafeRawPointer>.size, 1)) { buffer in
73-
buffer.withUnsafeMutablePointerToElements { _lockInit(UnsafeRawPointer($0)) }
74-
return initial
75-
})
76-
}
77-
}
78-
7956
@available(SwiftStdlib 5.9, *)
8057
extension _ManagedCriticalState: @unchecked Sendable where State: Sendable { }
8158

0 commit comments

Comments
 (0)