punchnet-macos/Tun/Punchnet/Policy/SnapshotPublisher.swift
2026-02-05 23:13:37 +08:00

33 lines
788 B
Swift

//
// SnapshotPublisher.swift
// punchnet
//
// Created by on 2026/2/5.
//
import Atomics
final class SnapshotPublisher<IdentitySnapshot: AnyObject> {
private let atomic: ManagedAtomic<Unmanaged<IdentitySnapshot>>
init(initial snapshot: IdentitySnapshot) {
self.atomic = ManagedAtomic(.passRetained(snapshot))
}
func publish(_ snapshot: IdentitySnapshot) {
let newRef = Unmanaged.passRetained(snapshot)
let oldRef = atomic.exchange(newRef, ordering: .acquiring)
oldRef.release()
}
@inline(__always)
func current() -> IdentitySnapshot {
atomic.load(ordering: .relaxed).takeUnretainedValue()
}
deinit {
let ref = atomic.load(ordering: .relaxed)
ref.release()
}
}