punchnet-macos/Tun/Snapshot/SnapshotPublisher.swift
2026-05-21 14:39:41 +08:00

33 lines
737 B
Swift

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