EPICS Base  7.0.8.1
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
epicsAtomic.h
Go to the documentation of this file.
1 /*************************************************************************\
2 * Copyright (c) 2011 LANS LLC, as Operator of
3 * Los Alamos National Laboratory.
4 * Copyright (c) 2011 UChicago Argonne LLC, as Operator of Argonne
5 * National Laboratory.
6 * SPDX-License-Identifier: EPICS
7 * EPICS BASE is distributed subject to a Software License Agreement found
8 * in file LICENSE that is included with this distribution.
9 \*************************************************************************/
10 
30 /*
31  * Author Jeffrey O. Hill
33  */
34 
35 #ifndef epicsAtomic_h
36 #define epicsAtomic_h
37 
38 #include <stdlib.h> /* define size_t */
39 
40 #include "compilerSpecific.h"
41 
42 #define EPICS_ATOMIC_INLINE static EPICS_ALWAYS_INLINE
43 
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47 
49 typedef void * EpicsAtomicPtrT;
50 
55 EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier (void);
56 
61 EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier (void);
62 
74 EPICS_ATOMIC_INLINE size_t epicsAtomicIncrSizeT ( size_t * pTarget );
75 
87 EPICS_ATOMIC_INLINE int epicsAtomicIncrIntT ( int * pTarget );
88 
100 EPICS_ATOMIC_INLINE size_t epicsAtomicDecrSizeT ( size_t * pTarget );
101 
113 EPICS_ATOMIC_INLINE int epicsAtomicDecrIntT ( int * pTarget );
114 
127 EPICS_ATOMIC_INLINE size_t epicsAtomicAddSizeT ( size_t * pTarget, size_t delta );
128 
141 EPICS_ATOMIC_INLINE size_t epicsAtomicSubSizeT ( size_t * pTarget, size_t delta );
142 
155 EPICS_ATOMIC_INLINE int epicsAtomicAddIntT ( int * pTarget, int delta );
156 
164 EPICS_ATOMIC_INLINE void epicsAtomicSetSizeT ( size_t * pTarget, size_t newValue );
165 
173 EPICS_ATOMIC_INLINE void epicsAtomicSetIntT ( int * pTarget, int newValue );
174 
182 EPICS_ATOMIC_INLINE void epicsAtomicSetPtrT ( EpicsAtomicPtrT * pTarget, EpicsAtomicPtrT newValue );
183 
192 EPICS_ATOMIC_INLINE size_t epicsAtomicGetSizeT ( const size_t * pTarget );
193 
202 EPICS_ATOMIC_INLINE int epicsAtomicGetIntT ( const int * pTarget );
203 
212 EPICS_ATOMIC_INLINE EpicsAtomicPtrT epicsAtomicGetPtrT ( const EpicsAtomicPtrT * pTarget );
213 
227 EPICS_ATOMIC_INLINE size_t epicsAtomicCmpAndSwapSizeT ( size_t * pTarget,
228  size_t oldVal, size_t newVal );
229 
243 EPICS_ATOMIC_INLINE int epicsAtomicCmpAndSwapIntT ( int * pTarget,
244  int oldVal, int newVal );
245 
259 EPICS_ATOMIC_INLINE EpicsAtomicPtrT epicsAtomicCmpAndSwapPtrT (
260  EpicsAtomicPtrT * pTarget,
261  EpicsAtomicPtrT oldVal,
262  EpicsAtomicPtrT newVal );
263 
264 #ifdef __cplusplus
265 } /* end of extern "C" */
266 #endif
267 
268 /*
269  * options for in-line compiler intrinsic or OS specific
270  * implementations of the above function prototypes
271  *
272  * for some of the compilers we must define the
273  * in-line functions before they get used in the c++
274  * in-line functions below
275  */
276 #include "epicsAtomicCD.h"
277 
278 #ifdef __cplusplus
279 
280 namespace epics {
281 namespace atomic {
282 
283 /*
284  * overloaded c++ interface
285  */
286 
295 EPICS_ATOMIC_INLINE size_t increment ( size_t & v )
296 {
297  return epicsAtomicIncrSizeT ( & v );
298 }
299 
308 EPICS_ATOMIC_INLINE int increment ( int & v )
309 {
310  return epicsAtomicIncrIntT ( & v );
311 }
312 
321 EPICS_ATOMIC_INLINE size_t decrement ( size_t & v )
322 {
323  return epicsAtomicDecrSizeT ( & v );
324 }
325 
334 EPICS_ATOMIC_INLINE int decrement ( int & v )
335 {
336  return epicsAtomicDecrIntT ( & v );
337 }
338 
348 EPICS_ATOMIC_INLINE size_t add ( size_t & v, size_t delta )
349 {
350  return epicsAtomicAddSizeT ( & v, delta );
351 }
352 
362 EPICS_ATOMIC_INLINE int add ( int & v, int delta )
363 {
364  return epicsAtomicAddIntT ( & v, delta );
365 }
366 
376 EPICS_ATOMIC_INLINE size_t subtract ( size_t & v, size_t delta )
377 {
378  return epicsAtomicSubSizeT ( & v, delta );
379 }
380 
390 EPICS_ATOMIC_INLINE int subtract ( int & v, int delta )
391 {
392  return epicsAtomicAddIntT ( & v, -delta );
393 }
394 
402 EPICS_ATOMIC_INLINE void set ( size_t & v , size_t newValue )
403 {
404  epicsAtomicSetSizeT ( & v, newValue );
405 }
406 
414 EPICS_ATOMIC_INLINE void set ( int & v, int newValue )
415 {
416  epicsAtomicSetIntT ( & v, newValue );
417 }
418 
426 EPICS_ATOMIC_INLINE void set ( EpicsAtomicPtrT & v, EpicsAtomicPtrT newValue )
427 {
428  epicsAtomicSetPtrT ( & v, newValue );
429 }
430 
439 EPICS_ATOMIC_INLINE size_t get ( const size_t & v )
440 {
441  return epicsAtomicGetSizeT ( & v );
442 }
443 
452 EPICS_ATOMIC_INLINE int get ( const int & v )
453 {
454  return epicsAtomicGetIntT ( & v );
455 }
456 
465 EPICS_ATOMIC_INLINE EpicsAtomicPtrT get ( const EpicsAtomicPtrT & v )
466 {
467  return epicsAtomicGetPtrT ( & v );
468 }
469 
481 EPICS_ATOMIC_INLINE size_t compareAndSwap ( size_t & v,
482  size_t oldVal, size_t newVal )
483 {
484  return epicsAtomicCmpAndSwapSizeT ( & v, oldVal, newVal );
485 }
486 
498 EPICS_ATOMIC_INLINE int compareAndSwap ( int & v, int oldVal, int newVal )
499 {
500  return epicsAtomicCmpAndSwapIntT ( & v, oldVal, newVal );
501 }
502 
514 EPICS_ATOMIC_INLINE EpicsAtomicPtrT compareAndSwap ( EpicsAtomicPtrT & v,
515  EpicsAtomicPtrT oldVal,
516  EpicsAtomicPtrT newVal )
517 {
518  return epicsAtomicCmpAndSwapPtrT ( & v, oldVal, newVal );
519 }
520 
521 } /* end of name space atomic */
522 } /* end of name space epics */
523 
524 #endif /* ifdef __cplusplus */
525 
526 #endif /* epicsAtomic_h */
void * EpicsAtomicPtrT
Definition: epicsAtomic.h:49
EPICS_ATOMIC_INLINE EpicsAtomicPtrT epicsAtomicGetPtrT(const EpicsAtomicPtrT *pTarget)
atomically load and return pointer value
EPICS_ATOMIC_INLINE int epicsAtomicIncrIntT(int *pTarget)
atomic increment on int value
EPICS_ATOMIC_INLINE int epicsAtomicDecrIntT(int *pTarget)
atomic decrement on int value
EPICS_ATOMIC_INLINE int epicsAtomicGetIntT(const int *pTarget)
atomically load and return int value
EPICS_ATOMIC_INLINE size_t epicsAtomicAddSizeT(size_t *pTarget, size_t delta)
atomic addition on size_t value
EPICS_ATOMIC_INLINE void epicsAtomicSetIntT(int *pTarget, int newValue)
atomically assign int value to variable
EPICS_ATOMIC_INLINE int epicsAtomicAddIntT(int *pTarget, int delta)
atomic addition on int value
EPICS_ATOMIC_INLINE int epicsAtomicCmpAndSwapIntT(int *pTarget, int oldVal, int newVal)
atomically compare int value with expected and if equal swap with new value
EPICS_ATOMIC_INLINE size_t epicsAtomicSubSizeT(size_t *pTarget, size_t delta)
atomic subtraction on size_t value
EPICS_ATOMIC_INLINE void epicsAtomicSetSizeT(size_t *pTarget, size_t newValue)
atomically assign size_t value to variable
EPICS_ATOMIC_INLINE void epicsAtomicSetPtrT(EpicsAtomicPtrT *pTarget, EpicsAtomicPtrT newValue)
atomically assign pointer value to variable
EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier(void)
load target into cache
EPICS_ATOMIC_INLINE size_t epicsAtomicCmpAndSwapSizeT(size_t *pTarget, size_t oldVal, size_t newVal)
atomically compare size_t value with expected and if equal swap with new value
EPICS_ATOMIC_INLINE size_t epicsAtomicGetSizeT(const size_t *pTarget)
atomically load and return size_t value
EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier(void)
push cache version of target into target
EPICS_ATOMIC_INLINE size_t epicsAtomicIncrSizeT(size_t *pTarget)
atomic increment on size_t value
EPICS_ATOMIC_INLINE EpicsAtomicPtrT epicsAtomicCmpAndSwapPtrT(EpicsAtomicPtrT *pTarget, EpicsAtomicPtrT oldVal, EpicsAtomicPtrT newVal)
atomically compare int value with expected and if equal swap with new value
EPICS_ATOMIC_INLINE size_t epicsAtomicDecrSizeT(size_t *pTarget)
atomic decrement on size_t value