From c2f1a12d9f1a78e4536c6afa133514774febcfb6 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Mon, 21 May 2018 13:37:14 -0400 Subject: [PATCH] PeerConnectionClient thread safety. --- Signal/src/call/PeerConnectionClient.swift | 42 +++++++++------------- 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/Signal/src/call/PeerConnectionClient.swift b/Signal/src/call/PeerConnectionClient.swift index aefa41cd6..b82a96e37 100644 --- a/Signal/src/call/PeerConnectionClient.swift +++ b/Signal/src/call/PeerConnectionClient.swift @@ -385,7 +385,8 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD ensureTeardown(#function) } - let completion: ((((HardenedRTCSessionDescription) -> Void), ((Error) -> Void), RTCSessionDescription?, Error?) -> Void) = { [weak self] (fulfill, reject, sdp, error) in + let (promise, fulfill, reject) = Promise.pending() + let completion: ((RTCSessionDescription?, Error?) -> Void) = { [weak self] (sdp, error) in guard let strongSelf = self else { return } Logger.info("\(strongSelf.logTag) \(#function) starting."); Logger.flush() defer { @@ -412,7 +413,7 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD fulfill(HardenedRTCSessionDescription(rtcSessionDescription: sessionDescription)) } - let workBlock : ((@escaping ((HardenedRTCSessionDescription) -> Void), @escaping ((Error) -> Void)) -> Void) = { [weak self] (fulfill, reject) in + PeerConnectionClient.signalingQueue.async { [weak self] in guard let strongSelf = self else { return } Logger.info("\(strongSelf.logTag) \(#function) starting."); Logger.flush() defer { @@ -427,18 +428,12 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD peerConnection.offer(for: strongSelf.defaultOfferConstraints, completionHandler: { (sdp: RTCSessionDescription?, error: Error?) in PeerConnectionClient.signalingQueue.async { - completion(fulfill, reject, sdp, error) + completion(sdp, error) } }) } - return Promise { fulfill, reject in - SwiftAssertIsOnMainThread(#function) - - PeerConnectionClient.signalingQueue.async { - workBlock(fulfill, reject) - } - } + return promise } public func setLocalSessionDescriptionInternal(_ sessionDescription: HardenedRTCSessionDescription) -> Promise { @@ -470,7 +465,8 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD ensureTeardown(#function) } - let workBlock : ((@escaping (() -> Void), @escaping ((Error) -> Void)) -> Void) = { [weak self] (fulfill, reject) in + let (promise, fulfill, reject) = Promise.pending() + PeerConnectionClient.signalingQueue.async { [weak self] in guard let strongSelf = self else { return } Logger.info("\(strongSelf.logTag) \(#function) starting."); Logger.flush() defer { @@ -494,11 +490,7 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD }) } - return Promise { fulfill, reject in - PeerConnectionClient.signalingQueue.async { - workBlock(fulfill, reject) - } - } + return promise } public func negotiateSessionDescription(remoteDescription: RTCSessionDescription, constraints: RTCMediaConstraints) -> Promise { @@ -528,7 +520,8 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD ensureTeardown(#function) } - let workBlock : ((@escaping (() -> Void), @escaping ((Error) -> Void)) -> Void) = { [weak self] (fulfill, reject) in + let (promise, fulfill, reject) = Promise.pending() + PeerConnectionClient.signalingQueue.async { [weak self] in guard let strongSelf = self else { return } Logger.info("\(strongSelf.logTag) \(#function) starting."); Logger.flush() defer { @@ -550,12 +543,7 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD fulfill() }) } - - return Promise { fulfill, reject in - PeerConnectionClient.signalingQueue.async { - workBlock(fulfill, reject) - } - } + return promise } private func negotiateAnswerSessionDescription(constraints: RTCMediaConstraints) -> Promise { @@ -564,7 +552,8 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD ensureTeardown(#function) } - let completion : ((@escaping ((HardenedRTCSessionDescription) -> Void), @escaping ((Error) -> Void), RTCSessionDescription?, Error?) -> Void) = { [weak self] (fulfill, reject, sdp, error) in + let (promise, fulfill, reject) = Promise.pending() + let completion: ((RTCSessionDescription?, Error?) -> Void) = { [weak self] (sdp, error) in guard let strongSelf = self else { return } Logger.info("\(strongSelf.logTag) \(#function) starting."); Logger.flush() defer { @@ -598,7 +587,7 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD } } - return Promise { [weak self] fulfill, reject in + PeerConnectionClient.signalingQueue.async { [weak self] in guard let strongSelf = self else { return } Logger.info("\(strongSelf.logTag) \(#function) starting."); Logger.flush() defer { @@ -615,10 +604,11 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD peerConnection.answer(for: constraints, completionHandler: { (sdp: RTCSessionDescription?, error: Error?) in PeerConnectionClient.signalingQueue.async { - completion(fulfill, reject, sdp, error) + completion(sdp, error) } }) } + return promise } public func addRemoteIceCandidate(_ candidate: RTCIceCandidate) {