Skip to content

Commit 56ed10a

Browse files
authored
[Darwin] MTRDevice_XPC delegate callbacks need to hold lock before _callDelegatesWithBlock (#35095)
* [Darwin] MTRDevice_XPC delegate callbacks need to hold lock before _callDelegatesWithBlock * Add back _callDelegatesWithBlock to avoid conflict
1 parent 1866812 commit 56ed10a

File tree

3 files changed

+15
-6
lines changed

3 files changed

+15
-6
lines changed

src/darwin/Framework/CHIP/MTRDevice.mm

+6
Original file line numberDiff line numberDiff line change
@@ -1105,6 +1105,12 @@ - (BOOL)_callDelegatesWithBlock:(void (^)(id<MTRDeviceDelegate> delegate))block
11051105
return (delegatesCalled > 0);
11061106
}
11071107

1108+
- (BOOL)_lockAndCallDelegatesWithBlock:(void (^)(id<MTRDeviceDelegate> delegate))block
1109+
{
1110+
std::lock_guard lock(self->_lock);
1111+
return [self _callDelegatesWithBlock:block];
1112+
}
1113+
11081114
#ifdef DEBUG
11091115
// Only used for unit test purposes - normal delegate should not expect or handle being called back synchronously
11101116
- (void)_callFirstDelegateSynchronouslyWithBlock:(void (^)(id<MTRDeviceDelegate> delegate))block

src/darwin/Framework/CHIP/MTRDevice_Internal.h

+3
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,9 @@ MTR_DIRECT_MEMBERS
144144

145145
- (BOOL)_callDelegatesWithBlock:(void (^)(id<MTRDeviceDelegate> delegate))block;
146146

147+
// Called by MTRDevice_XPC to forward delegate callbacks
148+
- (BOOL)_lockAndCallDelegatesWithBlock:(void (^)(id<MTRDeviceDelegate> delegate))block;
149+
147150
/**
148151
* Like the public invokeCommandWithEndpointID but:
149152
*

src/darwin/Framework/CHIP/MTRDevice_XPC.mm

+6-6
Original file line numberDiff line numberDiff line change
@@ -99,23 +99,23 @@ - (instancetype)initWithNodeID:(NSNumber *)nodeID controller:(MTRDeviceControlle
9999
- (oneway void)device:(NSNumber *)nodeID stateChanged:(MTRDeviceState)state
100100
{
101101
MTR_LOG("%s", __PRETTY_FUNCTION__);
102-
[self _callDelegatesWithBlock:^(id<MTRDeviceDelegate> delegate) {
102+
[self _lockAndCallDelegatesWithBlock:^(id<MTRDeviceDelegate> delegate) {
103103
[delegate device:self stateChanged:state];
104104
}];
105105
}
106106

107107
- (oneway void)device:(NSNumber *)nodeID receivedAttributeReport:(NSArray<NSDictionary<NSString *, id> *> *)attributeReport
108108
{
109109
MTR_LOG("%s", __PRETTY_FUNCTION__);
110-
[self _callDelegatesWithBlock:^(id<MTRDeviceDelegate> delegate) {
110+
[self _lockAndCallDelegatesWithBlock:^(id<MTRDeviceDelegate> delegate) {
111111
[delegate device:self receivedAttributeReport:attributeReport];
112112
}];
113113
}
114114

115115
- (oneway void)device:(NSNumber *)nodeID receivedEventReport:(NSArray<NSDictionary<NSString *, id> *> *)eventReport
116116
{
117117
MTR_LOG("%s", __PRETTY_FUNCTION__);
118-
[self _callDelegatesWithBlock:^(id<MTRDeviceDelegate> delegate) {
118+
[self _lockAndCallDelegatesWithBlock:^(id<MTRDeviceDelegate> delegate) {
119119
[delegate device:self receivedEventReport:eventReport];
120120
}];
121121
}
@@ -124,7 +124,7 @@ - (oneway void)device:(NSNumber *)nodeID receivedEventReport:(NSArray<NSDictiona
124124
- (oneway void)deviceBecameActive:(NSNumber *)nodeID
125125
{
126126
MTR_LOG("%s", __PRETTY_FUNCTION__);
127-
[self _callDelegatesWithBlock:^(id<MTRDeviceDelegate> delegate) {
127+
[self _lockAndCallDelegatesWithBlock:^(id<MTRDeviceDelegate> delegate) {
128128
if ([delegate respondsToSelector:@selector(deviceBecameActive:)]) {
129129
[delegate deviceBecameActive:self];
130130
}
@@ -133,7 +133,7 @@ - (oneway void)deviceBecameActive:(NSNumber *)nodeID
133133

134134
- (oneway void)deviceCachePrimed:(NSNumber *)nodeID
135135
{
136-
[self _callDelegatesWithBlock:^(id<MTRDeviceDelegate> delegate) {
136+
[self _lockAndCallDelegatesWithBlock:^(id<MTRDeviceDelegate> delegate) {
137137
if ([delegate respondsToSelector:@selector(deviceCachePrimed:)]) {
138138
[delegate deviceCachePrimed:self];
139139
}
@@ -142,7 +142,7 @@ - (oneway void)deviceCachePrimed:(NSNumber *)nodeID
142142

143143
- (oneway void)deviceConfigurationChanged:(NSNumber *)nodeID
144144
{
145-
[self _callDelegatesWithBlock:^(id<MTRDeviceDelegate> delegate) {
145+
[self _lockAndCallDelegatesWithBlock:^(id<MTRDeviceDelegate> delegate) {
146146
if ([delegate respondsToSelector:@selector(deviceConfigurationChanged:)]) {
147147
[delegate deviceConfigurationChanged:self];
148148
}

0 commit comments

Comments
 (0)