34
34
35
35
MTR_DIRECT_MEMBERS
36
36
@implementation MTRServerAttribute {
37
- // _lock always protects access to _deviceController, _value, and _parentCluster.
38
- // _serializedValue is protected when we are modifying it directly while we
39
- // have no _deviceController. Once we have one, _serializedValue is only
40
- // modified on the Matter thread.
41
- MTRUnfairLock _lock;
37
+ // _lock always protects access to _deviceController, _value, and
38
+ // _parentCluster. _serializedValue is protected when we are modifying it
39
+ // directly while we have no _deviceController. Once we have one,
40
+ // _serializedValue is only modified on the Matter thread.
41
+ os_unfair_lock _lock;
42
42
MTRDeviceController * __weak _deviceController;
43
43
NSDictionary <NSString *, id > * _value;
44
44
app::ConcreteClusterPath _parentCluster;
@@ -75,6 +75,7 @@ - (nullable instancetype)initWithAttributeID:(NSNumber *)attributeID value:(NSDi
75
75
return nil ;
76
76
}
77
77
78
+ _lock = OS_UNFAIR_LOCK_INIT;
78
79
_attributeID = attributeID;
79
80
_requiredReadPrivilege = requiredReadPrivilege;
80
81
_writable = writable;
@@ -132,7 +133,7 @@ - (BOOL)setValueInternal:(NSDictionary<NSString *, id> *)value logIfNotAssociate
132
133
133
134
// We serialized properly, so should be good to go on the value. Lock
134
135
// around our ivar accesses.
135
- MTRAutoUnfairLock lock (_lock);
136
+ std::lock_guard lock (_lock);
136
137
137
138
_value = [value copy ];
138
139
@@ -161,13 +162,13 @@ - (BOOL)setValueInternal:(NSDictionary<NSString *, id> *)value logIfNotAssociate
161
162
162
163
- (NSDictionary <NSString *, id> *)value
163
164
{
164
- MTRAutoUnfairLock lock (_lock);
165
+ std::lock_guard lock (_lock);
165
166
return [_value copy ];
166
167
}
167
168
168
169
- (BOOL )associateWithController : (nullable MTRDeviceController *)controller
169
170
{
170
- MTRAutoUnfairLock lock (_lock);
171
+ std::lock_guard lock (_lock);
171
172
172
173
MTRDeviceController * existingController = _deviceController;
173
174
if (existingController != nil ) {
@@ -187,14 +188,14 @@ - (BOOL)associateWithController:(nullable MTRDeviceController *)controller
187
188
188
189
- (void )invalidate
189
190
{
190
- MTRAutoUnfairLock lock (_lock);
191
+ std::lock_guard lock (_lock);
191
192
192
193
_deviceController = nil ;
193
194
}
194
195
195
196
- (BOOL )addToCluster : (const app::ConcreteClusterPath &)cluster
196
197
{
197
- MTRAutoUnfairLock lock (_lock);
198
+ std::lock_guard lock (_lock);
198
199
199
200
if (_parentCluster.mClusterId != kInvalidClusterId ) {
200
201
MTR_LOG_ERROR (" Cannot add attribute to cluster " ChipLogFormatMEI " ; already added to cluster " ChipLogFormatMEI, ChipLogValueMEI (cluster.mClusterId ), ChipLogValueMEI (_parentCluster.mClusterId ));
@@ -207,13 +208,13 @@ - (BOOL)addToCluster:(const app::ConcreteClusterPath &)cluster
207
208
208
209
- (void )updateParentCluster : (const app::ConcreteClusterPath &)cluster
209
210
{
210
- MTRAutoUnfairLock lock (_lock);
211
+ std::lock_guard lock (_lock);
211
212
_parentCluster = cluster;
212
213
}
213
214
214
215
- (const chip::app::ConcreteClusterPath &)parentCluster
215
216
{
216
- MTRAutoUnfairLock lock (_lock);
217
+ std::lock_guard lock (_lock);
217
218
return _parentCluster;
218
219
}
219
220
0 commit comments