fix: タイムアウト時の処理が行われない場合がある問題を修正

This commit is contained in:
dazy1030 2021-04-21 11:22:56 +09:00
parent 382bf69cda
commit 9c8e97cac9
2 changed files with 16 additions and 12 deletions

View File

@ -50,9 +50,7 @@ open class NetSocket: NSObject {
}
}
lazy var inputQueue = DispatchQueue(label: "com.haishinkit.HaishinKit.NetSocket.input", qos: qualityOfService)
private lazy var timeoutHandler = DispatchWorkItem { [weak self] in
self?.didTimeout()
}
private var timeoutHandler: DispatchWorkItem?
private lazy var buffer = [UInt8](repeating: 0, count: windowSizeC)
private lazy var outputBuffer: CycleBuffer = .init(capacity: windowSizeC)
private lazy var outputQueue: DispatchQueue = .init(label: "com.haishinkit.HaishinKit.NetSocket.output", qos: qualityOfService)
@ -115,7 +113,11 @@ open class NetSocket: NSObject {
inputStream.open()
outputStream.open()
if 0 < timeout {
DispatchQueue.global(qos: .userInteractive).asyncAfter(deadline: .now() + .seconds(timeout), execute: timeoutHandler)
let newTimeoutHandler = DispatchWorkItem { [weak self] in
self?.didTimeout()
}
timeoutHandler = newTimeoutHandler
DispatchQueue.global(qos: .userInteractive).asyncAfter(deadline: .now() + .seconds(timeout), execute: newTimeoutHandler)
}
}
@ -123,7 +125,7 @@ open class NetSocket: NSObject {
guard inputStream != nil && outputStream != nil else {
return
}
timeoutHandler.cancel()
timeoutHandler?.cancel()
inputStream?.close()
inputStream = nil
outputStream?.close()
@ -168,7 +170,7 @@ extension NetSocket: StreamDelegate {
break
}
if aStream == inputStream {
timeoutHandler.cancel()
timeoutHandler?.cancel()
connected = true
}
// 2 = 1 << 1

View File

@ -51,9 +51,7 @@ final class RTMPNWSocket: RTMPSocketCompatible {
private var parameters: NWParameters = .tcp
private lazy var inputQueue = DispatchQueue(label: "com.haishinkit.HaishinKit.NWSocket.input", qos: qualityOfService)
private lazy var outputQueue = DispatchQueue(label: "com.haishinkit.HaishinKit.NWSocket.output", qos: qualityOfService)
private lazy var timeoutHandler = DispatchWorkItem { [weak self] in
self?.didTimeout()
}
private var timeoutHandler: DispatchWorkItem?
func connect(withName: String, port: Int) {
handshake.clear()
@ -71,7 +69,11 @@ final class RTMPNWSocket: RTMPSocketCompatible {
receive(on: connection)
}
if 0 < timeout {
DispatchQueue.global(qos: .userInteractive).asyncAfter(deadline: .now() + .seconds(timeout), execute: timeoutHandler)
let newTimeoutHandler = DispatchWorkItem { [weak self] in
self?.didTimeout()
}
timeoutHandler = newTimeoutHandler
DispatchQueue.global(qos: .userInteractive).asyncAfter(deadline: .now() + .seconds(timeout), execute: newTimeoutHandler)
}
}
@ -85,7 +87,7 @@ final class RTMPNWSocket: RTMPSocketCompatible {
events.append(Event(type: .rtmpStatus, bubbles: false, data: data))
}
readyState = .closing
timeoutHandler.cancel()
timeoutHandler?.cancel()
connection = nil
}
@ -142,7 +144,7 @@ final class RTMPNWSocket: RTMPSocketCompatible {
private func stateDidChange(to state: NWConnection.State) {
switch state {
case .ready:
timeoutHandler.cancel()
timeoutHandler?.cancel()
connected = true
case .failed:
close(isDisconnected: true)