Skip to content

Commit 23d202a

Browse files
committed
Moving to NSMapTable
1 parent a12a0c0 commit 23d202a

File tree

1 file changed

+13
-16
lines changed

1 file changed

+13
-16
lines changed

src/darwin/Framework/CHIP/MTRDeviceController.mm

+13-16
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

@@ -936,8 +936,7 @@ - (void)preWarmCommissioningSession
936936

937937
- (MTRBaseDevice *)deviceBeingCommissionedWithNodeID:(NSNumber *)nodeID error:(NSError * __autoreleasing *)error
938938
{
939-
auto block = ^MTRBaseDevice *
940-
{
939+
auto block = ^MTRBaseDevice * {
941940
chip::CommissioneeDeviceProxy * deviceProxy;
942941

943942
auto errorCode = self->_cppCommissioner->GetDeviceBeingCommissioned(nodeID.unsignedLongLongValue, &deviceProxy);
@@ -970,7 +969,7 @@ - (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(N
970969
// which will be in exactly the state it would be in if it were created
971970
// while we were running and then we got shut down.
972971
if ([self isRunning]) {
973-
_nodeIDToDeviceMap[nodeID] = deviceToReturn;
972+
[_nodeIDToDeviceMap setObject: deviceToReturn forKey: nodeID];
974973
}
975974

976975
if (prefetchedClusterData) {
@@ -1002,7 +1001,7 @@ - (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(N
10021001
- (MTRDevice *)deviceForNodeID:(NSNumber *)nodeID
10031002
{
10041003
std::lock_guard lock(_deviceMapLock);
1005-
MTRDevice * deviceToReturn = _nodeIDToDeviceMap[nodeID];
1004+
MTRDevice * deviceToReturn = [_nodeIDToDeviceMap objectForKey: nodeID];
10061005
if (!deviceToReturn) {
10071006
deviceToReturn = [self _setupDeviceForNodeID:nodeID prefetchedClusterData:nil];
10081007
}
@@ -1014,10 +1013,10 @@ - (void)removeDevice:(MTRDevice *)device
10141013
{
10151014
std::lock_guard lock(_deviceMapLock);
10161015
auto * nodeID = device.nodeID;
1017-
MTRDevice * deviceToRemove = _nodeIDToDeviceMap[nodeID];
1016+
MTRDevice * deviceToRemove = [_nodeIDToDeviceMap objectForKey: nodeID];
10181017
if (deviceToRemove == device) {
10191018
[deviceToRemove invalidate];
1020-
_nodeIDToDeviceMap[nodeID] = nil;
1019+
[_nodeIDToDeviceMap removeObjectForKey: nodeID];
10211020
} else {
10221021
MTR_LOG_ERROR("Error: Cannot remove device %p with nodeID %llu", device, nodeID.unsignedLongLongValue);
10231022
}
@@ -1029,7 +1028,7 @@ - (void)removeDevice:(MTRDevice *)device
10291028
std::lock_guard lock(_deviceMapLock);
10301029
NSMutableDictionary<NSNumber *, NSNumber *> * deviceAttributeCounts = [NSMutableDictionary dictionary];
10311030
for (NSNumber * nodeID in _nodeIDToDeviceMap) {
1032-
deviceAttributeCounts[nodeID] = @([_nodeIDToDeviceMap[nodeID] unitTestAttributeCount]);
1031+
deviceAttributeCounts[nodeID] = @([[_nodeIDToDeviceMap objectForKey: nodeID] unitTestAttributeCount]);
10331032
}
10341033
return deviceAttributeCounts;
10351034
}
@@ -1096,8 +1095,7 @@ + (nullable NSData *)computePASEVerifierForSetupPasscode:(NSNumber *)setupPassco
10961095

10971096
- (NSData * _Nullable)attestationChallengeForDeviceID:(NSNumber *)deviceID
10981097
{
1099-
auto block = ^NSData *
1100-
{
1098+
auto block = ^NSData * {
11011099
chip::CommissioneeDeviceProxy * deviceProxy;
11021100

11031101
auto errorCode = CHIP_NO_ERROR;
@@ -1260,7 +1258,7 @@ - (void)getSessionForNode:(chip::NodeId)nodeID completion:(MTRInternalDeviceConn
12601258
// First check if MTRDevice exists from having loaded from storage, or created by a client.
12611259
// Do not use deviceForNodeID here, because we don't want to create the device if it does not already exist.
12621260
os_unfair_lock_lock(&_deviceMapLock);
1263-
MTRDevice * device = _nodeIDToDeviceMap[@(nodeID)];
1261+
MTRDevice * device = [_nodeIDToDeviceMap objectForKey: @(nodeID)];
12641262
os_unfair_lock_unlock(&_deviceMapLock);
12651263

12661264
// 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
14821480
// Don't use deviceForNodeID here, because we don't want to create the
14831481
// device if it does not already exist.
14841482
os_unfair_lock_lock(&_deviceMapLock);
1485-
MTRDevice * device = _nodeIDToDeviceMap[@(nodeID)];
1483+
MTRDevice * device = [_nodeIDToDeviceMap objectForKey: @(nodeID)];
14861484
os_unfair_lock_unlock(&_deviceMapLock);
14871485

14881486
if (device == nil) {
@@ -1922,8 +1920,7 @@ - (NSString *)openPairingWindowWithPIN:(uint64_t)deviceID
19221920
return nil;
19231921
}
19241922

1925-
auto block = ^NSString *
1926-
{
1923+
auto block = ^NSString * {
19271924
chip::SetupPayload setupPayload;
19281925
errorCode = chip::Controller::AutoCommissioningWindowOpener::OpenCommissioningWindow(self->_cppCommissioner, deviceID,
19291926
chip::System::Clock::Seconds16(static_cast<uint16_t>(duration)), chip::Crypto::kSpake2p_Min_PBKDF_Iterations,

0 commit comments

Comments
 (0)