Xenomai 3.3.2
Loading...
Searching...
No Matches
atomic.h
1
19#ifndef _BOILERPLATE_ATOMIC_H
20#define _BOILERPLATE_ATOMIC_H
21
22#include <xeno_config.h>
23
24typedef struct { int v; } atomic_t;
25
26typedef struct { long v; } atomic_long_t;
27
28#define ATOMIC_INIT(__n) { (__n) }
29
30static inline long atomic_long_read(const atomic_long_t *ptr)
31{
32 return ptr->v;
33}
34
35static inline void atomic_long_set(atomic_long_t *ptr, long v)
36{
37 ptr->v = v;
38}
39
40static inline int atomic_read(const atomic_t *ptr)
41{
42 return ptr->v;
43}
44
45static inline void atomic_set(atomic_t *ptr, long v)
46{
47 ptr->v = v;
48}
49
50#ifndef atomic_cmpxchg
51#define atomic_cmpxchg(__ptr, __old, __new) \
52 __sync_val_compare_and_swap(&(__ptr)->v, __old, __new)
53#endif
54
55#ifndef atomic_sub_fetch
56#define atomic_sub_fetch(__ptr, __n) \
57 __sync_sub_and_fetch(&(__ptr)->v, __n)
58#endif
59
60#ifndef atomic_add_fetch
61#define atomic_add_fetch(__ptr, __n) \
62 __sync_add_and_fetch(&(__ptr)->v, __n)
63#endif
64
65#ifdef CONFIG_SMP
66#ifndef smp_mb
67#define smp_mb() __sync_synchronize()
68#endif
69#ifndef smp_rmb
70#define smp_rmb() smp_mb()
71#endif
72#ifndef smp_wmb
73#define smp_wmb() smp_mb()
74#endif
75#else /* !CONFIG_SMP */
76#define smp_mb() do { } while (0)
77#define smp_rmb() do { } while (0)
78#define smp_wmb() do { } while (0)
79#endif /* !CONFIG_SMP */
80
81#define ACCESS_ONCE(x) (*(volatile __typeof__(x) *)&(x))
82
83#define compiler_barrier() __asm__ __volatile__("": : :"memory")
84
85#ifndef cpu_relax
86#define cpu_relax() __sync_synchronize()
87#endif
88
89#endif /* _BOILERPLATE_ATOMIC_H */
Copyright © 2011 Gilles Chanteperdrix gilles.chanteperdrix@xenomai.org.
Definition atomic.h:24