Skip to content

Commit c6ab7de

Browse files
kjbraceyadbridge
authored andcommitted
Add volatile qualifiers to atomic functions
The atomic functions preserve volatile semantics - they only perform the accesses specified. Add the volatile qualifier to the value pointer to reflect this. This does not change existing caller code - it's equivalent to adding a const qualifier to indicate we don't write to a pointer - it means people can pass us qualified pointers without casts, letting the compile check const- or volatile-correctness. This is consistent with C11 <stdatomic.h>, which volatile-qualifies its equivalent functions. Note that this useage of volatile has nothing to do with the atomicity - objects accessed via the atomic functions do not need to be volatile. But it does permit these calls to be used on objects which have been declared volatile.
1 parent b744111 commit c6ab7de

File tree

2 files changed

+36
-36
lines changed

2 files changed

+36
-36
lines changed

platform/mbed_critical.c

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ void core_util_critical_section_exit(void)
116116
#pragma diag_suppress 3731
117117
#endif
118118

119-
bool core_util_atomic_cas_u8(uint8_t *ptr, uint8_t *expectedCurrentValue, uint8_t desiredValue)
119+
bool core_util_atomic_cas_u8(volatile uint8_t *ptr, uint8_t *expectedCurrentValue, uint8_t desiredValue)
120120
{
121121
do {
122122
uint8_t currentValue = __LDREXB(ptr);
@@ -129,7 +129,7 @@ bool core_util_atomic_cas_u8(uint8_t *ptr, uint8_t *expectedCurrentValue, uint8_
129129
return true;
130130
}
131131

132-
bool core_util_atomic_cas_u16(uint16_t *ptr, uint16_t *expectedCurrentValue, uint16_t desiredValue)
132+
bool core_util_atomic_cas_u16(volatile uint16_t *ptr, uint16_t *expectedCurrentValue, uint16_t desiredValue)
133133
{
134134
do {
135135
uint16_t currentValue = __LDREXH(ptr);
@@ -143,7 +143,7 @@ bool core_util_atomic_cas_u16(uint16_t *ptr, uint16_t *expectedCurrentValue, uin
143143
}
144144

145145

146-
bool core_util_atomic_cas_u32(uint32_t *ptr, uint32_t *expectedCurrentValue, uint32_t desiredValue)
146+
bool core_util_atomic_cas_u32(volatile uint32_t *ptr, uint32_t *expectedCurrentValue, uint32_t desiredValue)
147147
{
148148
do {
149149
uint32_t currentValue = __LDREXW(ptr);
@@ -156,7 +156,7 @@ bool core_util_atomic_cas_u32(uint32_t *ptr, uint32_t *expectedCurrentValue, uin
156156
return true;
157157
}
158158

159-
uint8_t core_util_atomic_incr_u8(uint8_t *valuePtr, uint8_t delta)
159+
uint8_t core_util_atomic_incr_u8(volatile uint8_t *valuePtr, uint8_t delta)
160160
{
161161
uint8_t newValue;
162162
do {
@@ -165,7 +165,7 @@ uint8_t core_util_atomic_incr_u8(uint8_t *valuePtr, uint8_t delta)
165165
return newValue;
166166
}
167167

168-
uint16_t core_util_atomic_incr_u16(uint16_t *valuePtr, uint16_t delta)
168+
uint16_t core_util_atomic_incr_u16(volatile uint16_t *valuePtr, uint16_t delta)
169169
{
170170
uint16_t newValue;
171171
do {
@@ -174,7 +174,7 @@ uint16_t core_util_atomic_incr_u16(uint16_t *valuePtr, uint16_t delta)
174174
return newValue;
175175
}
176176

177-
uint32_t core_util_atomic_incr_u32(uint32_t *valuePtr, uint32_t delta)
177+
uint32_t core_util_atomic_incr_u32(volatile uint32_t *valuePtr, uint32_t delta)
178178
{
179179
uint32_t newValue;
180180
do {
@@ -184,7 +184,7 @@ uint32_t core_util_atomic_incr_u32(uint32_t *valuePtr, uint32_t delta)
184184
}
185185

186186

187-
uint8_t core_util_atomic_decr_u8(uint8_t *valuePtr, uint8_t delta)
187+
uint8_t core_util_atomic_decr_u8(volatile uint8_t *valuePtr, uint8_t delta)
188188
{
189189
uint8_t newValue;
190190
do {
@@ -193,7 +193,7 @@ uint8_t core_util_atomic_decr_u8(uint8_t *valuePtr, uint8_t delta)
193193
return newValue;
194194
}
195195

196-
uint16_t core_util_atomic_decr_u16(uint16_t *valuePtr, uint16_t delta)
196+
uint16_t core_util_atomic_decr_u16(volatile uint16_t *valuePtr, uint16_t delta)
197197
{
198198
uint16_t newValue;
199199
do {
@@ -202,7 +202,7 @@ uint16_t core_util_atomic_decr_u16(uint16_t *valuePtr, uint16_t delta)
202202
return newValue;
203203
}
204204

205-
uint32_t core_util_atomic_decr_u32(uint32_t *valuePtr, uint32_t delta)
205+
uint32_t core_util_atomic_decr_u32(volatile uint32_t *valuePtr, uint32_t delta)
206206
{
207207
uint32_t newValue;
208208
do {
@@ -213,7 +213,7 @@ uint32_t core_util_atomic_decr_u32(uint32_t *valuePtr, uint32_t delta)
213213

214214
#else
215215

216-
bool core_util_atomic_cas_u8(uint8_t *ptr, uint8_t *expectedCurrentValue, uint8_t desiredValue)
216+
bool core_util_atomic_cas_u8(volatile uint8_t *ptr, uint8_t *expectedCurrentValue, uint8_t desiredValue)
217217
{
218218
bool success;
219219
uint8_t currentValue;
@@ -230,7 +230,7 @@ bool core_util_atomic_cas_u8(uint8_t *ptr, uint8_t *expectedCurrentValue, uint8_
230230
return success;
231231
}
232232

233-
bool core_util_atomic_cas_u16(uint16_t *ptr, uint16_t *expectedCurrentValue, uint16_t desiredValue)
233+
bool core_util_atomic_cas_u16(volatile uint16_t *ptr, uint16_t *expectedCurrentValue, uint16_t desiredValue)
234234
{
235235
bool success;
236236
uint16_t currentValue;
@@ -248,7 +248,7 @@ bool core_util_atomic_cas_u16(uint16_t *ptr, uint16_t *expectedCurrentValue, uin
248248
}
249249

250250

251-
bool core_util_atomic_cas_u32(uint32_t *ptr, uint32_t *expectedCurrentValue, uint32_t desiredValue)
251+
bool core_util_atomic_cas_u32(volatile uint32_t *ptr, uint32_t *expectedCurrentValue, uint32_t desiredValue)
252252
{
253253
bool success;
254254
uint32_t currentValue;
@@ -266,7 +266,7 @@ bool core_util_atomic_cas_u32(uint32_t *ptr, uint32_t *expectedCurrentValue, uin
266266
}
267267

268268

269-
uint8_t core_util_atomic_incr_u8(uint8_t *valuePtr, uint8_t delta)
269+
uint8_t core_util_atomic_incr_u8(volatile uint8_t *valuePtr, uint8_t delta)
270270
{
271271
uint8_t newValue;
272272
core_util_critical_section_enter();
@@ -276,7 +276,7 @@ uint8_t core_util_atomic_incr_u8(uint8_t *valuePtr, uint8_t delta)
276276
return newValue;
277277
}
278278

279-
uint16_t core_util_atomic_incr_u16(uint16_t *valuePtr, uint16_t delta)
279+
uint16_t core_util_atomic_incr_u16(volatile uint16_t *valuePtr, uint16_t delta)
280280
{
281281
uint16_t newValue;
282282
core_util_critical_section_enter();
@@ -286,7 +286,7 @@ uint16_t core_util_atomic_incr_u16(uint16_t *valuePtr, uint16_t delta)
286286
return newValue;
287287
}
288288

289-
uint32_t core_util_atomic_incr_u32(uint32_t *valuePtr, uint32_t delta)
289+
uint32_t core_util_atomic_incr_u32(volatile uint32_t *valuePtr, uint32_t delta)
290290
{
291291
uint32_t newValue;
292292
core_util_critical_section_enter();
@@ -297,7 +297,7 @@ uint32_t core_util_atomic_incr_u32(uint32_t *valuePtr, uint32_t delta)
297297
}
298298

299299

300-
uint8_t core_util_atomic_decr_u8(uint8_t *valuePtr, uint8_t delta)
300+
uint8_t core_util_atomic_decr_u8(volatile uint8_t *valuePtr, uint8_t delta)
301301
{
302302
uint8_t newValue;
303303
core_util_critical_section_enter();
@@ -307,7 +307,7 @@ uint8_t core_util_atomic_decr_u8(uint8_t *valuePtr, uint8_t delta)
307307
return newValue;
308308
}
309309

310-
uint16_t core_util_atomic_decr_u16(uint16_t *valuePtr, uint16_t delta)
310+
uint16_t core_util_atomic_decr_u16(volatile uint16_t *valuePtr, uint16_t delta)
311311
{
312312
uint16_t newValue;
313313
core_util_critical_section_enter();
@@ -317,7 +317,7 @@ uint16_t core_util_atomic_decr_u16(uint16_t *valuePtr, uint16_t delta)
317317
return newValue;
318318
}
319319

320-
uint32_t core_util_atomic_decr_u32(uint32_t *valuePtr, uint32_t delta)
320+
uint32_t core_util_atomic_decr_u32(volatile uint32_t *valuePtr, uint32_t delta)
321321
{
322322
uint32_t newValue;
323323
core_util_critical_section_enter();
@@ -330,18 +330,18 @@ uint32_t core_util_atomic_decr_u32(uint32_t *valuePtr, uint32_t delta)
330330
#endif
331331

332332

333-
bool core_util_atomic_cas_ptr(void **ptr, void **expectedCurrentValue, void *desiredValue) {
333+
bool core_util_atomic_cas_ptr(void * volatile *ptr, void **expectedCurrentValue, void *desiredValue) {
334334
return core_util_atomic_cas_u32(
335-
(uint32_t *)ptr,
335+
(volatile uint32_t *)ptr,
336336
(uint32_t *)expectedCurrentValue,
337337
(uint32_t)desiredValue);
338338
}
339339

340-
void *core_util_atomic_incr_ptr(void **valuePtr, ptrdiff_t delta) {
341-
return (void *)core_util_atomic_incr_u32((uint32_t *)valuePtr, (uint32_t)delta);
340+
void *core_util_atomic_incr_ptr(void * volatile *valuePtr, ptrdiff_t delta) {
341+
return (void *)core_util_atomic_incr_u32((volatile uint32_t *)valuePtr, (uint32_t)delta);
342342
}
343343

344-
void *core_util_atomic_decr_ptr(void **valuePtr, ptrdiff_t delta) {
345-
return (void *)core_util_atomic_decr_u32((uint32_t *)valuePtr, (uint32_t)delta);
344+
void *core_util_atomic_decr_ptr(void * volatile *valuePtr, ptrdiff_t delta) {
345+
return (void *)core_util_atomic_decr_u32((volatile uint32_t *)valuePtr, (uint32_t)delta);
346346
}
347347

platform/mbed_critical.h

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ bool core_util_in_critical_section(void);
144144
* always succeeds if the current value is expected, as per the pseudocode
145145
* above; it will not spuriously fail as "atomic_compare_exchange_weak" may.
146146
*/
147-
bool core_util_atomic_cas_u8(uint8_t *ptr, uint8_t *expectedCurrentValue, uint8_t desiredValue);
147+
bool core_util_atomic_cas_u8(volatile uint8_t *ptr, uint8_t *expectedCurrentValue, uint8_t desiredValue);
148148

149149
/**
150150
* Atomic compare and set. It compares the contents of a memory location to a
@@ -201,7 +201,7 @@ bool core_util_atomic_cas_u8(uint8_t *ptr, uint8_t *expectedCurrentValue, uint8_
201201
* always succeeds if the current value is expected, as per the pseudocode
202202
* above; it will not spuriously fail as "atomic_compare_exchange_weak" may.
203203
*/
204-
bool core_util_atomic_cas_u16(uint16_t *ptr, uint16_t *expectedCurrentValue, uint16_t desiredValue);
204+
bool core_util_atomic_cas_u16(volatile uint16_t *ptr, uint16_t *expectedCurrentValue, uint16_t desiredValue);
205205

206206
/**
207207
* Atomic compare and set. It compares the contents of a memory location to a
@@ -258,7 +258,7 @@ bool core_util_atomic_cas_u16(uint16_t *ptr, uint16_t *expectedCurrentValue, uin
258258
* above; it will not spuriously fail as "atomic_compare_exchange_weak" may.
259259
* }
260260
*/
261-
bool core_util_atomic_cas_u32(uint32_t *ptr, uint32_t *expectedCurrentValue, uint32_t desiredValue);
261+
bool core_util_atomic_cas_u32(volatile uint32_t *ptr, uint32_t *expectedCurrentValue, uint32_t desiredValue);
262262

263263
/**
264264
* Atomic compare and set. It compares the contents of a memory location to a
@@ -315,31 +315,31 @@ bool core_util_atomic_cas_u32(uint32_t *ptr, uint32_t *expectedCurrentValue, uin
315315
* always succeeds if the current value is expected, as per the pseudocode
316316
* above; it will not spuriously fail as "atomic_compare_exchange_weak" may.
317317
*/
318-
bool core_util_atomic_cas_ptr(void **ptr, void **expectedCurrentValue, void *desiredValue);
318+
bool core_util_atomic_cas_ptr(void * volatile *ptr, void **expectedCurrentValue, void *desiredValue);
319319

320320
/**
321321
* Atomic increment.
322322
* @param valuePtr Target memory location being incremented.
323323
* @param delta The amount being incremented.
324324
* @return The new incremented value.
325325
*/
326-
uint8_t core_util_atomic_incr_u8(uint8_t *valuePtr, uint8_t delta);
326+
uint8_t core_util_atomic_incr_u8(volatile uint8_t *valuePtr, uint8_t delta);
327327

328328
/**
329329
* Atomic increment.
330330
* @param valuePtr Target memory location being incremented.
331331
* @param delta The amount being incremented.
332332
* @return The new incremented value.
333333
*/
334-
uint16_t core_util_atomic_incr_u16(uint16_t *valuePtr, uint16_t delta);
334+
uint16_t core_util_atomic_incr_u16(volatile uint16_t *valuePtr, uint16_t delta);
335335

336336
/**
337337
* Atomic increment.
338338
* @param valuePtr Target memory location being incremented.
339339
* @param delta The amount being incremented.
340340
* @return The new incremented value.
341341
*/
342-
uint32_t core_util_atomic_incr_u32(uint32_t *valuePtr, uint32_t delta);
342+
uint32_t core_util_atomic_incr_u32(volatile uint32_t *valuePtr, uint32_t delta);
343343

344344
/**
345345
* Atomic increment.
@@ -350,31 +350,31 @@ uint32_t core_util_atomic_incr_u32(uint32_t *valuePtr, uint32_t delta);
350350
* @note The type of the pointer argument is not taken into account
351351
* and the pointer is incremented by bytes.
352352
*/
353-
void *core_util_atomic_incr_ptr(void **valuePtr, ptrdiff_t delta);
353+
void *core_util_atomic_incr_ptr(void * volatile *valuePtr, ptrdiff_t delta);
354354

355355
/**
356356
* Atomic decrement.
357357
* @param valuePtr Target memory location being decremented.
358358
* @param delta The amount being decremented.
359359
* @return The new decremented value.
360360
*/
361-
uint8_t core_util_atomic_decr_u8(uint8_t *valuePtr, uint8_t delta);
361+
uint8_t core_util_atomic_decr_u8(volatile uint8_t *valuePtr, uint8_t delta);
362362

363363
/**
364364
* Atomic decrement.
365365
* @param valuePtr Target memory location being decremented.
366366
* @param delta The amount being decremented.
367367
* @return The new decremented value.
368368
*/
369-
uint16_t core_util_atomic_decr_u16(uint16_t *valuePtr, uint16_t delta);
369+
uint16_t core_util_atomic_decr_u16(volatile uint16_t *valuePtr, uint16_t delta);
370370

371371
/**
372372
* Atomic decrement.
373373
* @param valuePtr Target memory location being decremented.
374374
* @param delta The amount being decremented.
375375
* @return The new decremented value.
376376
*/
377-
uint32_t core_util_atomic_decr_u32(uint32_t *valuePtr, uint32_t delta);
377+
uint32_t core_util_atomic_decr_u32(volatile uint32_t *valuePtr, uint32_t delta);
378378

379379
/**
380380
* Atomic decrement.
@@ -385,7 +385,7 @@ uint32_t core_util_atomic_decr_u32(uint32_t *valuePtr, uint32_t delta);
385385
* @note The type of the pointer argument is not taken into account
386386
* and the pointer is decremented by bytes
387387
*/
388-
void *core_util_atomic_decr_ptr(void **valuePtr, ptrdiff_t delta);
388+
void *core_util_atomic_decr_ptr(void * volatile *valuePtr, ptrdiff_t delta);
389389

390390
#ifdef __cplusplus
391391
} // extern "C"

0 commit comments

Comments
 (0)