diff --git a/Sources/sdlan/SDLSuperClient.swift b/Sources/sdlan/SDLSuperClient.swift index dd18751..35584aa 100644 --- a/Sources/sdlan/SDLSuperClient.swift +++ b/Sources/sdlan/SDLSuperClient.swift @@ -22,7 +22,7 @@ class SDLSuperClient: ChannelInboundHandler, @unchecked Sendable { // id生成器 var idGenerator = SDLIdGenerator(seed: 1) - private let callbackManager = SuperCallbackManager() + private var callbackManager = SuperCallbackManager() let host: String let port: Int @@ -248,43 +248,30 @@ extension SDLSuperClient { // 回调函数管理器 extension SDLSuperClient { - private final class SuperCallbackManager { + + private struct SuperCallbackManager { // 对应请求体和相应的关系 private var callbacks: [UInt32:CallbackFun] = [:] - private let locker = NSLock() - func addCallback(id: UInt32, callback: @escaping CallbackFun) { - locker.lock() - defer { - locker.unlock() - } + mutating func addCallback(id: UInt32, callback: @escaping CallbackFun) { self.callbacks[id] = callback } - func fireCallback(message: SDLSuperInboundMessage) { - locker.lock() - defer { - locker.unlock() - } - + mutating func fireCallback(message: SDLSuperInboundMessage) { if let callback = self.callbacks[message.msgId] { callback(message) self.callbacks.removeValue(forKey: message.msgId) } } - func fireAllCallbacks(message: SDLSuperInboundMessage) { - locker.lock() - defer { - locker.unlock() - } - + mutating func fireAllCallbacks(message: SDLSuperInboundMessage) { for (_, callback) in self.callbacks { callback(nil) } self.callbacks.removeAll() } } + } // --MARK: 编解码器 @@ -371,3 +358,11 @@ extension SDLSuperClient { } } + +extension ByteToMessageHandler: @unchecked @retroactive Sendable { + +} + +extension MessageToByteHandler: @unchecked @retroactive Sendable { + +} diff --git a/Sources/sdlan/SDLUDPHole.swift b/Sources/sdlan/SDLUDPHole.swift index 4d8184d..37001d2 100644 --- a/Sources/sdlan/SDLUDPHole.swift +++ b/Sources/sdlan/SDLUDPHole.swift @@ -21,7 +21,7 @@ class SDLUDPHole: ChannelInboundHandler, @unchecked Sendable { private let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) private var cookieGenerator = SDLIdGenerator(seed: 1) - private let callbackManager = HoleCallbackManager() + private var callbackManager = HoleCallbackManager() public var localAddress: SocketAddress? public var channel: Channel? @@ -81,7 +81,7 @@ class SDLUDPHole: ChannelInboundHandler, @unchecked Sendable { SDLLogger.log("[SDLUDPHole] stunProbe: \(remoteAddress)", level: .warning) - self.callbackManager.addCallback(id: cookie, timeout: timeout, callback: callback) + self.callbackManager.addCallback(id: cookie, callback: callback) } // MARK: client-client apis @@ -270,59 +270,37 @@ extension SDLUDPHole { // --MARK: 回调函数管理器 extension SDLUDPHole { - private final class HoleCallbackManager { - // 对应请求体和相应的关系 - private var callbacks: [UInt32:CallbackFun] = [:] - private let locker = NSLock() + private struct HoleCallbackManager { + // 存储回调函数和对应的超时任务 + private var callbacks: [UInt32: CallbackFun] = [:] - func addCallback(id: UInt32, timeout: Int, callback: @escaping CallbackFun) { - locker.lock() - defer { - locker.unlock() - } - - DispatchQueue.global().asyncAfter(deadline: .now() + Double(timeout)) { - self.fireCallback(cookie: id) - } - + //private var timeoutCallbacks: [UInt32: CallbackFun] = [:] + + // 添加回调并设置超时 + mutating func addCallback(id: UInt32, callback: @escaping CallbackFun) { + // 存储回调 self.callbacks[id] = callback } - func fireCallback(message: SDLStunProbeReply) { - locker.lock() - defer { - locker.unlock() - } - - if let callback = self.callbacks[message.cookie] { + // 正常触发回调(收到响应) + mutating func fireCallback(message: SDLStunProbeReply) { + let id = message.cookie + // 执行并移除回调 + if let callback = callbacks[id] { callback(message) - self.callbacks.removeValue(forKey: message.cookie) + self.callbacks.removeValue(forKey: id) } } - func fireAllCallbacks(message: SDLSuperInboundMessage) { - locker.lock() - defer { - locker.unlock() - } - - for (_, callback) in self.callbacks { + // 触发所有回调(清理场景) + mutating func fireAllCallbacks(message: SDLSuperInboundMessage) { + // 触发所有回调 + for callback in callbacks.values { callback(nil) } self.callbacks.removeAll() } - private func fireCallback(cookie: UInt32) { - locker.lock() - defer { - locker.unlock() - } - - if let callback = self.callbacks[cookie] { - callback(nil) - self.callbacks.removeValue(forKey: cookie) - } - } - } + }