800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
|
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|
[sock asyncSendData: context->_queryData
receiver: &context->_usedNameServer
runLoopMode: runLoopMode];
[sock asyncReceiveIntoBuffer: _buffer
length: bufferLength
runLoopMode: runLoopMode];
}
- (void)of_cleanUpCache
{
void *pool = objc_autoreleasePoolPush();
OFTimeInterval now = [OFDate date].timeIntervalSince1970;
OFMutableArray *removeList;
if (now - _lastCacheCleanup < 1)
return;
_lastCacheCleanup = now;
removeList = [OFMutableArray arrayWithCapacity: _cache.count];
for (OFDNSQuery *query in _cache) {
OFPair OF_GENERIC(OFDate *, OFDNSResponse *) *entry =
[_cache objectForKey: query];
uint32_t age =
(uint32_t)now - [entry.firstObject timeIntervalSince1970];
OFDNSResponse *response = entry.secondObject;
if (containsExpiredRecord(response.answerRecords, age) ||
containsExpiredRecord(response.authorityRecords, age) ||
containsExpiredRecord(response.additionalRecords, age))
[removeList addObject: query];
}
for (OFDNSQuery *query in removeList)
[_cache removeObjectForKey: query];
objc_autoreleasePoolPop(pool);
}
- (void)asyncPerformQuery: (OFDNSQuery *)query
delegate: (id <OFDNSResolverQueryDelegate>)delegate
{
[self asyncPerformQuery: query
runLoopMode: OFDefaultRunLoopMode
delegate: delegate];
}
- (void)asyncPerformQuery: (OFDNSQuery *)query
runLoopMode: (OFRunLoopMode)runLoopMode
delegate: (id <OFDNSResolverQueryDelegate>)delegate
{
void *pool = objc_autoreleasePoolPush();
OFNumber *ID;
OFDNSResolverContext *context;
OFPair OF_GENERIC(OFDate *, OFDNSResponse *) *cacheEntry;
[self of_cleanUpCache];
if ((cacheEntry = [_cache objectForKey: query]) != nil) {
uint32_t age =
(uint32_t)-[cacheEntry.firstObject timeIntervalSinceNow];
OFDNSResponse *response = cacheEntry.secondObject;
if (!containsExpiredRecord(response.answerRecords, age) &&
|
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
|
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
|
+
+
|
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];
return false;
|