33
33
34
34
// system dependencies
35
35
#import < XCTest/XCTest.h>
36
+ #import < os/lock.h>
36
37
37
38
static uint16_t kTestVendorId = 0xFFF1u ;
38
39
@@ -73,6 +74,8 @@ @interface MTRXPCListenerSample ()
73
74
@property (nonatomic , readonly , strong )
74
75
NSMutableDictionary <NSNumber *, MTRClusterStateCacheContainer *> * clusterStateCacheDictionary;
75
76
77
+ // serversLock controls access to _servers.
78
+ @property (nonatomic , readonly ) os_unfair_lock serversLock;
76
79
@end
77
80
78
81
@implementation MTRXPCListenerSample
@@ -86,6 +89,7 @@ - (instancetype)init
86
89
_clusterStateCacheDictionary = [NSMutableDictionary dictionary ];
87
90
_xpcListener = [NSXPCListener anonymousListener ];
88
91
[_xpcListener setDelegate: (id <NSXPCListenerDelegate >) self ];
92
+ _serversLock = OS_UNFAIR_LOCK_INIT;
89
93
}
90
94
return self;
91
95
}
@@ -113,10 +117,16 @@ - (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConne
113
117
__auto_type newServer = [[MTRDeviceControllerServerSample alloc ] initWithClientProxy: [newConnection remoteObjectProxy ]
114
118
clusterStateCacheDictionary: _clusterStateCacheDictionary];
115
119
newConnection.exportedObject = newServer;
120
+
121
+ os_unfair_lock_lock (&_serversLock);
116
122
[_servers setObject: newServer forKey: newServer.identifier];
123
+ os_unfair_lock_unlock (&_serversLock);
124
+
117
125
newConnection.invalidationHandler = ^{
118
126
NSLog (@" XPC connection disconnected" );
127
+ os_unfair_lock_lock (&self->_serversLock );
119
128
[self .servers removeObjectForKey: newServer.identifier];
129
+ os_unfair_lock_unlock (&self->_serversLock );
120
130
};
121
131
[newConnection resume ];
122
132
return YES ;
0 commit comments