Ne.app NeANT
The Ne.app NeANT User module of the NeANT distribution.
_atomic-xlc.h
Go to the documentation of this file.
1
33#include <sys/atomic_op.h>
34
35#define _RWSTD_NO_CHAR_ATOMIC_OPS
36#define _RWSTD_NO_SHORT_ATOMIC_OPS
37#define _RWSTD_NO_LLONG_ATOMIC_OPS
38
40
41inline int
42__rw_atomic_preincrement (int &__x, bool)
43{
44 return fetch_and_add (&__x, 1) + 1;
45}
46
47
48inline unsigned
49__rw_atomic_preincrement (unsigned &__x, bool)
50{
51 return __rw_atomic_preincrement (_RWSTD_REINTERPRET_CAST (int&, __x),
52 false);
53}
54
55
56inline int
57__rw_atomic_predecrement (int &__x, bool)
58{
59 return fetch_and_add(&__x,-1) - 1;
60}
61
62
63inline unsigned
64__rw_atomic_predecrement (unsigned &__x, bool)
65{
66 return __rw_atomic_predecrement (_RWSTD_REINTERPRET_CAST (int&, __x),
67 false);
68}
69
70
71inline int
72__rw_atomic_exchange (int &__x, int __y, bool)
73{
74 int __tmp;
75
76 do {
77 __tmp = __x;
78 } while (!compare_and_swap (&__x, &__tmp, __y));
79
80 return __tmp;
81}
82
83
84inline unsigned
85__rw_atomic_exchange (unsigned &__x, unsigned __y, bool)
86{
87 return __rw_atomic_exchange (_RWSTD_REINTERPRET_CAST (int&, __x),
88 _RWSTD_STATIC_CAST (int, __y), false);
89}
90
91
92# if _RWSTD_INT_SIZE < _RWSTD_LONG_SIZE
93
94inline long
95__rw_atomic_preincrement (long &__x, bool)
96{
97 return fetch_and_addlp (&__x, 1) + 1;
98}
99
100
101inline unsigned long
102__rw_atomic_preincrement (unsigned long &__x, bool)
103{
104 return __rw_atomic_preincrement (_RWSTD_REINTERPRET_CAST (long&, __x),
105 false);
106}
107
108
109inline long
110__rw_atomic_predecrement (long &__x, bool)
111{
112 return fetch_and_addlp (&__x, -1) - 1;
113}
114
115
116inline unsigned long
117__rw_atomic_predecrement (unsigned long &__x, bool)
118{
119 return __rw_atomic_predecrement (_RWSTD_REINTERPRET_CAST (long&, __x),
120 false);
121}
122
123
124inline long
125__rw_atomic_exchange (long &__x, long __y, bool)
126{
127 long __tmp;
128
129 do {
130 __tmp = __x;
131 } while (!compare_and_swaplp (&__x, &__tmp, __y));
132
133 return __tmp;
134}
135
136
137inline unsigned long
138__rw_atomic_exchange (unsigned long &__x, unsigned long __y, bool)
139{
140 return __rw_atomic_exchange (_RWSTD_REINTERPRET_CAST (long&, __x),
141 _RWSTD_STATIC_CAST (long, __y), false);
142}
143
144# else // _RWSTD_INT_SIZE == _RWSTD_LONG_SIZE
145# define _RWSTD_NO_LONG_ATOMIC_OPS
146# endif // _RWSTD_INT_SIZE < _RWSTD_LONG_SIZE
147
148} // namespace __rw
#define _RWSTD_REINTERPRET_CAST(T, x)
Definition _defs.h:535
#define _RWSTD_STATIC_CAST(T, x)
Definition _defs.h:534
#define _RWSTD_NAMESPACE(name)
Definition _defs.h:567