From 546a3ca0f34ba9c01816671330ddc7e44281a420 Mon Sep 17 00:00:00 2001 From: Justin Wood <woody@apple.com> Date: Mon, 17 Feb 2025 13:23:57 -0800 Subject: [PATCH 1/3] Only registering when a delegate is added --- src/darwin/Framework/CHIP/MTRDevice.mm | 18 ++++++++++++++---- .../Framework/CHIP/MTRDeviceController_XPC.mm | 14 ++++++++------ .../CHIP/MTRDeviceController_XPC_Internal.h | 1 + .../Framework/CHIP/MTRDevice_Concrete.mm | 4 ++-- src/darwin/Framework/CHIP/MTRDevice_Internal.h | 3 ++- src/darwin/Framework/CHIP/MTRDevice_XPC.mm | 15 +++++++++++++++ 6 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/darwin/Framework/CHIP/MTRDevice.mm b/src/darwin/Framework/CHIP/MTRDevice.mm index 63555c8ebb82b9..db2698a81a400c 100644 --- a/src/darwin/Framework/CHIP/MTRDevice.mm +++ b/src/darwin/Framework/CHIP/MTRDevice.mm @@ -201,10 +201,10 @@ - (void)_addDelegate:(id<MTRDeviceDelegate>)delegate queue:(dispatch_queue_t)que MTR_LOG("%@ added delegate info %@", self, newDelegateInfo); // Call hook to allow subclasses to act on delegate addition. - [self _delegateAdded]; + [self _delegateAdded: delegate]; } -- (void)_delegateAdded +- (void)_delegateAdded:(id<MTRDeviceDelegate>)delegate { os_unfair_lock_assert_owner(&self->_lock); @@ -214,9 +214,9 @@ - (void)_delegateAdded - (void)removeDelegate:(id<MTRDeviceDelegate>)delegate { MTR_LOG("%@ removeDelegate %@", self, delegate); - + std::lock_guard lock(_lock); - + NSMutableSet<MTRDeviceDelegateInfo *> * delegatesToRemove = [NSMutableSet set]; [self _iterateDelegatesWithBlock:^(MTRDeviceDelegateInfo * delegateInfo) { id<MTRDeviceDelegate> strongDelegate = delegateInfo.delegate; @@ -233,6 +233,16 @@ - (void)removeDelegate:(id<MTRDeviceDelegate>)delegate [_delegates minusSet:delegatesToRemove]; MTR_LOG("%@ removeDelegate: removed %lu", self, static_cast<unsigned long>(_delegates.count - oldDelegatesCount)); } + + // Call hook to allow subclasses to act on delegate addition. + [self _delegateRemoved: delegate]; +} + +- (void)_delegateRemoved:(id<MTRDeviceDelegate>)delegate +{ + os_unfair_lock_assert_owner(&self->_lock); + + // Nothing to do for now. At the moment this is a hook for subclasses. } - (void)invalidate diff --git a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm index ac8fa523416f80..78a0e7a559409e 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm @@ -18,6 +18,7 @@ #import "MTRDefines_Internal.h" #import "MTRDeviceController_Internal.h" +#import "MTRDevice_Internal.h" #import "MTRDevice_XPC.h" #import "MTRDevice_XPC_Internal.h" #import "MTRError_Internal.h" @@ -77,10 +78,13 @@ - (void)_updateRegistrationInfo NSMutableArray * nodeIDs = [NSMutableArray array]; for (NSNumber * nodeID in [self.nodeIDToDeviceMap keyEnumerator]) { - NSMutableDictionary * nodeDictionary = [NSMutableDictionary dictionary]; - MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationNodeIDKey, nodeID, nodeDictionary) - - [nodeIDs addObject:nodeDictionary]; + MTRDevice * device = [self _deviceForNodeID: nodeID createIfNeeded: NO]; + if ( [device _delegateExists] ) { + NSMutableDictionary * nodeDictionary = [NSMutableDictionary dictionary]; + MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationNodeIDKey, nodeID, nodeDictionary) + + [nodeIDs addObject:nodeDictionary]; + } } MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationNodeIDsKey, nodeIDs, registrationInfo) MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationControllerContextKey, controllerContext, registrationInfo) @@ -386,8 +390,6 @@ - (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(N [self.nodeIDToDeviceMap setObject:deviceToReturn forKey:nodeID]; MTR_LOG("%s: returning XPC device for node id %@", __PRETTY_FUNCTION__, nodeID); - [self _updateRegistrationInfo]; - return deviceToReturn; } diff --git a/src/darwin/Framework/CHIP/MTRDeviceController_XPC_Internal.h b/src/darwin/Framework/CHIP/MTRDeviceController_XPC_Internal.h index e6c85b1f8de348..347038f3ae3c0c 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController_XPC_Internal.h +++ b/src/darwin/Framework/CHIP/MTRDeviceController_XPC_Internal.h @@ -19,5 +19,6 @@ @interface MTRDeviceController_XPC (Internal) - (id)initWithMachServiceName:(NSString *)machServiceName options:(NSXPCConnectionOptions)options; +- (void)_updateRegistrationInfo; @end diff --git a/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm b/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm index 0cb81e6b3f56dc..2483901a363be3 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm +++ b/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm @@ -884,11 +884,11 @@ - (BOOL)_subscriptionsAllowed return self.suspended == NO && ![_deviceController isKindOfClass:MTRDeviceControllerOverXPC.class]; } -- (void)_delegateAdded +- (void)_delegateAdded:(id<MTRDeviceDelegate>)delegate { os_unfair_lock_assert_owner(&self->_lock); - [super _delegateAdded]; + [super _delegateAdded: delegate]; [self _ensureSubscriptionForExistingDelegates:@"delegate is set"]; } diff --git a/src/darwin/Framework/CHIP/MTRDevice_Internal.h b/src/darwin/Framework/CHIP/MTRDevice_Internal.h index 8db681d4802e60..1887ddc3cb27b6 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_Internal.h +++ b/src/darwin/Framework/CHIP/MTRDevice_Internal.h @@ -149,7 +149,8 @@ MTR_DIRECT_MEMBERS - (BOOL)_delegateExists; // Must be called by subclasses or MTRDevice implementation only. -- (void)_delegateAdded; +- (void)_delegateAdded:(id<MTRDeviceDelegate>)delegate; +- (void)_delegateRemoved:(id<MTRDeviceDelegate>)delegate; #ifdef DEBUG // Only used for unit test purposes - normal delegate should not expect or handle being called back synchronously diff --git a/src/darwin/Framework/CHIP/MTRDevice_XPC.mm b/src/darwin/Framework/CHIP/MTRDevice_XPC.mm index 77b55f315c6658..54b97b1c7f5747 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_XPC.mm +++ b/src/darwin/Framework/CHIP/MTRDevice_XPC.mm @@ -22,6 +22,7 @@ #import <Matter/MTRDeviceControllerParameters.h> #import "MTRDeviceController_Internal.h" +#import "MTRDeviceController_XPC_Internal.h" #import "MTRAsyncWorkQueue.h" #import "MTRAttestationTrustStoreBridge.h" @@ -146,6 +147,20 @@ - (MTRNetworkCommissioningFeature)networkCommissioningFeatures return [[self._internalState objectForKey:kMTRDeviceInternalPropertyNetworkFeatures] unsignedIntValue]; } +#pragma mark - Delegate added/removed callbacks + +- (void)_delegateAdded:(id<MTRDeviceDelegate>)delegate { + [super _delegateAdded: delegate]; + MTR_LOG("%@ delegate added: %@", self, delegate); + [(MTRDeviceController_XPC *)[self deviceController] _updateRegistrationInfo]; +} + +- (void)_delegateRemoved:(id<MTRDeviceDelegate>)delegate { + [super _delegateRemoved: delegate]; + MTR_LOG("%@ delegate removed: %@", self, delegate); + [(MTRDeviceController_XPC *)[self deviceController] _updateRegistrationInfo]; +} + #pragma mark - Client Callbacks (MTRDeviceDelegate) // required methods for MTRDeviceDelegates From ed1fc026fcc320eb37f4d58f9613019a47cf426e Mon Sep 17 00:00:00 2001 From: "Restyled.io" <commits@restyled.io> Date: Mon, 17 Feb 2025 21:26:16 +0000 Subject: [PATCH 2/3] Restyled by whitespace --- src/darwin/Framework/CHIP/MTRDevice.mm | 6 +++--- src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/darwin/Framework/CHIP/MTRDevice.mm b/src/darwin/Framework/CHIP/MTRDevice.mm index db2698a81a400c..96ef3b966c2c54 100644 --- a/src/darwin/Framework/CHIP/MTRDevice.mm +++ b/src/darwin/Framework/CHIP/MTRDevice.mm @@ -214,9 +214,9 @@ - (void)_delegateAdded:(id<MTRDeviceDelegate>)delegate - (void)removeDelegate:(id<MTRDeviceDelegate>)delegate { MTR_LOG("%@ removeDelegate %@", self, delegate); - + std::lock_guard lock(_lock); - + NSMutableSet<MTRDeviceDelegateInfo *> * delegatesToRemove = [NSMutableSet set]; [self _iterateDelegatesWithBlock:^(MTRDeviceDelegateInfo * delegateInfo) { id<MTRDeviceDelegate> strongDelegate = delegateInfo.delegate; @@ -233,7 +233,7 @@ - (void)removeDelegate:(id<MTRDeviceDelegate>)delegate [_delegates minusSet:delegatesToRemove]; MTR_LOG("%@ removeDelegate: removed %lu", self, static_cast<unsigned long>(_delegates.count - oldDelegatesCount)); } - + // Call hook to allow subclasses to act on delegate addition. [self _delegateRemoved: delegate]; } diff --git a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm index 78a0e7a559409e..c9204da9d07a80 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm @@ -82,7 +82,7 @@ - (void)_updateRegistrationInfo if ( [device _delegateExists] ) { NSMutableDictionary * nodeDictionary = [NSMutableDictionary dictionary]; MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationNodeIDKey, nodeID, nodeDictionary) - + [nodeIDs addObject:nodeDictionary]; } } From d6a3afbd4e22a97e250ae0440e47caa2577ca67a Mon Sep 17 00:00:00 2001 From: "Restyled.io" <commits@restyled.io> Date: Mon, 17 Feb 2025 21:26:24 +0000 Subject: [PATCH 3/3] Restyled by clang-format --- src/darwin/Framework/CHIP/MTRDevice.mm | 4 ++-- .../Framework/CHIP/MTRDeviceController_XPC.mm | 4 ++-- src/darwin/Framework/CHIP/MTRDevice_Concrete.mm | 2 +- src/darwin/Framework/CHIP/MTRDevice_XPC.mm | 14 ++++++++------ 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/darwin/Framework/CHIP/MTRDevice.mm b/src/darwin/Framework/CHIP/MTRDevice.mm index 96ef3b966c2c54..7633d03ebd2d3b 100644 --- a/src/darwin/Framework/CHIP/MTRDevice.mm +++ b/src/darwin/Framework/CHIP/MTRDevice.mm @@ -201,7 +201,7 @@ - (void)_addDelegate:(id<MTRDeviceDelegate>)delegate queue:(dispatch_queue_t)que MTR_LOG("%@ added delegate info %@", self, newDelegateInfo); // Call hook to allow subclasses to act on delegate addition. - [self _delegateAdded: delegate]; + [self _delegateAdded:delegate]; } - (void)_delegateAdded:(id<MTRDeviceDelegate>)delegate @@ -235,7 +235,7 @@ - (void)removeDelegate:(id<MTRDeviceDelegate>)delegate } // Call hook to allow subclasses to act on delegate addition. - [self _delegateRemoved: delegate]; + [self _delegateRemoved:delegate]; } - (void)_delegateRemoved:(id<MTRDeviceDelegate>)delegate diff --git a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm index c9204da9d07a80..4871b1b129b699 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm @@ -78,8 +78,8 @@ - (void)_updateRegistrationInfo NSMutableArray * nodeIDs = [NSMutableArray array]; for (NSNumber * nodeID in [self.nodeIDToDeviceMap keyEnumerator]) { - MTRDevice * device = [self _deviceForNodeID: nodeID createIfNeeded: NO]; - if ( [device _delegateExists] ) { + MTRDevice * device = [self _deviceForNodeID:nodeID createIfNeeded:NO]; + if ([device _delegateExists]) { NSMutableDictionary * nodeDictionary = [NSMutableDictionary dictionary]; MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationNodeIDKey, nodeID, nodeDictionary) diff --git a/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm b/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm index 2483901a363be3..afbb41ff8da409 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm +++ b/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm @@ -888,7 +888,7 @@ - (void)_delegateAdded:(id<MTRDeviceDelegate>)delegate { os_unfair_lock_assert_owner(&self->_lock); - [super _delegateAdded: delegate]; + [super _delegateAdded:delegate]; [self _ensureSubscriptionForExistingDelegates:@"delegate is set"]; } diff --git a/src/darwin/Framework/CHIP/MTRDevice_XPC.mm b/src/darwin/Framework/CHIP/MTRDevice_XPC.mm index 54b97b1c7f5747..77fa823a24eb5a 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_XPC.mm +++ b/src/darwin/Framework/CHIP/MTRDevice_XPC.mm @@ -149,16 +149,18 @@ - (MTRNetworkCommissioningFeature)networkCommissioningFeatures #pragma mark - Delegate added/removed callbacks -- (void)_delegateAdded:(id<MTRDeviceDelegate>)delegate { - [super _delegateAdded: delegate]; +- (void)_delegateAdded:(id<MTRDeviceDelegate>)delegate +{ + [super _delegateAdded:delegate]; MTR_LOG("%@ delegate added: %@", self, delegate); - [(MTRDeviceController_XPC *)[self deviceController] _updateRegistrationInfo]; + [(MTRDeviceController_XPC *) [self deviceController] _updateRegistrationInfo]; } -- (void)_delegateRemoved:(id<MTRDeviceDelegate>)delegate { - [super _delegateRemoved: delegate]; +- (void)_delegateRemoved:(id<MTRDeviceDelegate>)delegate +{ + [super _delegateRemoved:delegate]; MTR_LOG("%@ delegate removed: %@", self, delegate); - [(MTRDeviceController_XPC *)[self deviceController] _updateRegistrationInfo]; + [(MTRDeviceController_XPC *) [self deviceController] _updateRegistrationInfo]; } #pragma mark - Client Callbacks (MTRDeviceDelegate)