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;
@@ -127,7 +128,7 @@ - (BOOL)setValue:(NSDictionary<NSString *, id> *)value
127
128
128
129
// We serialized properly, so should be good to go on the value. Lock
129
130
// around our ivar accesses.
130
- MTRAutoUnfairLock lock (_lock);
131
+ std::lock_guard lock (_lock);
131
132
132
133
_value = [value copy ];
133
134
@@ -151,13 +152,13 @@ - (BOOL)setValue:(NSDictionary<NSString *, id> *)value
151
152
152
153
- (NSDictionary <NSString *, id> *)value
153
154
{
154
- MTRAutoUnfairLock lock (_lock);
155
+ std::lock_guard lock (_lock);
155
156
return [_value copy ];
156
157
}
157
158
158
159
- (BOOL )associateWithController : (nullable MTRDeviceController *)controller
159
160
{
160
- MTRAutoUnfairLock lock (_lock);
161
+ std::lock_guard lock (_lock);
161
162
162
163
MTRDeviceController * existingController = _deviceController;
163
164
if (existingController != nil ) {
@@ -177,14 +178,14 @@ - (BOOL)associateWithController:(nullable MTRDeviceController *)controller
177
178
178
179
- (void )invalidate
179
180
{
180
- MTRAutoUnfairLock lock (_lock);
181
+ std::lock_guard lock (_lock);
181
182
182
183
_deviceController = nil ;
183
184
}
184
185
185
186
- (BOOL )addToCluster : (const app::ConcreteClusterPath &)cluster
186
187
{
187
- MTRAutoUnfairLock lock (_lock);
188
+ std::lock_guard lock (_lock);
188
189
189
190
if (_parentCluster.mClusterId != kInvalidClusterId ) {
190
191
MTR_LOG_ERROR (" Cannot add attribute to cluster " ChipLogFormatMEI " ; already added to cluster " ChipLogFormatMEI, ChipLogValueMEI (cluster.mClusterId ), ChipLogValueMEI (_parentCluster.mClusterId ));
@@ -197,13 +198,13 @@ - (BOOL)addToCluster:(const app::ConcreteClusterPath &)cluster
197
198
198
199
- (void )updateParentCluster : (const app::ConcreteClusterPath &)cluster
199
200
{
200
- MTRAutoUnfairLock lock (_lock);
201
+ std::lock_guard lock (_lock);
201
202
_parentCluster = cluster;
202
203
}
203
204
204
205
- (const chip::app::ConcreteClusterPath &)parentCluster
205
206
{
206
- MTRAutoUnfairLock lock (_lock);
207
+ std::lock_guard lock (_lock);
207
208
return _parentCluster;
208
209
}
209
210
0 commit comments