diff --git a/src/darwin/Framework/CHIPTests/MTRXPCListenerSampleTests.m b/src/darwin/Framework/CHIPTests/MTRXPCListenerSampleTests.m index c22bc7a72125ea..392f0d1f1a3513 100644 --- a/src/darwin/Framework/CHIPTests/MTRXPCListenerSampleTests.m +++ b/src/darwin/Framework/CHIPTests/MTRXPCListenerSampleTests.m @@ -33,6 +33,7 @@ // system dependencies #import +#import static uint16_t kTestVendorId = 0xFFF1u; @@ -73,6 +74,8 @@ @interface MTRXPCListenerSample () @property (nonatomic, readonly, strong) NSMutableDictionary * clusterStateCacheDictionary; +// serversLock controls access to _servers. +@property (nonatomic, readonly) os_unfair_lock serversLock; @end @implementation MTRXPCListenerSample @@ -86,6 +89,7 @@ - (instancetype)init _clusterStateCacheDictionary = [NSMutableDictionary dictionary]; _xpcListener = [NSXPCListener anonymousListener]; [_xpcListener setDelegate:(id) self]; + _serversLock = OS_UNFAIR_LOCK_INIT; } return self; } @@ -113,10 +117,16 @@ - (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConne __auto_type newServer = [[MTRDeviceControllerServerSample alloc] initWithClientProxy:[newConnection remoteObjectProxy] clusterStateCacheDictionary:_clusterStateCacheDictionary]; newConnection.exportedObject = newServer; + + os_unfair_lock_lock(&_serversLock); [_servers setObject:newServer forKey:newServer.identifier]; + os_unfair_lock_unlock(&_serversLock); + newConnection.invalidationHandler = ^{ NSLog(@"XPC connection disconnected"); + os_unfair_lock_lock(&self->_serversLock); [self.servers removeObjectForKey:newServer.identifier]; + os_unfair_lock_unlock(&self->_serversLock); }; [newConnection resume]; return YES;