From: Jason A. Donenfeld Date: Mon, 4 Feb 2019 20:30:33 +0000 (+0100) Subject: TunnelsManager: cache access to configuration object X-Git-Tag: 0.0.20190207-1~20 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a26d620f11656532df14ce566a701d5c5cbb850e;p=thirdparty%2Fwireguard-apple.git 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. Signed-off-by: Jason A. Donenfeld --- 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 } }