4
* Copyright Ericsson AB 2010. All Rights Reserved.
6
* The contents of this file are subject to the Erlang Public License,
7
* Version 1.1, (the "License"); you may not use this file except in
8
* compliance with the License. You should have received a copy of the
9
* Erlang Public License along with this software. If not, it can be
10
* retrieved online at http://www.erlang.org/.
12
* Software distributed under the License is distributed on an "AS IS"
13
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
14
* the License for the specific language governing rights and limitations
21
* Description: The ethread atomic API
22
* Author: Rickard Green
29
#define ETHR_INLINE_FUNC_NAME_(X) X ## __
30
#define ETHR_ATOMIC_IMPL__
33
#include "ethr_internal.h"
35
#ifndef ETHR_HAVE_NATIVE_ATOMICS
36
ethr_atomic_protection_t ethr_atomic_protection__[1 << ETHR_ATOMIC_ADDR_BITS];
40
ethr_init_atomics(void)
42
#ifndef ETHR_HAVE_NATIVE_ATOMICS
45
for (i = 0; i < (1 << ETHR_ATOMIC_ADDR_BITS); i++) {
46
int res = ethr_spinlock_init(ðr_atomic_protection__[i].u.lck);
56
* --- Pointer size atomics ---------------------------------------------------
60
ethr_atomic_addr(ethr_atomic_t *var)
63
return ethr_atomic_addr__(var);
67
ethr_atomic_init(ethr_atomic_t *var, ethr_sint_t i)
70
ethr_atomic_init__(var, i);
74
ethr_atomic_set(ethr_atomic_t *var, ethr_sint_t i)
76
ETHR_ASSERT(!ethr_not_inited__);
78
ethr_atomic_set__(var, i);
82
ethr_atomic_read(ethr_atomic_t *var)
84
ETHR_ASSERT(!ethr_not_inited__);
86
return ethr_atomic_read__(var);
90
ethr_atomic_add_read(ethr_atomic_t *var, ethr_sint_t incr)
92
ETHR_ASSERT(!ethr_not_inited__);
94
return ethr_atomic_add_read__(var, incr);
98
ethr_atomic_inc_read(ethr_atomic_t *var)
100
ETHR_ASSERT(!ethr_not_inited__);
102
return ethr_atomic_inc_read__(var);
106
ethr_atomic_dec_read(ethr_atomic_t *var)
108
ETHR_ASSERT(!ethr_not_inited__);
110
return ethr_atomic_dec_read__(var);
114
ethr_atomic_add(ethr_atomic_t *var, ethr_sint_t incr)
116
ETHR_ASSERT(!ethr_not_inited__);
118
ethr_atomic_add__(var, incr);
122
ethr_atomic_inc(ethr_atomic_t *var)
124
ETHR_ASSERT(!ethr_not_inited__);
126
ethr_atomic_inc__(var);
130
ethr_atomic_dec(ethr_atomic_t *var)
132
ETHR_ASSERT(!ethr_not_inited__);
134
ethr_atomic_dec__(var);
138
ethr_atomic_read_band(ethr_atomic_t *var, ethr_sint_t mask)
140
ETHR_ASSERT(!ethr_not_inited__);
142
return ethr_atomic_read_band__(var, mask);
146
ethr_atomic_read_bor(ethr_atomic_t *var, ethr_sint_t mask)
148
ETHR_ASSERT(!ethr_not_inited__);
150
return ethr_atomic_read_bor__(var, mask);
154
ethr_atomic_xchg(ethr_atomic_t *var, ethr_sint_t new)
156
ETHR_ASSERT(!ethr_not_inited__);
158
return ethr_atomic_xchg__(var, new);
162
ethr_atomic_cmpxchg(ethr_atomic_t *var, ethr_sint_t new, ethr_sint_t expected)
164
ETHR_ASSERT(!ethr_not_inited__);
166
return ethr_atomic_cmpxchg__(var, new, expected);
170
ethr_atomic_read_acqb(ethr_atomic_t *var)
172
ETHR_ASSERT(!ethr_not_inited__);
174
return ethr_atomic_read_acqb__(var);
178
ethr_atomic_inc_read_acqb(ethr_atomic_t *var)
180
ETHR_ASSERT(!ethr_not_inited__);
182
return ethr_atomic_inc_read_acqb__(var);
186
ethr_atomic_set_relb(ethr_atomic_t *var, ethr_sint_t i)
188
ETHR_ASSERT(!ethr_not_inited__);
190
ethr_atomic_set_relb__(var, i);
194
ethr_atomic_dec_relb(ethr_atomic_t *var)
196
ETHR_ASSERT(!ethr_not_inited__);
198
ethr_atomic_dec_relb__(var);
202
ethr_atomic_dec_read_relb(ethr_atomic_t *var)
204
ETHR_ASSERT(!ethr_not_inited__);
206
return ethr_atomic_dec_read_relb__(var);
210
ethr_atomic_cmpxchg_acqb(ethr_atomic_t *var, ethr_sint_t new, ethr_sint_t exp)
212
ETHR_ASSERT(!ethr_not_inited__);
214
return ethr_atomic_cmpxchg_acqb__(var, new, exp);
218
ethr_atomic_cmpxchg_relb(ethr_atomic_t *var, ethr_sint_t new, ethr_sint_t exp)
220
ETHR_ASSERT(!ethr_not_inited__);
222
return ethr_atomic_cmpxchg_relb__(var, new, exp);
227
* --- 32-bit atomics ---------------------------------------------------------
231
ethr_atomic32_addr(ethr_atomic32_t *var)
234
return ethr_atomic32_addr__(var);
238
ethr_atomic32_init(ethr_atomic32_t *var, ethr_sint32_t i)
241
ethr_atomic32_init__(var, i);
245
ethr_atomic32_set(ethr_atomic32_t *var, ethr_sint32_t i)
247
ETHR_ASSERT(!ethr_not_inited__);
249
ethr_atomic32_set__(var, i);
253
ethr_atomic32_read(ethr_atomic32_t *var)
255
ETHR_ASSERT(!ethr_not_inited__);
257
return ethr_atomic32_read__(var);
262
ethr_atomic32_add_read(ethr_atomic32_t *var, ethr_sint32_t incr)
264
ETHR_ASSERT(!ethr_not_inited__);
266
return ethr_atomic32_add_read__(var, incr);
270
ethr_atomic32_inc_read(ethr_atomic32_t *var)
272
ETHR_ASSERT(!ethr_not_inited__);
274
return ethr_atomic32_inc_read__(var);
278
ethr_atomic32_dec_read(ethr_atomic32_t *var)
280
ETHR_ASSERT(!ethr_not_inited__);
282
return ethr_atomic32_dec_read__(var);
286
ethr_atomic32_add(ethr_atomic32_t *var, ethr_sint32_t incr)
288
ETHR_ASSERT(!ethr_not_inited__);
290
ethr_atomic32_add__(var, incr);
294
ethr_atomic32_inc(ethr_atomic32_t *var)
296
ETHR_ASSERT(!ethr_not_inited__);
298
ethr_atomic32_inc__(var);
302
ethr_atomic32_dec(ethr_atomic32_t *var)
304
ETHR_ASSERT(!ethr_not_inited__);
306
ethr_atomic32_dec__(var);
310
ethr_atomic32_read_band(ethr_atomic32_t *var, ethr_sint32_t mask)
312
ETHR_ASSERT(!ethr_not_inited__);
314
return ethr_atomic32_read_band__(var, mask);
318
ethr_atomic32_read_bor(ethr_atomic32_t *var, ethr_sint32_t mask)
320
ETHR_ASSERT(!ethr_not_inited__);
322
return ethr_atomic32_read_bor__(var, mask);
326
ethr_atomic32_xchg(ethr_atomic32_t *var, ethr_sint32_t new)
328
ETHR_ASSERT(!ethr_not_inited__);
330
return ethr_atomic32_xchg__(var, new);
334
ethr_atomic32_cmpxchg(ethr_atomic32_t *var,
336
ethr_sint32_t expected)
338
ETHR_ASSERT(!ethr_not_inited__);
340
return ethr_atomic32_cmpxchg__(var, new, expected);
344
ethr_atomic32_read_acqb(ethr_atomic32_t *var)
346
ETHR_ASSERT(!ethr_not_inited__);
348
return ethr_atomic32_read_acqb__(var);
352
ethr_atomic32_inc_read_acqb(ethr_atomic32_t *var)
354
ETHR_ASSERT(!ethr_not_inited__);
356
return ethr_atomic32_inc_read_acqb__(var);
360
ethr_atomic32_set_relb(ethr_atomic32_t *var, ethr_sint32_t i)
362
ETHR_ASSERT(!ethr_not_inited__);
364
ethr_atomic32_set_relb__(var, i);
368
ethr_atomic32_dec_relb(ethr_atomic32_t *var)
370
ETHR_ASSERT(!ethr_not_inited__);
372
ethr_atomic32_dec_relb__(var);
376
ethr_atomic32_dec_read_relb(ethr_atomic32_t *var)
378
ETHR_ASSERT(!ethr_not_inited__);
380
return ethr_atomic32_dec_read_relb__(var);
384
ethr_atomic32_cmpxchg_acqb(ethr_atomic32_t *var,
388
ETHR_ASSERT(!ethr_not_inited__);
390
return ethr_atomic32_cmpxchg_acqb__(var, new, exp);
394
ethr_atomic32_cmpxchg_relb(ethr_atomic32_t *var,
398
ETHR_ASSERT(!ethr_not_inited__);
400
return ethr_atomic32_cmpxchg_relb__(var, new, exp);