@@ -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
@@ -970,7 +970,7 @@ - (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(N
970
970
// which will be in exactly the state it would be in if it were created
971
971
// while we were running and then we got shut down.
972
972
if ([self isRunning ]) {
973
- _nodeIDToDeviceMap[nodeID] = deviceToReturn;
973
+ [_nodeIDToDeviceMap setObject: deviceToReturn forKey: nodeID] ;
974
974
}
975
975
976
976
if (prefetchedClusterData) {
@@ -1002,7 +1002,7 @@ - (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(N
1002
1002
- (MTRDevice *)deviceForNodeID : (NSNumber *)nodeID
1003
1003
{
1004
1004
std::lock_guard lock (_deviceMapLock);
1005
- MTRDevice * deviceToReturn = _nodeIDToDeviceMap[ nodeID];
1005
+ MTRDevice * deviceToReturn = [_nodeIDToDeviceMap objectForKey: nodeID];
1006
1006
if (!deviceToReturn) {
1007
1007
deviceToReturn = [self _setupDeviceForNodeID: nodeID prefetchedClusterData: nil ];
1008
1008
}
@@ -1014,10 +1014,10 @@ - (void)removeDevice:(MTRDevice *)device
1014
1014
{
1015
1015
std::lock_guard lock (_deviceMapLock);
1016
1016
auto * nodeID = device.nodeID ;
1017
- MTRDevice * deviceToRemove = _nodeIDToDeviceMap[ nodeID];
1017
+ MTRDevice * deviceToRemove = [_nodeIDToDeviceMap objectForKey: nodeID];
1018
1018
if (deviceToRemove == device) {
1019
1019
[deviceToRemove invalidate ];
1020
- _nodeIDToDeviceMap[ nodeID] = nil ;
1020
+ [_nodeIDToDeviceMap removeObjectForKey: nodeID];
1021
1021
} else {
1022
1022
MTR_LOG_ERROR (" Error: Cannot remove device %p with nodeID %llu" , device, nodeID.unsignedLongLongValue );
1023
1023
}
@@ -1029,7 +1029,7 @@ - (void)removeDevice:(MTRDevice *)device
1029
1029
std::lock_guard lock (_deviceMapLock);
1030
1030
NSMutableDictionary <NSNumber *, NSNumber *> * deviceAttributeCounts = [NSMutableDictionary dictionary ];
1031
1031
for (NSNumber * nodeID in _nodeIDToDeviceMap) {
1032
- deviceAttributeCounts[nodeID] = @([_nodeIDToDeviceMap[ nodeID] unitTestAttributeCount ]);
1032
+ deviceAttributeCounts[nodeID] = @([[_nodeIDToDeviceMap objectForKey: nodeID] unitTestAttributeCount ]);
1033
1033
}
1034
1034
return deviceAttributeCounts;
1035
1035
}
@@ -1260,7 +1260,7 @@ - (void)getSessionForNode:(chip::NodeId)nodeID completion:(MTRInternalDeviceConn
1260
1260
// First check if MTRDevice exists from having loaded from storage, or created by a client.
1261
1261
// Do not use deviceForNodeID here, because we don't want to create the device if it does not already exist.
1262
1262
os_unfair_lock_lock (&_deviceMapLock);
1263
- MTRDevice * device = _nodeIDToDeviceMap[ @(nodeID)];
1263
+ MTRDevice * device = [_nodeIDToDeviceMap objectForKey: @(nodeID)];
1264
1264
os_unfair_lock_unlock (&_deviceMapLock);
1265
1265
1266
1266
// In the case that this device is known to use thread, queue this with subscription attempts as well, to
@@ -1482,7 +1482,7 @@ - (void)operationalInstanceAdded:(chip::NodeId)nodeID
1482
1482
// Don't use deviceForNodeID here, because we don't want to create the
1483
1483
// device if it does not already exist.
1484
1484
os_unfair_lock_lock (&_deviceMapLock);
1485
- MTRDevice * device = _nodeIDToDeviceMap[ @(nodeID)];
1485
+ MTRDevice * device = [_nodeIDToDeviceMap objectForKey: @(nodeID)];
1486
1486
os_unfair_lock_unlock (&_deviceMapLock);
1487
1487
1488
1488
if (device == nil ) {
0 commit comments