From 81264d353b31418cc37461a86d2a9a3bcdadba3b Mon Sep 17 00:00:00 2001 From: Jeff Tung <100387939+jtung-apple@users.noreply.github.com> Date: Wed, 19 Feb 2025 08:48:15 -0800 Subject: [PATCH] [Darwin] MTRDevice _delegateExists cannot be called without holding lock --- src/darwin/Framework/CHIP/MTRDevice.mm | 6 ++++++ src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm | 2 +- src/darwin/Framework/CHIP/MTRDevice_Internal.h | 4 ++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/darwin/Framework/CHIP/MTRDevice.mm b/src/darwin/Framework/CHIP/MTRDevice.mm index 7633d03ebd2d3b..1d09453c321d21 100644 --- a/src/darwin/Framework/CHIP/MTRDevice.mm +++ b/src/darwin/Framework/CHIP/MTRDevice.mm @@ -253,6 +253,12 @@ - (void)invalidate [self _cancelAllAttributeValueWaiters]; } +- (BOOL)delegateExists +{ + std::lock_guard lock(_lock); + return [self _delegateExists]; +} + - (BOOL)_delegateExists { os_unfair_lock_assert_owner(&self->_lock); diff --git a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm index 4871b1b129b699..97f447f1f81ac0 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm @@ -79,7 +79,7 @@ - (void)_updateRegistrationInfo for (NSNumber * nodeID in [self.nodeIDToDeviceMap keyEnumerator]) { MTRDevice * device = [self _deviceForNodeID:nodeID createIfNeeded:NO]; - if ([device _delegateExists]) { + if ([device delegateExists]) { NSMutableDictionary * nodeDictionary = [NSMutableDictionary dictionary]; MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationNodeIDKey, nodeID, nodeDictionary) diff --git a/src/darwin/Framework/CHIP/MTRDevice_Internal.h b/src/darwin/Framework/CHIP/MTRDevice_Internal.h index 1887ddc3cb27b6..c7c4191b71b0d9 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_Internal.h +++ b/src/darwin/Framework/CHIP/MTRDevice_Internal.h @@ -146,8 +146,12 @@ MTR_DIRECT_MEMBERS // Returns YES if any non-null delegates were found - (BOOL)_iterateDelegatesWithBlock:(void(NS_NOESCAPE ^ _Nullable)(MTRDeviceDelegateInfo * delegateInfo))block; +// For subclasses to call while holding lock - (BOOL)_delegateExists; +// For device controller or other objects to call +- (BOOL)delegateExists; + // Must be called by subclasses or MTRDevice implementation only. - (void)_delegateAdded:(id)delegate; - (void)_delegateRemoved:(id)delegate;