82
82
#include < dns_sd.h>
83
83
#include < string>
84
84
85
- #import < os/lock.h>
86
-
87
85
typedef void (^SyncWorkQueueBlock)(void );
88
86
typedef id (^SyncWorkQueueBlockWithReturnValue)(void );
89
87
typedef BOOL (^SyncWorkQueueBlockWithBoolReturnValue)(void );
@@ -103,8 +101,6 @@ @interface MTRDeviceController_Concrete ()
103
101
@property (nonatomic , readwrite ) NSUUID * uniqueIdentifier;
104
102
@property (nonatomic , readonly ) dispatch_queue_t chipWorkQueue;
105
103
@property (nonatomic , readonly , nullable ) MTRDeviceControllerFactory * factory;
106
- @property (nonatomic , readonly , nullable ) NSMapTable * nodeIDToDeviceMap;
107
- @property (nonatomic , readonly ) os_unfair_lock deviceMapLock;
108
104
@property (nonatomic , readonly , nullable ) id <MTROTAProviderDelegate> otaProviderDelegate;
109
105
@property (nonatomic , readonly , nullable ) dispatch_queue_t otaProviderDelegateQueue;
110
106
@property (nonatomic , readonly , nullable ) MTRCommissionableBrowser * commissionableBrowser;
@@ -270,11 +266,9 @@ - (instancetype)initWithFactory:(MTRDeviceControllerFactory *)factory
270
266
271
267
_otaProviderDelegate = otaProviderDelegate;
272
268
_otaProviderDelegateQueue = otaProviderDelegateQueue;
273
-
274
269
_chipWorkQueue = queue;
275
270
_factory = factory;
276
- _deviceMapLock = OS_UNFAIR_LOCK_INIT;
277
- _nodeIDToDeviceMap = [NSMapTable strongToWeakObjectsMapTable ];
271
+ self.nodeIDToDeviceMap = [NSMapTable strongToWeakObjectsMapTable ];
278
272
_serverEndpoints = [[NSMutableArray alloc ] init ];
279
273
_commissionableBrowser = nil ;
280
274
@@ -352,10 +346,10 @@ - (void)cleanupAfterStartup
352
346
// while calling out into arbitrary invalidation code, snapshot the list of
353
347
// devices before we start invalidating.
354
348
MTR_LOG (" cleanupAfterStartup MTRDeviceController: %@" , self);
355
- os_unfair_lock_lock (&_deviceMapLock );
356
- NSEnumerator * devices = [_nodeIDToDeviceMap objectEnumerator ];
357
- [_nodeIDToDeviceMap removeAllObjects ];
358
- os_unfair_lock_unlock (&_deviceMapLock );
349
+ os_unfair_lock_lock (self. deviceMapLock );
350
+ NSEnumerator * devices = [self .nodeIDToDeviceMap objectEnumerator ];
351
+ [self .nodeIDToDeviceMap removeAllObjects ];
352
+ os_unfair_lock_unlock (self. deviceMapLock );
359
353
360
354
for (MTRDevice * device in devices) {
361
355
[device invalidate ];
@@ -654,7 +648,7 @@ - (BOOL)startup:(MTRDeviceControllerStartupParamsInternal *)startupParams
654
648
[_controllerDataStore fetchAttributeDataForAllDevices: ^(NSDictionary <NSNumber *, NSDictionary <MTRClusterPath *, MTRDeviceClusterData *> *> * _Nonnull clusterDataByNode) {
655
649
MTR_LOG (" %@ Loaded attribute values for %lu nodes from storage for controller uuid %@" , self, static_cast <unsigned long >(clusterDataByNode.count ), self->_uniqueIdentifier );
656
650
657
- std::lock_guard lock (self-> _deviceMapLock );
651
+ std::lock_guard lock (* self. deviceMapLock );
658
652
NSMutableArray * deviceList = [NSMutableArray array ];
659
653
for (NSNumber * nodeID in clusterDataByNode) {
660
654
NSDictionary * clusterData = clusterDataByNode[nodeID];
@@ -1024,15 +1018,15 @@ - (MTRBaseDevice *)baseDeviceForNodeID:(NSNumber *)nodeID
1024
1018
// If prefetchedClusterData is not provided, load attributes individually from controller data store
1025
1019
- (MTRDevice *)_setupDeviceForNodeID : (NSNumber *)nodeID prefetchedClusterData : (NSDictionary <MTRClusterPath *, MTRDeviceClusterData *> *)prefetchedClusterData
1026
1020
{
1027
- os_unfair_lock_assert_owner (&_deviceMapLock );
1021
+ os_unfair_lock_assert_owner (self. deviceMapLock );
1028
1022
1029
1023
MTRDevice * deviceToReturn = [[MTRDevice alloc ] initWithNodeID: nodeID controller: self ];
1030
1024
// If we're not running, don't add the device to our map. That would
1031
1025
// create a cycle that nothing would break. Just return the device,
1032
1026
// which will be in exactly the state it would be in if it were created
1033
1027
// while we were running and then we got shut down.
1034
1028
if ([self isRunning ]) {
1035
- [_nodeIDToDeviceMap setObject: deviceToReturn forKey: nodeID];
1029
+ [self .nodeIDToDeviceMap setObject: deviceToReturn forKey: nodeID];
1036
1030
}
1037
1031
1038
1032
if (prefetchedClusterData) {
@@ -1063,8 +1057,8 @@ - (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(N
1063
1057
1064
1058
- (MTRDevice *)deviceForNodeID : (NSNumber *)nodeID
1065
1059
{
1066
- std::lock_guard lock (_deviceMapLock );
1067
- MTRDevice * deviceToReturn = [_nodeIDToDeviceMap objectForKey: nodeID];
1060
+ std::lock_guard lock (*self. deviceMapLock );
1061
+ MTRDevice * deviceToReturn = [self .nodeIDToDeviceMap objectForKey: nodeID];
1068
1062
if (!deviceToReturn) {
1069
1063
deviceToReturn = [self _setupDeviceForNodeID: nodeID prefetchedClusterData: nil ];
1070
1064
}
@@ -1074,12 +1068,12 @@ - (MTRDevice *)deviceForNodeID:(NSNumber *)nodeID
1074
1068
1075
1069
- (void )removeDevice : (MTRDevice *)device
1076
1070
{
1077
- std::lock_guard lock (_deviceMapLock );
1071
+ std::lock_guard lock (*self. deviceMapLock );
1078
1072
auto * nodeID = device.nodeID ;
1079
- MTRDevice * deviceToRemove = [_nodeIDToDeviceMap objectForKey: nodeID];
1073
+ MTRDevice * deviceToRemove = [self .nodeIDToDeviceMap objectForKey: nodeID];
1080
1074
if (deviceToRemove == device) {
1081
1075
[deviceToRemove invalidate ];
1082
- [_nodeIDToDeviceMap removeObjectForKey: nodeID];
1076
+ [self .nodeIDToDeviceMap removeObjectForKey: nodeID];
1083
1077
} else {
1084
1078
MTR_LOG_ERROR (" %@ Error: Cannot remove device %p with nodeID %llu" , self, device, nodeID.unsignedLongLongValue );
1085
1079
}
@@ -1088,10 +1082,10 @@ - (void)removeDevice:(MTRDevice *)device
1088
1082
#ifdef DEBUG
1089
1083
- (NSDictionary <NSNumber *, NSNumber *> *)unitTestGetDeviceAttributeCounts
1090
1084
{
1091
- std::lock_guard lock (_deviceMapLock );
1085
+ std::lock_guard lock (*self. deviceMapLock );
1092
1086
NSMutableDictionary <NSNumber *, NSNumber *> * deviceAttributeCounts = [NSMutableDictionary dictionary ];
1093
- for (NSNumber * nodeID in _nodeIDToDeviceMap ) {
1094
- deviceAttributeCounts[nodeID] = @([[_nodeIDToDeviceMap objectForKey: nodeID] unitTestAttributeCount ]);
1087
+ for (NSNumber * nodeID in self. nodeIDToDeviceMap ) {
1088
+ deviceAttributeCounts[nodeID] = @([[self .nodeIDToDeviceMap objectForKey: nodeID] unitTestAttributeCount ]);
1095
1089
}
1096
1090
return deviceAttributeCounts;
1097
1091
}
@@ -1540,9 +1534,9 @@ - (void)operationalInstanceAdded:(chip::NodeId)nodeID
1540
1534
{
1541
1535
// Don't use deviceForNodeID here, because we don't want to create the
1542
1536
// device if it does not already exist.
1543
- os_unfair_lock_lock (&_deviceMapLock );
1544
- MTRDevice * device = [_nodeIDToDeviceMap objectForKey: @(nodeID)];
1545
- os_unfair_lock_unlock (&_deviceMapLock );
1537
+ os_unfair_lock_lock (self. deviceMapLock );
1538
+ MTRDevice * device = [self .nodeIDToDeviceMap objectForKey: @(nodeID)];
1539
+ os_unfair_lock_unlock (self. deviceMapLock );
1546
1540
1547
1541
if (device == nil ) {
1548
1542
return ;
0 commit comments