PacketTunnelProvider: fix locking logic
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
parent
8aeca61322
commit
99b9a6b80a
|
@ -192,22 +192,19 @@ class WireGuardContext {
|
|||
readPacketCondition.signal()
|
||||
}
|
||||
|
||||
func readPacket(isTunnelClosed: inout Bool) -> NEPacket? {
|
||||
if outboundPackets.isEmpty {
|
||||
let readPacketCondition = NSCondition()
|
||||
readPacketCondition.lock()
|
||||
var packetsObtained: [NEPacket]?
|
||||
packetFlow.readPacketObjects { (packets: [NEPacket]) in
|
||||
packetsObtained = packets
|
||||
func packetsRead(packets: [NEPacket]) {
|
||||
outboundPackets.append(contentsOf: packets)
|
||||
readPacketCondition.signal()
|
||||
}
|
||||
|
||||
func readPacket(isTunnelClosed: inout Bool) -> NEPacket? {
|
||||
if outboundPackets.isEmpty {
|
||||
readPacketCondition.lock()
|
||||
packetFlow.readPacketObjects(completionHandler: packetsRead)
|
||||
// Wait till the completion handler of packetFlow.readPacketObjects() finishes
|
||||
while packetsObtained == nil && !self.isTunnelClosed {
|
||||
while outboundPackets.isEmpty && !self.isTunnelClosed {
|
||||
readPacketCondition.wait()
|
||||
}
|
||||
if let packetsObtained = packetsObtained {
|
||||
outboundPackets = packetsObtained
|
||||
}
|
||||
readPacketCondition.unlock()
|
||||
}
|
||||
isTunnelClosed = self.isTunnelClosed
|
||||
|
|
Loading…
Reference in New Issue