aboutsummaryrefslogtreecommitdiffstats
path: root/WireGuardNetworkExtension/PacketTunnelProvider.swift
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2018-09-25 02:35:01 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2018-09-25 02:50:03 +0200
commit412a5ed445e9c3e686f67b98920ae65191ef9a04 (patch)
tree2a59336a32618cd7223630e7f1e417f999c36c49 /WireGuardNetworkExtension/PacketTunnelProvider.swift
parentPrevent signal and wait from racing (diff)
downloadwireguard-apple-412a5ed445e9c3e686f67b98920ae65191ef9a04.tar.xz
wireguard-apple-412a5ed445e9c3e686f67b98920ae65191ef9a04.zip
Keep tabs on memory usage
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'WireGuardNetworkExtension/PacketTunnelProvider.swift')
-rw-r--r--WireGuardNetworkExtension/PacketTunnelProvider.swift10
1 files changed, 6 insertions, 4 deletions
diff --git a/WireGuardNetworkExtension/PacketTunnelProvider.swift b/WireGuardNetworkExtension/PacketTunnelProvider.swift
index e884b8f..cb8d092 100644
--- a/WireGuardNetworkExtension/PacketTunnelProvider.swift
+++ b/WireGuardNetworkExtension/PacketTunnelProvider.swift
@@ -136,6 +136,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
return withStringsAsGoStrings(interfaceName, settings) { (nameGoStr, settingsGoStr) -> Int32 in
return withUnsafeMutablePointer(to: &wgContext) { (wgCtxPtr) -> Int32 in
return wgTurnOn(nameGoStr, settingsGoStr, { (wgCtxPtr, buf, len) -> Int in
+ autoreleasepool {
// read_fn: Read from the TUN interface and pass it on to WireGuard
guard let wgCtxPtr = wgCtxPtr else { return 0 }
guard let buf = buf else { return 0 }
@@ -149,7 +150,9 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
return packetData.count
}
return 0
+ }
}, { (wgCtxPtr, buf, len) -> Int in
+ autoreleasepool {
// write_fn: Receive packets from WireGuard and write to the TUN interface
guard let wgCtxPtr = wgCtxPtr else { return 0 }
guard let buf = buf else { return 0 }
@@ -170,6 +173,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
return len
}
return 0
+ }
},
wgCtxPtr)
}
@@ -203,18 +207,16 @@ class WireGuardContext {
if outboundPackets.isEmpty {
readPacketCondition.lock()
packetFlow.readPacketObjects(completionHandler: packetsRead)
- // Wait till the completion handler of packetFlow.readPacketObjects() finishes
while outboundPackets.isEmpty && !self.isTunnelClosed {
readPacketCondition.wait()
}
readPacketCondition.unlock()
}
isTunnelClosed = self.isTunnelClosed
- if outboundPackets.isEmpty {
- return nil
- } else {
+ if !outboundPackets.isEmpty {
return outboundPackets.removeFirst()
}
+ return nil
}
func writePacket(packet: NEPacket, isTunnelClosed: inout Bool) -> Bool {