fix PacketOutboundActor

This commit is contained in:
anlicheng 2026-05-27 15:29:20 +08:00
parent 8183e3b3bf
commit eb2896fad6
2 changed files with 21 additions and 48 deletions

View File

@ -228,6 +228,8 @@ actor SDLContextActor {
let superService = self.superService
let udpHoleService = self.udpHoleService
let packetOutboundActor = self.packetOutboundActor
let readySignal = self.readySignal
try await withThrowingTaskGroup(of: Void.self) { group in
defer {
@ -246,6 +248,11 @@ actor SDLContextActor {
}
}
group.addTask(priority: .high) {
_ = try await readySignal.wait()
try await packetOutboundActor.runPacketReader()
}
try await group.waitForAll()
}
}
@ -283,7 +290,6 @@ actor SDLContextActor {
self.updatePolicyWorker = nil
await self.policyService.clear()
await self.packetOutboundActor.stop()
await self.udpHoleService.stop()
let dnsService = self.dnsService
@ -434,7 +440,6 @@ extension SDLContextActor {
do {
try await self.tunNetworkManager.apply(settings: .init(config: self.config), dnsServer: DNSHelper.dnsServer)
SDLLogger.log("[SDLContext] setNetworkSettings successed")
await self.packetOutboundActor.startPacketReader()
//
await self.whenRegistedSuper()
await self.readySignal.succeed(())

View File

@ -26,8 +26,6 @@ actor PacketOutboundActor {
private let superService: SDLSuperService
private let udpHoleService: SDLUDPHoleService
private let flowTracer: SDLFlowTracer
private var packetReaderTask: Task<Void, Never>?
private var packetReaderGeneration: UInt64 = 0
private var networkAddress: SDLConfiguration.NetworkAddress
private var identityId: UInt32
@ -73,48 +71,26 @@ actor PacketOutboundActor {
self.dnsService = dnsService
}
func startPacketReader() async {
guard self.packetReaderTask == nil else {
return
}
self.packetReaderGeneration &+= 1
func runPacketReader() async throws {
let provider = self.provider
let generation = self.packetReaderGeneration
self.packetReaderTask = Task(priority: .high) { [weak self] in
while !Task.isCancelled {
guard let batch = await Self.readPackets(from: provider) else {
break
}
if Task.isCancelled {
break
}
for (data, number) in zip(batch.packets, batch.protocols) where number.int32Value == 2 {
if Task.isCancelled {
break
}
if let packet = IPPacketView(data) {
await self?.handleTunPacket(packet)
}
}
while !Task.isCancelled {
guard let batch = await Self.readPackets(from: provider) else {
break
}
await self?.finishPacketReader(generation: generation)
SDLLogger.log("[PacketOutboundActor] packet reader task finished")
try Task.checkCancellation()
for (data, number) in zip(batch.packets, batch.protocols) where number.int32Value == 2 {
try Task.checkCancellation()
if let packet = IPPacketView(data) {
await self.handleTunPacket(packet)
}
}
}
}
func stop() {
self.packetReaderGeneration &+= 1
let packetReaderTask = self.packetReaderTask
self.packetReaderTask = nil
packetReaderTask?.cancel()
SDLLogger.log("[PacketOutboundActor] packet reader task finished")
}
func handleTunPacket(_ packet: IPPacketView) async {
@ -190,14 +166,6 @@ actor PacketOutboundActor {
return true
}
private func finishPacketReader(generation: UInt64) {
guard generation == self.packetReaderGeneration else {
return
}
self.packetReaderTask = nil
}
private static func readPackets(from provider: NEPacketTunnelProvider) async -> PacketReadResult {
let readContinuation = OnceContinuation<PacketReadResult, Never>()