Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,9 @@ extension ObservationRegistrar {
keyPath: KeyPath<Subject, Member>
) {
if let trackingPtr = _ThreadLocal.value?
.assumingMemoryBound(to: ObservationTracking.AccessList?.self) {
.assumingMemoryBound(to: ObservationTracking._AccessList?.self) {
if trackingPtr.pointee == nil {
trackingPtr.pointee = ObservationTracking.AccessList()
trackingPtr.pointee = ObservationTracking._AccessList()
}
trackingPtr.pointee?.addAccess(keyPath: keyPath, context: context)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,13 @@ public struct ObservationTracking {
}
}

struct AccessList {
var entries = [ObjectIdentifier : Entry]()
@_spi(SwiftUI)
public struct _AccessList: Sendable {
internal var entries = [ObjectIdentifier : Entry]()

internal init() { }

mutating func addAccess<Subject: Observable>(
internal mutating func addAccess<Subject: Observable>(
keyPath: PartialKeyPath<Subject>,
context: ObservationRegistrar<Subject>.Context
) {
Expand All @@ -53,13 +56,13 @@ public struct ObservationTracking {
_ apply: () -> T,
onChange: @autoclosure () -> @Sendable () -> Void
) -> T {
var accessList: AccessList?
let result = withUnsafeMutablePointer(to: &accessList) { ptr in
var _AccessList: _AccessList?
let result = withUnsafeMutablePointer(to: &_AccessList) { ptr in
_ThreadLocal.value = UnsafeMutableRawPointer(ptr)
defer { _ThreadLocal.value = nil }
return apply()
}
if let list = accessList {
if let list = _AccessList {
let state = _ManagedCriticalState([ObjectIdentifier: Int]())
let onChange = onChange()
let values = list.entries.mapValues { $0.addObserver {
Expand All @@ -74,11 +77,11 @@ public struct ObservationTracking {
return result
}

@_spi(SwiftUI)
public static func _installTracking(
_ storage: UnsafeRawPointer,
_ list: _AccessList,
onChange: @escaping @Sendable () -> Void
) {
let list = unsafeBitCast(storage, to: AccessList.self)
let state = _ManagedCriticalState([ObjectIdentifier: Int]())
let values = list.entries.mapValues { $0.addObserver {
onChange()
Expand Down