add supervisor
This commit is contained in:
parent
10278dfef0
commit
d930dbafad
@ -19,10 +19,9 @@ actor SDLContextActor {
|
|||||||
case registered
|
case registered
|
||||||
}
|
}
|
||||||
|
|
||||||
nonisolated let config: SDLConfiguration
|
|
||||||
|
|
||||||
private var state: State = .unregistered
|
private var state: State = .unregistered
|
||||||
|
|
||||||
|
nonisolated let config: SDLConfiguration
|
||||||
// nat的网络类型
|
// nat的网络类型
|
||||||
var natType: SDLNATProberActor.NatType = .blocked
|
var natType: SDLNATProberActor.NatType = .blocked
|
||||||
|
|
||||||
@ -70,7 +69,8 @@ actor SDLContextActor {
|
|||||||
nonisolated private let flowTracer = SDLFlowTracer()
|
nonisolated private let flowTracer = SDLFlowTracer()
|
||||||
|
|
||||||
// 处理内部的需要长时间运行的任务
|
// 处理内部的需要长时间运行的任务
|
||||||
private var loopChildWorkers: [Task<Void, Never>] = []
|
private var supervisor = SDLSupervisor()
|
||||||
|
|
||||||
private let provider: NEPacketTunnelProvider
|
private let provider: NEPacketTunnelProvider
|
||||||
|
|
||||||
// 处理权限控制
|
// 处理权限控制
|
||||||
@ -102,37 +102,37 @@ actor SDLContextActor {
|
|||||||
self.snapshotPublisher = snapshotPublisher
|
self.snapshotPublisher = snapshotPublisher
|
||||||
}
|
}
|
||||||
|
|
||||||
public func start() {
|
public func start() async {
|
||||||
self.startMonitor()
|
self.startMonitor()
|
||||||
|
|
||||||
self.loopChildWorkers.append(spawnLoop {
|
await self.supervisor.addWorker(name: "quicClient") {
|
||||||
SDLLogger.shared.log("[SDLContext] try start quicClient")
|
SDLLogger.shared.log("[SDLContext] try start quicClient")
|
||||||
let quicClient = try await self.startQUICClient()
|
let quicClient = try await self.startQUICClient()
|
||||||
SDLLogger.shared.log("[SDLContext] quicClient running!!!!")
|
SDLLogger.shared.log("[SDLContext] quicClient running!!!!")
|
||||||
await quicClient.waitClose()
|
await quicClient.waitClose()
|
||||||
SDLLogger.shared.log("[SDLContext] quicClient closed!!!!")
|
SDLLogger.shared.log("[SDLContext] quicClient closed!!!!")
|
||||||
})
|
}
|
||||||
|
|
||||||
self.loopChildWorkers.append(spawnLoop {
|
await self.supervisor.addWorker(name: "noticeClient") {
|
||||||
let noticeClient = try self.startNoticeClient()
|
let noticeClient = try self.startNoticeClient()
|
||||||
SDLLogger.shared.log("[SDLContext] noticeClient running!!!!")
|
SDLLogger.shared.log("[SDLContext] noticeClient running!!!!")
|
||||||
try await noticeClient.waitClose()
|
try await noticeClient.waitClose()
|
||||||
SDLLogger.shared.log("[SDLContext] noticeClient closed!!!!")
|
SDLLogger.shared.log("[SDLContext] noticeClient closed!!!!")
|
||||||
})
|
}
|
||||||
|
|
||||||
self.loopChildWorkers.append(spawnLoop {
|
await self.supervisor.addWorker(name: "dnsClient") {
|
||||||
let dnsClient = try await self.startDnsClient()
|
let dnsClient = try await self.startDnsClient()
|
||||||
SDLLogger.shared.log("[SDLContext] dns running!!!!")
|
SDLLogger.shared.log("[SDLContext] dns running!!!!")
|
||||||
try await dnsClient.waitClose()
|
try await dnsClient.waitClose()
|
||||||
SDLLogger.shared.log("[SDLContext] dns closed!!!!")
|
SDLLogger.shared.log("[SDLContext] dns closed!!!!")
|
||||||
})
|
}
|
||||||
|
|
||||||
self.loopChildWorkers.append(spawnLoop {
|
await self.supervisor.addWorker(name: "udpHole") {
|
||||||
let udpHole = try await self.startUDPHole()
|
let udpHole = try await self.startUDPHole()
|
||||||
SDLLogger.shared.log("[SDLContext] udp running!!!!")
|
SDLLogger.shared.log("[SDLContext] udp running!!!!")
|
||||||
try await udpHole.waitClose()
|
try await udpHole.waitClose()
|
||||||
SDLLogger.shared.log("[SDLContext] udp closed!!!!")
|
SDLLogger.shared.log("[SDLContext] udp closed!!!!")
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func startQUICClient() async throws -> SDLQUICClient {
|
private func startQUICClient() async throws -> SDLQUICClient {
|
||||||
@ -305,8 +305,7 @@ actor SDLContextActor {
|
|||||||
|
|
||||||
// 处理context的停止问题
|
// 处理context的停止问题
|
||||||
public func stop() async {
|
public func stop() async {
|
||||||
self.loopChildWorkers.forEach { $0.cancel() }
|
await self.supervisor.stop()
|
||||||
self.loopChildWorkers.removeAll()
|
|
||||||
|
|
||||||
self.udpHoleWorkers?.forEach { $0.cancel() }
|
self.udpHoleWorkers?.forEach { $0.cancel() }
|
||||||
self.udpHoleWorkers = nil
|
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