Skip to content

Commit 709841e

Browse files
If an XPC client doesn't care about a nodeID (hasn't made it), don't create one (project-chip#36586)
* Fixing infinite loop * Restyled by clang-format --------- Co-authored-by: Restyled.io <commits@restyled.io>
1 parent 334b1d9 commit 709841e

File tree

3 files changed

+9
-3
lines changed

3 files changed

+9
-3
lines changed

src/darwin/Framework/CHIP/MTRDeviceController.mm

+7-2
Original file line numberDiff line numberDiff line change
@@ -371,17 +371,22 @@ - (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(N
371371
return [[MTRDevice alloc] initForSubclassesWithNodeID:nodeID controller:self];
372372
}
373373

374-
- (MTRDevice *)deviceForNodeID:(NSNumber *)nodeID
374+
- (MTRDevice *)_deviceForNodeID:(NSNumber *)nodeID createIfNeeded:(BOOL)createIfNeeded
375375
{
376376
std::lock_guard lock(*self.deviceMapLock);
377377
MTRDevice * deviceToReturn = [_nodeIDToDeviceMap objectForKey:nodeID];
378-
if (!deviceToReturn) {
378+
if (!deviceToReturn && createIfNeeded) {
379379
deviceToReturn = [self _setupDeviceForNodeID:nodeID prefetchedClusterData:nil];
380380
}
381381

382382
return deviceToReturn;
383383
}
384384

385+
- (MTRDevice *)deviceForNodeID:(NSNumber *)nodeID
386+
{
387+
return [self _deviceForNodeID:nodeID createIfNeeded:YES];
388+
}
389+
385390
- (void)removeDevice:(MTRDevice *)device
386391
{
387392
std::lock_guard lock(*self.deviceMapLock);

src/darwin/Framework/CHIP/MTRDeviceController_Internal.h

+1
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ NS_ASSUME_NONNULL_BEGIN
107107
#pragma mark - Device-specific data and SDK access
108108
// DeviceController will act as a central repository for this opaque dictionary that MTRDevice manages
109109
- (MTRDevice *)deviceForNodeID:(NSNumber *)nodeID;
110+
- (MTRDevice *)_deviceForNodeID:(NSNumber *)nodeID createIfNeeded:(BOOL)createIfNeeded;
110111
/**
111112
* _setupDeviceForNodeID is a hook expected to be implemented by subclasses to
112113
* actually allocate a device object of the right type.

src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm

+1-1
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ - (oneway void)controller:(NSUUID *)controller controllerConfigurationUpdated:(N
487487
continue;
488488
}
489489

490-
auto * device = static_cast<MTRDevice_XPC *>([self deviceForNodeID:nodeID]);
490+
auto * device = static_cast<MTRDevice_XPC *>([self _deviceForNodeID:nodeID createIfNeeded:NO]);
491491
[device device:nodeID internalStateUpdated:deviceInternalState];
492492
}
493493
}

0 commit comments

Comments
 (0)