This is Unofficial EPICS BASE Doxygen Site
epicsAtomicDefault.h
Go to the documentation of this file.
1 
2 /*************************************************************************\
3 * Copyright (c) 2011 LANS LLC, as Operator of
4 * Los Alamos National Laboratory.
5 * Copyright (c) 2011 UChicago Argonne LLC, as Operator of Argonne
6 * National Laboratory.
7 * EPICS BASE is distributed subject to a Software License Agreement found
8 * in file LICENSE that is included with this distribution.
9 \*************************************************************************/
10 
11 /*
12  * Author Jeffrey O. Hill
13  * johill@lanl.gov
14  */
15 
16 #ifndef epicsAtomicDefault_h
17 #define epicsAtomicDefault_h
18 
19 #ifdef __cpluplus
20 extern "C" {
21 #endif
22 
23 /*
24  * struct EpicsAtomicLockKey;
25  * LIBCOM_API void epicsAtomicReadMemoryBarrier ();
26  * LIBCOM_API void epicsAtomicWriteMemoryBarrier ();
27  * LIBCOM_API void epicsAtomicLock ( struct EpicsAtomicLockKey * );
28  * LIBCOM_API void epicsAtomicUnock ( struct EpicsAtomicLockKey * );
29  */
30 
31 /*
32  * incr
33  */
34 #ifndef EPICS_ATOMIC_INCR_INTT
36 {
38  int result;
39 
40  epicsAtomicLock ( & key );
41  result = ++(*pTarget);
42  epicsAtomicUnlock ( & key );
43  return result;
44 }
45 #endif
46 
47 #ifndef EPICS_ATOMIC_INCR_SIZET
48 EPICS_ATOMIC_INLINE size_t epicsAtomicIncrSizeT ( size_t * pTarget )
49 {
51  size_t result;
52 
53  epicsAtomicLock ( & key );
54  result = ++(*pTarget);
55  epicsAtomicUnlock ( & key );
56  return result;
57 }
58 #endif
59 
60 /*
61  * decr
62  */
63 #ifndef EPICS_ATOMIC_DECR_INTT
65 {
67  int result;
68 
69  epicsAtomicLock ( & key );
70  result = --(*pTarget);
71  epicsAtomicUnlock ( & key );
72  return result;
73 }
74 #endif
75 
76 #ifndef EPICS_ATOMIC_DECR_SIZET
77 EPICS_ATOMIC_INLINE size_t epicsAtomicDecrSizeT ( size_t * pTarget )
78 {
80  size_t result;
81 
82  epicsAtomicLock ( & key );
83  result = --(*pTarget);
84  epicsAtomicUnlock ( & key );
85  return result;
86 }
87 #endif
88 
89 /*
90  * add/sub
91  */
92 #ifndef EPICS_ATOMIC_ADD_INTT
93 EPICS_ATOMIC_INLINE int epicsAtomicAddIntT ( int * pTarget, int delta )
94 {
96  int result;
97 
98  epicsAtomicLock ( & key );
99  result = *pTarget += delta;
100  epicsAtomicUnlock ( & key );
101  return result;
102 }
103 #endif
104 
105 #ifndef EPICS_ATOMIC_ADD_SIZET
106 EPICS_ATOMIC_INLINE size_t epicsAtomicAddSizeT ( size_t * pTarget, size_t delta )
107 {
108  EpicsAtomicLockKey key;
109  size_t result;
110 
111  epicsAtomicLock ( & key );
112  result = *pTarget += delta;
113  epicsAtomicUnlock ( & key );
114  return result;
115 }
116 #endif
117 
118 #ifndef EPICS_ATOMIC_SUB_SIZET
119 EPICS_ATOMIC_INLINE size_t epicsAtomicSubSizeT ( size_t * pTarget, size_t delta )
120 {
121  EpicsAtomicLockKey key;
122  size_t result;
123 
124  epicsAtomicLock ( & key );
125  result = *pTarget -= delta;
126  epicsAtomicUnlock ( & key );
127  return result;
128 }
129 #endif
130 
131 /*
132  * set
133  */
134 #ifndef EPICS_ATOMIC_SET_INTT
135 EPICS_ATOMIC_INLINE void epicsAtomicSetIntT ( int * pTarget, int newVal )
136 {
137  *pTarget = newVal;
139 }
140 #endif
141 
142 #ifndef EPICS_ATOMIC_SET_SIZET
143 EPICS_ATOMIC_INLINE void epicsAtomicSetSizeT ( size_t * pTarget, size_t newVal )
144 {
145  *pTarget = newVal;
147 }
148 #endif
149 
150 #ifndef EPICS_ATOMIC_SET_PTRT
152  EpicsAtomicPtrT newVal )
153 {
154  *pTarget = newVal;
156 }
157 #endif
158 
159 /*
160  * get
161  */
162 #ifndef EPICS_ATOMIC_GET_INTT
163 EPICS_ATOMIC_INLINE int epicsAtomicGetIntT ( const int * pTarget )
164 {
166  return *pTarget;
167 }
168 #endif
169 
170 #ifndef EPICS_ATOMIC_GET_SIZET
171 EPICS_ATOMIC_INLINE size_t epicsAtomicGetSizeT ( const size_t * pTarget )
172 {
174  return *pTarget;
175 }
176 #endif
177 
178 #ifndef EPICS_ATOMIC_GET_PTRT
181 {
183  return *pTarget;
184 }
185 #endif
186 
187 /*
188  * cmp and swap
189  */
190 #ifndef EPICS_ATOMIC_CAS_INTT
191 EPICS_ATOMIC_INLINE int epicsAtomicCmpAndSwapIntT ( int * pTarget, int oldval, int newval )
192 {
193  EpicsAtomicLockKey key;
194  int cur;
195 
196  epicsAtomicLock ( & key );
197  cur = *pTarget;
198  if ( cur == oldval ) {
199  *pTarget = newval;
200  }
201  epicsAtomicUnlock ( & key );
202  return cur;
203 }
204 #endif
205 
206 #ifndef EPICS_ATOMIC_CAS_SIZET
208  size_t oldval, size_t newval )
209 {
210  EpicsAtomicLockKey key;
211  size_t cur;
212 
213  epicsAtomicLock ( & key );
214  cur = *pTarget;
215  if ( cur == oldval ) {
216  *pTarget = newval;
217  }
218  epicsAtomicUnlock ( & key );
219  return cur;
220 }
221 #endif
222 
223 #ifndef EPICS_ATOMIC_CAS_PTRT
225  EpicsAtomicPtrT * pTarget,
226  EpicsAtomicPtrT oldval, EpicsAtomicPtrT newval )
227 {
228  EpicsAtomicLockKey key;
229  EpicsAtomicPtrT cur;
230 
231  epicsAtomicLock ( & key );
232  cur = *pTarget;
233  if ( cur == oldval ) {
234  *pTarget = newval;
235  }
236  epicsAtomicUnlock ( & key );
237  return cur;
238 }
239 #endif
240 
241 #ifdef __cpluplus
242 } /* end of extern "C" */
243 #endif
244 
245 #endif /* epicsAtomicDefault_h */
246 
247 
pvac::PutEvent result
Definition: clientSync.cpp:117
EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier(void)
Definition: epicsAtomicCD.h:91
EPICS_ATOMIC_INLINE size_t epicsAtomicGetSizeT(const size_t *pTarget)
EPICS_ATOMIC_INLINE void epicsAtomicSetSizeT(size_t *pTarget, size_t newVal)
EPICS_ATOMIC_INLINE size_t epicsAtomicIncrSizeT(size_t *pTarget)
EPICS_ATOMIC_INLINE EpicsAtomicPtrT epicsAtomicCmpAndSwapPtrT(EpicsAtomicPtrT *pTarget, EpicsAtomicPtrT oldval, EpicsAtomicPtrT newval)
EPICS_ATOMIC_INLINE size_t epicsAtomicCmpAndSwapSizeT(size_t *pTarget, size_t oldval, size_t newval)
EPICS_ATOMIC_INLINE int epicsAtomicCmpAndSwapIntT(int *pTarget, int oldval, int newval)
void * EpicsAtomicPtrT
Definition: epicsAtomic.h:28
EPICS_ATOMIC_INLINE size_t epicsAtomicAddSizeT(size_t *pTarget, size_t delta)
EPICS_ATOMIC_INLINE int epicsAtomicAddIntT(int *pTarget, int delta)
EPICS_ATOMIC_INLINE void epicsAtomicSetPtrT(EpicsAtomicPtrT *pTarget, EpicsAtomicPtrT newVal)
#define EPICS_ATOMIC_INLINE
Definition: epicsAtomic.h:22
EPICS_ATOMIC_INLINE int epicsAtomicIncrIntT(int *pTarget)
EPICS_ATOMIC_INLINE int epicsAtomicDecrIntT(int *pTarget)
EPICS_ATOMIC_INLINE int epicsAtomicGetIntT(const int *pTarget)
void epicsAtomicLock(EpicsAtomicLockKey *)
EPICS_ATOMIC_INLINE size_t epicsAtomicDecrSizeT(size_t *pTarget)
EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier(void)
EPICS_ATOMIC_INLINE size_t epicsAtomicSubSizeT(size_t *pTarget, size_t delta)
void epicsAtomicUnlock(EpicsAtomicLockKey *)
EPICS_ATOMIC_INLINE EpicsAtomicPtrT epicsAtomicGetPtrT(const EpicsAtomicPtrT *pTarget)
EPICS_ATOMIC_INLINE void epicsAtomicSetIntT(int *pTarget, int newVal)