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)