Skip to content

Commit

Permalink
[Darwin] MTRDeviceController_XPC _updateRegistrationInfo double lock …
Browse files Browse the repository at this point in the history
…fix (project-chip#37664)

* [Darwin] MTRDeviceController_XPC _updateRegistrationInfo double lock fix

* Make sure device map is accessed safely with lock
  • Loading branch information
jtung-apple authored Feb 19, 2025
1 parent 1bd8e40 commit 0551d0a
Showing 1 changed file with 17 additions and 13 deletions.
30 changes: 17 additions & 13 deletions src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm
Original file line number Diff line number Diff line change
Expand Up @@ -72,24 +72,28 @@ @implementation MTRDeviceController_XPC

- (void)_updateRegistrationInfo
{
NSMutableDictionary * registrationInfo = [NSMutableDictionary dictionary];
dispatch_async(self.workQueue, ^{
std::lock_guard lock(*self.deviceMapLock);

NSMutableDictionary * controllerContext = [NSMutableDictionary dictionary];
NSMutableArray * nodeIDs = [NSMutableArray array];
NSMutableDictionary * registrationInfo = [NSMutableDictionary dictionary];

for (NSNumber * nodeID in [self.nodeIDToDeviceMap keyEnumerator]) {
MTRDevice * device = [self _deviceForNodeID:nodeID createIfNeeded:NO];
if ([device delegateExists]) {
NSMutableDictionary * nodeDictionary = [NSMutableDictionary dictionary];
MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationNodeIDKey, nodeID, nodeDictionary)
NSMutableDictionary * controllerContext = [NSMutableDictionary dictionary];
NSMutableArray * nodeIDs = [NSMutableArray array];

[nodeIDs addObject:nodeDictionary];
for (NSNumber * nodeID in [self.nodeIDToDeviceMap keyEnumerator]) {
MTRDevice * device = self.nodeIDToDeviceMap[nodeID];
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)
MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationNodeIDsKey, nodeIDs, registrationInfo)
MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationControllerContextKey, controllerContext, registrationInfo)

[self updateControllerConfiguration:registrationInfo];
[self updateControllerConfiguration:registrationInfo];
});
}

- (void)_registerNodeID:(NSNumber *)nodeID
Expand Down

0 comments on commit 0551d0a

Please sign in to comment.