Skip to content

Commit 5eff1f4

Browse files
authored
Merge branch 'master' into feature/fix-tv-app-install-flow-and-supported-clusters
2 parents 4c90b3a + 9d56786 commit 5eff1f4

File tree

1 file changed

+10
-10
lines changed

1 file changed

+10
-10
lines changed

src/darwin/Framework/CHIP/MTRDeviceController.mm

+10-10
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ @implementation MTRDeviceController {
121121
MTRP256KeypairBridge _operationalKeypairBridge;
122122
MTRDeviceAttestationDelegateBridge * _deviceAttestationDelegateBridge;
123123
MTRDeviceControllerFactory * _factory;
124-
NSMutableDictionary * _nodeIDToDeviceMap;
124+
NSMapTable * _nodeIDToDeviceMap;
125125
os_unfair_lock _deviceMapLock; // protects nodeIDToDeviceMap
126126
MTRCommissionableBrowser * _commissionableBrowser;
127127
MTRAttestationTrustStoreBridge * _attestationTrustStoreBridge;
@@ -236,7 +236,7 @@ - (instancetype)initWithFactory:(MTRDeviceControllerFactory *)factory
236236
_chipWorkQueue = queue;
237237
_factory = factory;
238238
_deviceMapLock = OS_UNFAIR_LOCK_INIT;
239-
_nodeIDToDeviceMap = [NSMutableDictionary dictionary];
239+
_nodeIDToDeviceMap = [NSMapTable strongToWeakObjectsMapTable];
240240
_serverEndpoints = [[NSMutableArray alloc] init];
241241
_commissionableBrowser = nil;
242242

@@ -307,7 +307,7 @@ - (void)cleanupAfterStartup
307307
// while calling out into arbitrary invalidation code, snapshot the list of
308308
// devices before we start invalidating.
309309
os_unfair_lock_lock(&_deviceMapLock);
310-
NSArray<MTRDevice *> * devices = [_nodeIDToDeviceMap allValues];
310+
NSEnumerator * devices = [_nodeIDToDeviceMap objectEnumerator];
311311
[_nodeIDToDeviceMap removeAllObjects];
312312
os_unfair_lock_unlock(&_deviceMapLock);
313313

@@ -970,7 +970,7 @@ - (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(N
970970
// which will be in exactly the state it would be in if it were created
971971
// while we were running and then we got shut down.
972972
if ([self isRunning]) {
973-
_nodeIDToDeviceMap[nodeID] = deviceToReturn;
973+
[_nodeIDToDeviceMap setObject:deviceToReturn forKey:nodeID];
974974
}
975975

976976
if (prefetchedClusterData) {
@@ -1002,7 +1002,7 @@ - (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(N
10021002
- (MTRDevice *)deviceForNodeID:(NSNumber *)nodeID
10031003
{
10041004
std::lock_guard lock(_deviceMapLock);
1005-
MTRDevice * deviceToReturn = _nodeIDToDeviceMap[nodeID];
1005+
MTRDevice * deviceToReturn = [_nodeIDToDeviceMap objectForKey:nodeID];
10061006
if (!deviceToReturn) {
10071007
deviceToReturn = [self _setupDeviceForNodeID:nodeID prefetchedClusterData:nil];
10081008
}
@@ -1014,10 +1014,10 @@ - (void)removeDevice:(MTRDevice *)device
10141014
{
10151015
std::lock_guard lock(_deviceMapLock);
10161016
auto * nodeID = device.nodeID;
1017-
MTRDevice * deviceToRemove = _nodeIDToDeviceMap[nodeID];
1017+
MTRDevice * deviceToRemove = [_nodeIDToDeviceMap objectForKey:nodeID];
10181018
if (deviceToRemove == device) {
10191019
[deviceToRemove invalidate];
1020-
_nodeIDToDeviceMap[nodeID] = nil;
1020+
[_nodeIDToDeviceMap removeObjectForKey:nodeID];
10211021
} else {
10221022
MTR_LOG_ERROR("Error: Cannot remove device %p with nodeID %llu", device, nodeID.unsignedLongLongValue);
10231023
}
@@ -1029,7 +1029,7 @@ - (void)removeDevice:(MTRDevice *)device
10291029
std::lock_guard lock(_deviceMapLock);
10301030
NSMutableDictionary<NSNumber *, NSNumber *> * deviceAttributeCounts = [NSMutableDictionary dictionary];
10311031
for (NSNumber * nodeID in _nodeIDToDeviceMap) {
1032-
deviceAttributeCounts[nodeID] = @([_nodeIDToDeviceMap[nodeID] unitTestAttributeCount]);
1032+
deviceAttributeCounts[nodeID] = @([[_nodeIDToDeviceMap objectForKey:nodeID] unitTestAttributeCount]);
10331033
}
10341034
return deviceAttributeCounts;
10351035
}
@@ -1260,7 +1260,7 @@ - (void)getSessionForNode:(chip::NodeId)nodeID completion:(MTRInternalDeviceConn
12601260
// First check if MTRDevice exists from having loaded from storage, or created by a client.
12611261
// Do not use deviceForNodeID here, because we don't want to create the device if it does not already exist.
12621262
os_unfair_lock_lock(&_deviceMapLock);
1263-
MTRDevice * device = _nodeIDToDeviceMap[@(nodeID)];
1263+
MTRDevice * device = [_nodeIDToDeviceMap objectForKey:@(nodeID)];
12641264
os_unfair_lock_unlock(&_deviceMapLock);
12651265

12661266
// 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
14821482
// Don't use deviceForNodeID here, because we don't want to create the
14831483
// device if it does not already exist.
14841484
os_unfair_lock_lock(&_deviceMapLock);
1485-
MTRDevice * device = _nodeIDToDeviceMap[@(nodeID)];
1485+
MTRDevice * device = [_nodeIDToDeviceMap objectForKey:@(nodeID)];
14861486
os_unfair_lock_unlock(&_deviceMapLock);
14871487

14881488
if (device == nil) {

0 commit comments

Comments
 (0)