调整变量的ARC

This commit is contained in:
anlicheng 2026-05-06 16:35:52 +08:00
parent b858be7310
commit a56f858910
2 changed files with 35 additions and 10 deletions

View File

@ -57,6 +57,7 @@ actor SDLContextActor {
// //
private var udpHole: SDLUDPHole? private var udpHole: SDLUDPHole?
private var udpHoleMonitorTask: Task<Void, Never>? private var udpHoleMonitorTask: Task<Void, Never>?
private var natProbeTask: Task<Void, Never>?
private var udpHoleLocalAddress: SocketAddress? private var udpHoleLocalAddress: SocketAddress?
private var udpHoleV6: SDLUDPHoleV6? private var udpHoleV6: SDLUDPHoleV6?
@ -381,9 +382,15 @@ actor SDLContextActor {
} }
// nat // nat
Task { self.natProbeTask?.cancel()
let proberActor = self.proberActor
self.natProbeTask = Task { [weak self] in
SDLLogger.log("[SDLContext] start probeNatType") SDLLogger.log("[SDLContext] start probeNatType")
await self.probeNatType() let natType = await proberActor.probeNatType(using: udpHole)
if Task.isCancelled {
return
}
await self?.setNatType(natType: natType)
} }
SDLLogger.log("[SDLContext] udpHole ready") SDLLogger.log("[SDLContext] udpHole ready")
@ -499,11 +506,21 @@ actor SDLContextActor {
self.udpHoleMonitorTask?.cancel() self.udpHoleMonitorTask?.cancel()
self.udpHoleMonitorTask = nil self.udpHoleMonitorTask = nil
self.natProbeTask?.cancel()
self.natProbeTask = nil
udpHoleV6?.stop() udpHoleV6?.stop()
await udpHole?.stop() await udpHole?.stop()
let dnsClient = self.dnsClient
self.dnsClient = nil
let dnsLocalClient = self.dnsLocalClient
self.dnsLocalClient = nil
self.dnsMonitorTask?.cancel() self.dnsMonitorTask?.cancel()
self.dnsMonitorTask = nil
self.dnsLocalMonitorTask?.cancel() self.dnsLocalMonitorTask?.cancel()
self.dnsLocalMonitorTask = nil
dnsClient?.stop()
await dnsLocalClient?.stop()
let quicClient = self.quicClient let quicClient = self.quicClient
self.quicClient = nil self.quicClient = nil
@ -564,10 +581,11 @@ actor SDLContextActor {
await self.ipv6AssistClient?.stop() await self.ipv6AssistClient?.stop()
self.ipv6AssistClient = SDLIPV6AssistClient(assistServerInfo: welcome.ipv6Assist) self.ipv6AssistClient = SDLIPV6AssistClient(assistServerInfo: welcome.ipv6Assist)
await self.ipv6AssistClient?.start() await self.ipv6AssistClient?.start()
let ipv6AssistClient = self.ipv6AssistClient
// welcome使ipv6 // welcome使ipv6
// //
self.stunRequestTask = Task.detached { self.stunRequestTask = Task.detached { [weak self] in
let timerStream = SDLAsyncTimerStream() let timerStream = SDLAsyncTimerStream()
timerStream.start(interval: .seconds(8)) timerStream.start(interval: .seconds(8))
@ -576,13 +594,13 @@ actor SDLContextActor {
break break
} }
let probeReply = try? await self.ipv6AssistClient?.probe(requestTimeout: .seconds(3)) let probeReply = try? await ipv6AssistClient?.probe(requestTimeout: .seconds(3))
if let v6Info = probeReply?.v6Info, let v6Address = SDLUtil.ipv6DataToString(v6Info.v6) { if let v6Info = probeReply?.v6Info, let v6Address = SDLUtil.ipv6DataToString(v6Info.v6) {
SDLLogger.log("[SDLContext] probe ipv6 address: \(v6Address)") SDLLogger.log("[SDLContext] probe ipv6 address: \(v6Address)")
} else { } else {
SDLLogger.log("[SDLContext] probe ipv6 address: empty") SDLLogger.log("[SDLContext] probe ipv6 address: empty")
} }
await self.sendStunRequest(probeReply: probeReply) await self?.sendStunRequest(probeReply: probeReply)
} }
SDLLogger.log("[SDLContext] udp stunRequestTask cancel") SDLLogger.log("[SDLContext] udp stunRequestTask cancel")
@ -617,16 +635,21 @@ actor SDLContextActor {
self.readTask?.cancel() self.readTask?.cancel()
// //
self.readTask = Task.detached(priority: .high) { let provider = self.provider
self.readTask = Task.detached(priority: .high) { [weak self] in
repeat { repeat {
if Task.isCancelled { if Task.isCancelled {
return return
} }
let (packets, numbers) = await self.provider.packetFlow.readPackets() let (packets, numbers) = await provider.packetFlow.readPackets()
if Task.isCancelled {
return
}
for (data, number) in zip(packets, numbers) where number == 2 { for (data, number) in zip(packets, numbers) where number == 2 {
if let ipPacket = IPPacket(data) { if let ipPacket = IPPacket(data) {
await self.dealTunPacket(packet: ipPacket) await self?.dealTunPacket(packet: ipPacket)
} }
} }
} while true } while true
@ -741,6 +764,7 @@ actor SDLContextActor {
self.udpHoleLocalAddress = nil self.udpHoleLocalAddress = nil
self.udpHoleV6 = nil self.udpHoleV6 = nil
self.dnsClient = nil self.dnsClient = nil
SDLLogger.log("[SDLContext] deinit", for: .debug)
} }
} }

View File

@ -19,13 +19,14 @@ class SDLAsyncTimerStream {
func start(interval: DispatchTimeInterval) { func start(interval: DispatchTimeInterval) {
timer.schedule(deadline: .now(), repeating: interval) timer.schedule(deadline: .now(), repeating: interval)
timer.setEventHandler { timer.setEventHandler { [weak self] in
self.cont.yield() self?.cont.yield()
} }
timer.resume() timer.resume()
} }
deinit { deinit {
self.cont.finish()
self.timer.cancel() self.timer.cancel()
} }