@@ -121,7 +121,7 @@ @implementation MTRDeviceController {
121
121
MTRP256KeypairBridge _operationalKeypairBridge;
122
122
MTRDeviceAttestationDelegateBridge * _deviceAttestationDelegateBridge;
123
123
MTRDeviceControllerFactory * _factory;
124
- NSMutableDictionary * _nodeIDToDeviceMap;
124
+ NSMapTable * _nodeIDToDeviceMap;
125
125
os_unfair_lock _deviceMapLock; // protects nodeIDToDeviceMap
126
126
MTRCommissionableBrowser * _commissionableBrowser;
127
127
MTRAttestationTrustStoreBridge * _attestationTrustStoreBridge;
@@ -236,7 +236,7 @@ - (instancetype)initWithFactory:(MTRDeviceControllerFactory *)factory
236
236
_chipWorkQueue = queue;
237
237
_factory = factory;
238
238
_deviceMapLock = OS_UNFAIR_LOCK_INIT;
239
- _nodeIDToDeviceMap = [NSMutableDictionary dictionary ];
239
+ _nodeIDToDeviceMap = [NSMapTable strongToWeakObjectsMapTable ];
240
240
_serverEndpoints = [[NSMutableArray alloc ] init ];
241
241
_commissionableBrowser = nil ;
242
242
@@ -307,7 +307,7 @@ - (void)cleanupAfterStartup
307
307
// while calling out into arbitrary invalidation code, snapshot the list of
308
308
// devices before we start invalidating.
309
309
os_unfair_lock_lock (&_deviceMapLock);
310
- NSArray <MTRDevice *> * devices = [_nodeIDToDeviceMap allValues ];
310
+ NSEnumerator * devices = [_nodeIDToDeviceMap objectEnumerator ];
311
311
[_nodeIDToDeviceMap removeAllObjects ];
312
312
os_unfair_lock_unlock (&_deviceMapLock);
313
313
@@ -936,8 +936,7 @@ - (void)preWarmCommissioningSession
936
936
937
937
- (MTRBaseDevice *)deviceBeingCommissionedWithNodeID : (NSNumber *)nodeID error : (NSError * __autoreleasing *)error
938
938
{
939
- auto block = ^MTRBaseDevice *
940
- {
939
+ auto block = ^MTRBaseDevice * {
941
940
chip::CommissioneeDeviceProxy * deviceProxy;
942
941
943
942
auto errorCode = self->_cppCommissioner ->GetDeviceBeingCommissioned (nodeID.unsignedLongLongValue , &deviceProxy);
@@ -970,7 +969,7 @@ - (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(N
970
969
// which will be in exactly the state it would be in if it were created
971
970
// while we were running and then we got shut down.
972
971
if ([self isRunning ]) {
973
- _nodeIDToDeviceMap[nodeID] = deviceToReturn;
972
+ [_nodeIDToDeviceMap setObject: deviceToReturn forKey: nodeID] ;
974
973
}
975
974
976
975
if (prefetchedClusterData) {
@@ -1002,7 +1001,7 @@ - (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(N
1002
1001
- (MTRDevice *)deviceForNodeID : (NSNumber *)nodeID
1003
1002
{
1004
1003
std::lock_guard lock (_deviceMapLock);
1005
- MTRDevice * deviceToReturn = _nodeIDToDeviceMap[ nodeID];
1004
+ MTRDevice * deviceToReturn = [_nodeIDToDeviceMap objectForKey: nodeID];
1006
1005
if (!deviceToReturn) {
1007
1006
deviceToReturn = [self _setupDeviceForNodeID: nodeID prefetchedClusterData: nil ];
1008
1007
}
@@ -1014,10 +1013,10 @@ - (void)removeDevice:(MTRDevice *)device
1014
1013
{
1015
1014
std::lock_guard lock (_deviceMapLock);
1016
1015
auto * nodeID = device.nodeID ;
1017
- MTRDevice * deviceToRemove = _nodeIDToDeviceMap[ nodeID];
1016
+ MTRDevice * deviceToRemove = [_nodeIDToDeviceMap objectForKey: nodeID];
1018
1017
if (deviceToRemove == device) {
1019
1018
[deviceToRemove invalidate ];
1020
- _nodeIDToDeviceMap[nodeID] = nil ;
1019
+ [_nodeIDToDeviceMap removeObjectForKey: nodeID] ;
1021
1020
} else {
1022
1021
MTR_LOG_ERROR (" Error: Cannot remove device %p with nodeID %llu" , device, nodeID.unsignedLongLongValue );
1023
1022
}
@@ -1029,7 +1028,7 @@ - (void)removeDevice:(MTRDevice *)device
1029
1028
std::lock_guard lock (_deviceMapLock);
1030
1029
NSMutableDictionary <NSNumber *, NSNumber *> * deviceAttributeCounts = [NSMutableDictionary dictionary ];
1031
1030
for (NSNumber * nodeID in _nodeIDToDeviceMap) {
1032
- deviceAttributeCounts[nodeID] = @([_nodeIDToDeviceMap[ nodeID] unitTestAttributeCount ]);
1031
+ deviceAttributeCounts[nodeID] = @([[_nodeIDToDeviceMap objectForKey: nodeID] unitTestAttributeCount ]);
1033
1032
}
1034
1033
return deviceAttributeCounts;
1035
1034
}
@@ -1096,8 +1095,7 @@ + (nullable NSData *)computePASEVerifierForSetupPasscode:(NSNumber *)setupPassco
1096
1095
1097
1096
- (NSData * _Nullable)attestationChallengeForDeviceID : (NSNumber *)deviceID
1098
1097
{
1099
- auto block = ^NSData *
1100
- {
1098
+ auto block = ^NSData * {
1101
1099
chip::CommissioneeDeviceProxy * deviceProxy;
1102
1100
1103
1101
auto errorCode = CHIP_NO_ERROR;
@@ -1260,7 +1258,7 @@ - (void)getSessionForNode:(chip::NodeId)nodeID completion:(MTRInternalDeviceConn
1260
1258
// First check if MTRDevice exists from having loaded from storage, or created by a client.
1261
1259
// Do not use deviceForNodeID here, because we don't want to create the device if it does not already exist.
1262
1260
os_unfair_lock_lock (&_deviceMapLock);
1263
- MTRDevice * device = _nodeIDToDeviceMap[ @(nodeID)];
1261
+ MTRDevice * device = [_nodeIDToDeviceMap objectForKey: @(nodeID)];
1264
1262
os_unfair_lock_unlock (&_deviceMapLock);
1265
1263
1266
1264
// In the case that this device is known to use thread, queue this with subscription attempts as well, to
@@ -1482,7 +1480,7 @@ - (void)operationalInstanceAdded:(chip::NodeId)nodeID
1482
1480
// Don't use deviceForNodeID here, because we don't want to create the
1483
1481
// device if it does not already exist.
1484
1482
os_unfair_lock_lock (&_deviceMapLock);
1485
- MTRDevice * device = _nodeIDToDeviceMap[ @(nodeID)];
1483
+ MTRDevice * device = [_nodeIDToDeviceMap objectForKey: @(nodeID)];
1486
1484
os_unfair_lock_unlock (&_deviceMapLock);
1487
1485
1488
1486
if (device == nil ) {
@@ -1922,8 +1920,7 @@ - (NSString *)openPairingWindowWithPIN:(uint64_t)deviceID
1922
1920
return nil ;
1923
1921
}
1924
1922
1925
- auto block = ^NSString *
1926
- {
1923
+ auto block = ^NSString * {
1927
1924
chip::SetupPayload setupPayload;
1928
1925
errorCode = chip::Controller::AutoCommissioningWindowOpener::OpenCommissioningWindow (self->_cppCommissioner , deviceID,
1929
1926
chip::System::Clock::Seconds16 (static_cast <uint16_t >(duration)), chip::Crypto::kSpake2p_Min_PBKDF_Iterations ,
0 commit comments