Prevent concurrent modification of host list

This commit is contained in:
Cameron Gutman
2019-12-03 20:02:16 -08:00
parent 32b7396070
commit 61c18c201c
+13 -1
View File
@@ -77,9 +77,12 @@
Log(LOG_I, @"Starting discovery"); Log(LOG_I, @"Starting discovery");
shouldDiscover = YES; shouldDiscover = YES;
[_mdnsMan searchForHosts]; [_mdnsMan searchForHosts];
@synchronized (_hostQueue) {
for (TemporaryHost* host in _hostQueue) { for (TemporaryHost* host in _hostQueue) {
[_opQueue addOperation:[self createWorkerForHost:host]]; [_opQueue addOperation:[self createWorkerForHost:host]];
} }
}
} }
- (void) stopDiscovery { - (void) stopDiscovery {
@@ -141,21 +144,26 @@
return NO; return NO;
} }
else { else {
@synchronized (_hostQueue) {
[_hostQueue addObject:host]; [_hostQueue addObject:host];
if (shouldDiscover) { if (shouldDiscover) {
[_opQueue addOperation:[self createWorkerForHost:host]]; [_opQueue addOperation:[self createWorkerForHost:host]];
} }
}
return YES; return YES;
} }
} }
- (void) removeHostFromDiscovery:(TemporaryHost *)host { - (void) removeHostFromDiscovery:(TemporaryHost *)host {
@synchronized (_hostQueue) {
for (DiscoveryWorker* worker in [_opQueue operations]) { for (DiscoveryWorker* worker in [_opQueue operations]) {
if ([worker getHost] == host) { if ([worker getHost] == host) {
[worker cancel]; [worker cancel];
} }
} }
[_hostQueue removeObject:host]; [_hostQueue removeObject:host];
}
} }
// Override from MDNSCallback - called in a worker thread // Override from MDNSCallback - called in a worker thread
@@ -167,18 +175,22 @@
[worker discoverHost]; [worker discoverHost];
if ([self addHostToDiscovery:host]) { if ([self addHostToDiscovery:host]) {
Log(LOG_I, @"Found new host through MDNS: %@:", host.name); Log(LOG_I, @"Found new host through MDNS: %@:", host.name);
[self->_callback updateAllHosts:self->_hostQueue]; @synchronized (_hostQueue) {
[_callback updateAllHosts:_hostQueue];
}
} else { } else {
Log(LOG_D, @"Found existing host through MDNS: %@", host.name); Log(LOG_D, @"Found existing host through MDNS: %@", host.name);
} }
} }
- (TemporaryHost*) getHostInDiscovery:(NSString*)uuidString { - (TemporaryHost*) getHostInDiscovery:(NSString*)uuidString {
@synchronized (_hostQueue) {
for (TemporaryHost* discoveredHost in _hostQueue) { for (TemporaryHost* discoveredHost in _hostQueue) {
if (discoveredHost.uuid.length > 0 && [discoveredHost.uuid isEqualToString:uuidString]) { if (discoveredHost.uuid.length > 0 && [discoveredHost.uuid isEqualToString:uuidString]) {
return discoveredHost; return discoveredHost;
} }
} }
}
return nil; return nil;
} }