add supervisor
This commit is contained in:
parent
10278dfef0
commit
d930dbafad
@ -19,10 +19,9 @@ actor SDLContextActor {
|
||||
case registered
|
||||
}
|
||||
|
||||
nonisolated let config: SDLConfiguration
|
||||
|
||||
private var state: State = .unregistered
|
||||
|
||||
nonisolated let config: SDLConfiguration
|
||||
// nat的网络类型
|
||||
var natType: SDLNATProberActor.NatType = .blocked
|
||||
|
||||
@ -70,7 +69,8 @@ actor SDLContextActor {
|
||||
nonisolated private let flowTracer = SDLFlowTracer()
|
||||
|
||||
// 处理内部的需要长时间运行的任务
|
||||
private var loopChildWorkers: [Task<Void, Never>] = []
|
||||
private var supervisor = SDLSupervisor()
|
||||
|
||||
private let provider: NEPacketTunnelProvider
|
||||
|
||||
// 处理权限控制
|
||||
@ -102,37 +102,37 @@ actor SDLContextActor {
|
||||
self.snapshotPublisher = snapshotPublisher
|
||||
}
|
||||
|
||||
public func start() {
|
||||
public func start() async {
|
||||
self.startMonitor()
|
||||
|
||||
self.loopChildWorkers.append(spawnLoop {
|
||||
await self.supervisor.addWorker(name: "quicClient") {
|
||||
SDLLogger.shared.log("[SDLContext] try start quicClient")
|
||||
let quicClient = try await self.startQUICClient()
|
||||
SDLLogger.shared.log("[SDLContext] quicClient running!!!!")
|
||||
await quicClient.waitClose()
|
||||
SDLLogger.shared.log("[SDLContext] quicClient closed!!!!")
|
||||
})
|
||||
}
|
||||
|
||||
self.loopChildWorkers.append(spawnLoop {
|
||||
await self.supervisor.addWorker(name: "noticeClient") {
|
||||
let noticeClient = try self.startNoticeClient()
|
||||
SDLLogger.shared.log("[SDLContext] noticeClient running!!!!")
|
||||
try await noticeClient.waitClose()
|
||||
SDLLogger.shared.log("[SDLContext] noticeClient closed!!!!")
|
||||
})
|
||||
}
|
||||
|
||||
self.loopChildWorkers.append(spawnLoop {
|
||||
await self.supervisor.addWorker(name: "dnsClient") {
|
||||
let dnsClient = try await self.startDnsClient()
|
||||
SDLLogger.shared.log("[SDLContext] dns running!!!!")
|
||||
try await dnsClient.waitClose()
|
||||
SDLLogger.shared.log("[SDLContext] dns closed!!!!")
|
||||
})
|
||||
}
|
||||
|
||||
self.loopChildWorkers.append(spawnLoop {
|
||||
await self.supervisor.addWorker(name: "udpHole") {
|
||||
let udpHole = try await self.startUDPHole()
|
||||
SDLLogger.shared.log("[SDLContext] udp running!!!!")
|
||||
try await udpHole.waitClose()
|
||||
SDLLogger.shared.log("[SDLContext] udp closed!!!!")
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
private func startQUICClient() async throws -> SDLQUICClient {
|
||||
@ -305,8 +305,7 @@ actor SDLContextActor {
|
||||
|
||||
// 处理context的停止问题
|
||||
public func stop() async {
|
||||
self.loopChildWorkers.forEach { $0.cancel() }
|
||||
self.loopChildWorkers.removeAll()
|
||||
await self.supervisor.stop()
|
||||
|
||||
self.udpHoleWorkers?.forEach { $0.cancel() }
|
||||
self.udpHoleWorkers = nil
|
||||
|
||||
32
Tun/Punchnet/Actors/SDLSupervisor.swift
Normal file
32
Tun/Punchnet/Actors/SDLSupervisor.swift
Normal file
@ -0,0 +1,32 @@
|
||||
//
|
||||
// SDLSupervisor.swift
|
||||
// punchnet
|
||||
//
|
||||
// Created by 安礼成 on 2026/3/10.
|
||||
//
|
||||
|
||||
actor SDLSupervisor {
|
||||
private var loopChildWorkers: [Task<Void, Never>] = []
|
||||
|
||||
func addWorker(name: String, _ body: @escaping () async throws -> Void, retryDelay: Duration = .seconds(2)) {
|
||||
let worker = Task(name: name) {
|
||||
while !Task.isCancelled {
|
||||
do {
|
||||
try await body()
|
||||
} catch is CancellationError {
|
||||
break
|
||||
} catch let err {
|
||||
SDLLogger.shared.log("[Supervisor] worker \(name) crashed: \(err.localizedDescription)")
|
||||
try? await Task.sleep(for: retryDelay)
|
||||
}
|
||||
}
|
||||
}
|
||||
self.loopChildWorkers.append(worker)
|
||||
}
|
||||
|
||||
func stop() {
|
||||
self.loopChildWorkers.forEach { $0.cancel() }
|
||||
self.loopChildWorkers.removeAll()
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user