Skip to content

Commit 9b9613f

Browse files
Push down the deviceController ivar into MTRDevice subclasses.
This allows them to store the specific controller types they are associated with, which will allow us to move APIs that only make sense for a particular type to that type.
1 parent 67e42c1 commit 9b9613f

File tree

4 files changed

+24
-11
lines changed

4 files changed

+24
-11
lines changed

src/darwin/Framework/CHIP/MTRDevice.mm

+7-5
Original file line numberDiff line numberDiff line change
@@ -282,12 +282,14 @@ @implementation MTRDevice {
282282
NSNumber * _Nullable _allNetworkFeatures;
283283
}
284284

285+
// deviceController getter is implemented by subclasses.
286+
@dynamic deviceController;
287+
285288
- (instancetype)initForSubclassesWithNodeID:(NSNumber *)nodeID controller:(MTRDeviceController *)controller
286289
{
287290
if (self = [super init]) {
288291
_lock = OS_UNFAIR_LOCK_INIT;
289292
_delegates = [NSMutableSet set];
290-
_deviceController = controller;
291293
_nodeID = nodeID;
292294
_state = MTRDeviceStateUnknown;
293295
}
@@ -606,7 +608,7 @@ - (void)_persistClusterData
606608
// storage implementation, which will try to read them later. Make sure
607609
// we snapshot the state here instead of handing out live copies.
608610
NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> * clusterData = [self _clusterDataToPersistSnapshot];
609-
[_deviceController.controllerDataStore storeClusterData:clusterData forNodeID:_nodeID];
611+
[self.deviceController.controllerDataStore storeClusterData:clusterData forNodeID:_nodeID];
610612
for (MTRClusterPath * clusterPath in _clusterDataToPersist) {
611613
[_persistedClusterData setObject:_clusterDataToPersist[clusterPath] forKey:clusterPath];
612614
[_persistedClusters addObject:clusterPath];
@@ -849,7 +851,7 @@ - (void)_reconcilePersistedClustersWithStorage
849851

850852
NSMutableSet * clusterPathsToRemove = [NSMutableSet set];
851853
for (MTRClusterPath * clusterPath in _persistedClusters) {
852-
MTRDeviceClusterData * data = [_deviceController.controllerDataStore getStoredClusterDataForNodeID:_nodeID endpointID:clusterPath.endpoint clusterID:clusterPath.cluster];
854+
MTRDeviceClusterData * data = [self.deviceController.controllerDataStore getStoredClusterDataForNodeID:_nodeID endpointID:clusterPath.endpoint clusterID:clusterPath.cluster];
853855
if (!data) {
854856
[clusterPathsToRemove addObject:clusterPath];
855857
}
@@ -884,13 +886,13 @@ - (nullable MTRDeviceClusterData *)_clusterDataForPath:(MTRClusterPath *)cluster
884886
return nil;
885887
}
886888

887-
NSAssert(_deviceController.controllerDataStore != nil,
889+
NSAssert(self.deviceController.controllerDataStore != nil,
888890
@"How can _persistedClusters have an entry if we have no persistence?");
889891
NSAssert(_persistedClusterData != nil,
890892
@"How can _persistedClusterData not exist if we have persisted clusters?");
891893

892894
// Page in the stored value for the data.
893-
MTRDeviceClusterData * data = [_deviceController.controllerDataStore getStoredClusterDataForNodeID:_nodeID endpointID:clusterPath.endpoint clusterID:clusterPath.cluster];
895+
MTRDeviceClusterData * data = [self.deviceController.controllerDataStore getStoredClusterDataForNodeID:_nodeID endpointID:clusterPath.endpoint clusterID:clusterPath.cluster];
894896
MTR_LOG("%@ cluster path %@ cache miss - load from storage success %@", self, clusterPath, MTR_YES_NO(data));
895897
if (data != nil) {
896898
[_persistedClusterData setObject:data forKey:clusterPath];

src/darwin/Framework/CHIP/MTRDevice_Concrete.mm

+8
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,8 @@ - (BOOL)unitTestSuppressTimeBasedReachabilityChanges:(MTRDevice *)device;
272272
#endif
273273

274274
@implementation MTRDevice_Concrete {
275+
MTRDeviceController_Concrete * _deviceController;
276+
275277
#ifdef DEBUG
276278
NSUInteger _unitTestAttributesReportedSinceLastCheck;
277279
#endif
@@ -365,6 +367,7 @@ - (instancetype)initWithNodeID:(NSNumber *)nodeID controller:(MTRDeviceControlle
365367
{
366368
// `super` was NSObject, is now MTRDevice. MTRDevice hides its `init`
367369
if (self = [super initForSubclassesWithNodeID:nodeID controller:controller]) {
370+
_deviceController = controller;
368371
_timeSyncLock = OS_UNFAIR_LOCK_INIT;
369372
_descriptionLock = OS_UNFAIR_LOCK_INIT;
370373
_fabricIndex = controller.fabricIndex;
@@ -465,6 +468,11 @@ - (NSString *)description
465468
stringWithFormat:@"<%@: %p, node: %016llX-%016llX (%llu), VID: %@, PID: %@, WiFi: %@, Thread: %@, state: %@, last subscription attempt wait: %lus, queued work: %lu, last report: %@%@, last subscription failure: %@%@, controller: %@>", NSStringFromClass(self.class), self, _deviceController.compressedFabricID.unsignedLongLongValue, _nodeID.unsignedLongLongValue, _nodeID.unsignedLongLongValue, vid, pid, wifi, thread, InternalDeviceStateString(internalDeviceState), static_cast<unsigned long>(lastSubscriptionAttemptWait), static_cast<unsigned long>(_asyncWorkQueue.itemCount), mostRecentReportTime, reportAge, lastSubscriptionFailureTime, subscriptionFailureAge, _deviceController.uniqueIdentifier];
466469
}
467470

471+
- (nullable MTRDeviceController *)deviceController
472+
{
473+
return _deviceController;
474+
}
475+
468476
- (NSDictionary *)_internalProperties
469477
{
470478
NSMutableDictionary * properties = [NSMutableDictionary dictionary];

src/darwin/Framework/CHIP/MTRDevice_Internal.h

-4
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,6 @@ MTR_DIRECT_MEMBERS
116116
// Our node ID, with the ivar declared explicitly so it's accessible to
117117
// subclasses.
118118
NSNumber * _nodeID;
119-
120-
// Our controller. Declared nullable because our property is, though in
121-
// practice it does not look like we ever set it to nil.
122-
MTRDeviceController * _Nullable _deviceController;
123119
}
124120

125121
- (instancetype)initForSubclassesWithNodeID:(NSNumber *)nodeID controller:(MTRDeviceController *)controller;

src/darwin/Framework/CHIP/MTRDevice_XPC.mm

+9-2
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,16 @@
8080
: [[self deviceController] uniqueIdentifier] nodeID \
8181
: [self nodeID])
8282

83-
@implementation MTRDevice_XPC
83+
@implementation MTRDevice_XPC {
84+
MTRDeviceController_XPC * _deviceController;
85+
}
8486

8587
@synthesize _internalState;
8688

8789
- (instancetype)initWithNodeID:(NSNumber *)nodeID controller:(MTRDeviceController_XPC *)controller
8890
{
8991
if (self = [super initForSubclassesWithNodeID:nodeID controller:controller]) {
90-
// Nothing else to do, all set.
92+
_deviceController = controller;
9193
}
9294

9395
return self;
@@ -131,6 +133,11 @@ - (NSString *)description
131133
_deviceController.uniqueIdentifier];
132134
}
133135

136+
- (nullable MTRDeviceController *)deviceController
137+
{
138+
return _deviceController;
139+
}
140+
134141
#pragma mark - Client Callbacks (MTRDeviceDelegate)
135142

136143
// required methods for MTRDeviceDelegates

0 commit comments

Comments
 (0)