From bcd475e0bcadc72b28cd2d545935233a52babb7e Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Mon, 4 Feb 2019 21:30:33 +0100 Subject: [PATCH] TunnelsManager: cache access to configuration object Supposedly we never change it once per object, so we do the objective C hack of adding it cached to the extension. This prevents 1000s of calls to the keychain and improves the speed of imports. --- WireGuard/WireGuard/Tunnel/TunnelsManager.swift | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/WireGuard/WireGuard/Tunnel/TunnelsManager.swift b/WireGuard/WireGuard/Tunnel/TunnelsManager.swift index 93f75ff..6bcf6f7 100644 --- a/WireGuard/WireGuard/Tunnel/TunnelsManager.swift +++ b/WireGuard/WireGuard/Tunnel/TunnelsManager.swift @@ -526,7 +526,15 @@ class TunnelContainer: NSObject { } extension NETunnelProviderManager { + private static var cachedConfigKey: UInt8 = 0 var tunnelConfiguration: TunnelConfiguration? { - return (protocolConfiguration as? NETunnelProviderProtocol)?.asTunnelConfiguration(called: localizedDescription) + if let cached = objc_getAssociatedObject(self, &NETunnelProviderManager.cachedConfigKey) as? TunnelConfiguration { + return cached + } + let config = (protocolConfiguration as? NETunnelProviderProtocol)?.asTunnelConfiguration(called: localizedDescription) + if config != nil { + objc_setAssociatedObject(self, &NETunnelProviderManager.cachedConfigKey, config, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + return config } }