Index: src/OFDNSResolver.h ================================================================== --- src/OFDNSResolver.h +++ src/OFDNSResolver.h @@ -28,10 +28,11 @@ @class OFDNSResolver; @class OFDNSResolverContext; @class OFDNSResolverSettings; @class OFDate; @class OFDictionary OF_GENERIC(KeyType, ObjectType); +@class OFMutableArray OF_GENERIC(ObjectType); @class OFMutableDictionary OF_GENERIC(KeyType, ObjectType); @class OFNumber; @class OFPair OF_GENERIC(FirstType, SecondType); @class OFTCPSocket; @class OFUDPSocket; @@ -135,10 +136,11 @@ *_queries; OFMutableDictionary OF_GENERIC(OFTCPSocket *, OFDNSResolverContext *) *_TCPQueries; OFMutableDictionary OF_GENERIC(OFDNSQuery *, OFPair OF_GENERIC(OFDate *, OFDNSResponse *) *) *_cache; + OFMutableArray OF_GENERIC(OFString *) *_lastNameServers; OFTimeInterval _lastCacheCleanup; } /** * @brief A dictionary of static hosts. @@ -163,14 +165,10 @@ */ @property (copy, nonatomic) OFArray OF_GENERIC(OFString *) *nameServers; /** * @brief The local domain. - * - * @warning If you change this, you need to set @ref configReloadInterval to 0 - * to disable reloading the config after some time. If you don't, the - * config will be reloaded and your change overridden. */ @property OF_NULLABLE_PROPERTY (readonly, nonatomic) OFString *localDomain; /** * @brief The domains to search for queries for short names. Index: src/OFDNSResolver.m ================================================================== --- src/OFDNSResolver.m +++ src/OFDNSResolver.m @@ -615,10 +615,11 @@ [_IPv6Socket release]; #endif [_queries release]; [_TCPQueries release]; [_cache release]; + [_lastNameServers release]; [super dealloc]; } - (OFDictionary *)staticHosts @@ -805,13 +806,23 @@ runLoopMode: runLoopMode]; } - (void)of_cleanUpCache { - void *pool = objc_autoreleasePoolPush(); OFTimeInterval now = [[OFDate date] timeIntervalSince1970]; OFMutableArray *removeList; + + if (_lastNameServers != _settings->_nameServers && + ![_lastNameServers isEqual: _settings->_nameServers]) { + OFArray *old = _lastNameServers; + _lastNameServers = [_settings->_nameServers copy]; + [old release]; + + [_cache removeAllObjects]; + + return; + } if (now - _lastCacheCleanup < 1) return; _lastCacheCleanup = now; @@ -830,12 +841,10 @@ [removeList addObject: query]; } for (OFDNSQuery *query in removeList) [_cache removeObjectForKey: query]; - - objc_autoreleasePoolPop(pool); } - (void)asyncPerformQuery: (OFDNSQuery *)query delegate: (id )delegate { @@ -1106,19 +1115,19 @@ } if (exception != nil) response = nil; + [self of_cleanUpCache]; + if (response != nil) [_cache setObject: [OFPair pairWithFirstObject: [OFDate date] secondObject: response] forKey: context->_query]; else [_cache removeObjectForKey: context->_query]; - [self of_cleanUpCache]; - [context->_delegate resolver: self didPerformQuery: context->_query response: response exception: exception];