调整生命周期的管理

This commit is contained in:
anlicheng 2026-05-05 14:53:16 +08:00
parent 968b86755b
commit 3225d8fa17

View File

@ -56,19 +56,23 @@ actor SDLContextActor {
// //
private var udpHole: SDLUDPHole? private var udpHole: SDLUDPHole?
private var udpHoleMonitorTask: Task<Void, Never>?
private var udpHoleLocalAddress: SocketAddress? private var udpHoleLocalAddress: SocketAddress?
private var udpHoleV6: SDLUDPHoleV6? private var udpHoleV6: SDLUDPHoleV6?
// dnsclient // dnsclient
private var dnsClient: DNSCloudClient? private var dnsClient: DNSCloudClient?
private var dnsMonitorTask: Task<Void, Never>?
// Localdnsclient // Localdnsclient
private let publicDnsServers = ["223.5.5.5", "119.29.29.29"] private let publicDnsServers = ["223.5.5.5", "119.29.29.29"]
private var dnsLocalClient: DNSLocalClient? private var dnsLocalClient: DNSLocalClient?
private var dnsLocalMonitorTask: Task<Void, Never>?
private var quicClient: SDLQUICClient? private var quicClient: SDLQUICClient?
private var superMonitorTask: Task<Void, Never>?
nonisolated private let puncherActor: SDLPuncherActor nonisolated private let puncherActor: SDLPuncherActor
// //
nonisolated private let proberActor: SDLNATProberActor nonisolated private let proberActor: SDLNATProberActor
@ -88,9 +92,6 @@ actor SDLContextActor {
// //
nonisolated private let flowTracer = SDLFlowTracer() nonisolated private let flowTracer = SDLFlowTracer()
//
private var supervisor = SDLSupervisor()
nonisolated private let provider: NEPacketTunnelProvider nonisolated private let provider: NEPacketTunnelProvider
// //
@ -130,36 +131,11 @@ actor SDLContextActor {
await self.puncherActor.start() await self.puncherActor.start()
await self.arpServer.start() await self.arpServer.start()
await self.supervisor.addWorker(name: "dnsClient") { self.startDnsMonitor()
SDLLogger.log("[SDLContext] dnsClient running!!!!") self.startDnsLocalMonitor()
try await self.startDnsClient()
SDLLogger.log("[SDLContext] dnsClient closed!!!!")
}
await self.supervisor.addWorker(name: "dnsLocalClient") { self.startUDPHoleMonitor()
SDLLogger.log("[SDLContext] dnsLocalClient running!!!!") self.startSuperMonitor()
try await self.startDnsLocalClient()
SDLLogger.log("[SDLContext] dnsLocalClient closed!!!!")
}
// udp
await self.supervisor.addWorker(name: "udpHole") {
SDLLogger.log("[SDLContext] udp running!!!!")
try await self.startUDPHole()
SDLLogger.log("[SDLContext] udp closed!!!!")
}
await self.supervisor.addWorker(name: "quicClient") {
SDLLogger.log("[SDLContext] superClient running!!!!")
try await self.startQUICClient()
SDLLogger.log("[SDLContext] superClient closed!!!!")
}
// await self.supervisor.addWorker(name: "udpHoleV6") {
// SDLLogger.log("[SDLContext] udp v6 running!!!!")
// try await self.startUDPHoleV6()
// SDLLogger.log("[SDLContext] udp v6 closed!!!!")
// }
} }
// ip: 0.0.0.0 // ip: 0.0.0.0
@ -172,7 +148,19 @@ actor SDLContextActor {
try await self.setNetworkSettings(config: config, dnsServer: DNSHelper.dnsServer) try await self.setNetworkSettings(config: config, dnsServer: DNSHelper.dnsServer)
} }
private func startQUICClient() async throws { private func startSuperMonitor() {
guard self.superMonitorTask == nil else {
return
}
self.superMonitorTask = self.startMonitorTask(name: "superMonitorTask") {
SDLLogger.log("[SDLContext] superClient running!!!!")
try await self.startSuperClient()
SDLLogger.log("[SDLContext] superClient stop!!!!")
}
}
private func startSuperClient() async throws {
SDLLogger.log("[SDLContext] try start quicClient", for: .debug) SDLLogger.log("[SDLContext] try start quicClient", for: .debug)
// monitor // monitor
@ -309,6 +297,16 @@ actor SDLContextActor {
SDLLogger.log("[SDLContext] tunnelAppNotifier ready") SDLLogger.log("[SDLContext] tunnelAppNotifier ready")
} }
private func startDnsMonitor() {
guard self.dnsMonitorTask == nil else {
return
}
self.dnsMonitorTask = self.startMonitorTask(name: "dnsMonitorTask") {
try await self.startDnsClient()
}
}
private func startDnsClient() async throws { private func startDnsClient() async throws {
// dns // dns
let dnsClient = DNSCloudClient(host: self.config.serverHost, port: 15353) let dnsClient = DNSCloudClient(host: self.config.serverHost, port: 15353)
@ -332,6 +330,16 @@ actor SDLContextActor {
} }
} }
private func startDnsLocalMonitor() {
guard self.dnsLocalMonitorTask == nil else {
return
}
self.dnsLocalMonitorTask = self.startMonitorTask(name: "dnsLocalMonitorTask") {
try await self.startDnsLocalClient()
}
}
private func startDnsLocalClient() async throws { private func startDnsLocalClient() async throws {
let dnsServer = self.publicDnsServers.randomElement() ?? self.publicDnsServers[0] let dnsServer = self.publicDnsServers.randomElement() ?? self.publicDnsServers[0]
// dns // dns
@ -362,6 +370,16 @@ actor SDLContextActor {
} }
} }
private func startUDPHoleMonitor() {
guard self.udpHoleMonitorTask == nil else {
return
}
self.udpHoleMonitorTask = self.startMonitorTask(name: "udpHoleMonitorTask") {
try await self.startUDPHole()
}
}
private func startUDPHole() async throws { private func startUDPHole() async throws {
// udp // udp
let udpHole = try SDLUDPHole() let udpHole = try SDLUDPHole()
@ -485,29 +503,24 @@ actor SDLContextActor {
// context // context
public func stop() async { public func stop() async {
await self.supervisor.stop()
await self.puncherActor.stop() await self.puncherActor.stop()
await self.arpServer.clear() await self.arpServer.clear()
await self.sessionManager.clear() await self.sessionManager.clear()
self.flowSessionManager.clear() self.flowSessionManager.clear()
self.udpHole?.stop() self.udpHoleMonitorTask?.cancel()
self.udpHole = nil
self.udpHoleLocalAddress = nil self.udpHoleLocalAddress = nil
self.udpHoleV6?.stop() self.udpHoleV6?.stop()
self.udpHoleV6 = nil self.udpHoleV6 = nil
self.quicClient?.stop() self.dnsMonitorTask?.cancel()
self.quicClient = nil self.dnsLocalMonitorTask?.cancel()
self.dnsClient?.stop() self.superMonitorTask?.cancel()
self.dnsClient = nil self.udpHoleMonitorTask?.cancel()
await self.dnsLocalClient?.stop()
self.dnsLocalClient = nil
self.readTask?.cancel() self.readTask?.cancel()
self.readTask = nil self.readTask = nil
@ -737,6 +750,32 @@ actor SDLContextActor {
} }
} }
extension SDLContextActor {
func startMonitorTask(name: String, _ body: @escaping () async throws -> Void, retryDelay: Duration = .seconds(5)) -> Task<Void, Never> {
return Task(name: name) {
while true {
do {
try Task.checkCancellation()
try await body()
} catch is CancellationError {
break
} catch let err {
SDLLogger.log("[SDLContextActor] worker \(name) crashed: \(err.localizedDescription)", for: .debug)
do {
try await Task.sleep(for: retryDelay)
} catch is CancellationError {
break
} catch {
break
}
}
}
}
}
}
// Super // Super
extension SDLContextActor { extension SDLContextActor {