All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Macros | Functions
modules/common/target/Linux-x86_64/include/citrusleaf/cf_atomic.h File Reference
#include <stdint.h>
#include <citrusleaf/cf_arch.h>
+ Include dependency graph for modules/common/target/Linux-x86_64/include/citrusleaf/cf_atomic.h:

Go to the source code of this file.

Macros

#define cf_atomic32_cas_m(_a, _b, _x)
 
#define cf_atomic32_decr(a)   (cf_atomic32_add((a), -1))
 
#define cf_atomic32_fas_m(_a, _b)
 
#define cf_atomic32_get(a)   (a)
 
#define cf_atomic32_incr(a)   (cf_atomic32_add((a), 1))
 
#define cf_atomic32_set(a, b)   (*(a) = (b))
 
#define cf_atomic32_sub(a, b)   (cf_atomic32_add((a), (0 - (b))))
 
#define cf_atomic_int_add(_a, _b)   cf_atomic32_add(_a, _b)
 
#define cf_atomic_int_addunless(_a, _b, _x)   cf_atomic32_addunless(_a, _b, _x)
 
#define cf_atomic_int_cas(_a, _b, _x)   cf_atomic32_cas(_a, _b, _x)
 
#define cf_atomic_int_cas_m(_a, _b, _x)   cf_atomic32_cas_m(_a, _b, _x)
 
#define cf_atomic_int_decr(_a)   cf_atomic32_add((_a), -1)
 
#define cf_atomic_int_fas(_a, _b)   cf_atomic32_fas(_a, _b)
 
#define cf_atomic_int_fas_m(_a, _b)   cf_atomic32_fas_m(_a, _b)
 
#define cf_atomic_int_get(_a)   cf_atomic32_get(_a)
 
#define cf_atomic_int_incr(_a)   cf_atomic32_add((_a), 1)
 
#define cf_atomic_int_set(_a, _b)   cf_atomic32_set(_a, _b)
 
#define cf_atomic_int_setmax(_a, _x)   cf_atomic32_setmax(_a, _x)
 
#define cf_atomic_int_sub(_a, _b)   cf_atomic32_sub(_a, _b)
 
#define cf_atomic_p_add(_a, _b)   cf_atomic32_add(_a, _b)
 
#define cf_atomic_p_addunless(_a, _b, _x)   cf_atomic32_addunless(_a, _b, _x)
 
#define cf_atomic_p_cas(_a, _b, _x)   cf_atomic32_cas(_a, _b, _x)
 
#define cf_atomic_p_cas_m(_a, _b, _x)   cf_atomic32_cas_m(_a, _b, _x)
 
#define cf_atomic_p_decr(_a)   cf_atomic32_add((_a), -1)
 
#define cf_atomic_p_fas(_a, _b)   cf_atomic32_fas(_a, _b)
 
#define cf_atomic_p_fas_m(_a, _b)   cf_atomic32_fas_m(_a, _b)
 
#define cf_atomic_p_get(_a)   cf_atomic32_get(_a)
 
#define cf_atomic_p_incr(_a)   cf_atomic32_add((_a), 1)
 
#define cf_atomic_p_set(_a, _b)   cf_atomic32_set(_a, _b)
 
#define cf_atomic_p_setmax(_a, _x)   cf_atomic32_setmax(_a, _x)
 
#define CF_MEMORY_BARRIER()   __asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory")
 
#define CF_MEMORY_BARRIER_READ()   CF_MEMORY_BARRIER()
 
#define CF_MEMORY_BARRIER_WRITE()   __asm__ __volatile__ ("" : : : "memory")
 
#define smb_mb()   asm volatile("mfence":::"memory")
 

Functions

static int32_t cf_atomic32_add (cf_atomic32 *, int32_t)
 
static int32_t cf_atomic32_addunless (cf_atomic32 *a, int32_t b, int32_t x)
 
static int32_t cf_atomic32_cas (cf_atomic32 *a, int32_t b, int32_t x)
 
static int32_t cf_atomic32_fas (cf_atomic32 *a, cf_atomic32 *b)
 
static int32_t cf_atomic32_setmax (cf_atomic32 *a, int32_t x)
 
static int64_t cf_atomic64_add (cf_atomic64 *, int64_t)
 

Macro Definition Documentation

#define cf_atomic32_cas_m (   _a,
  _b,
  _x 
)
Value:
\ ({ \
__typeof__(_b) __b = _b; \
__asm__ __volatile__ ("lock; cmpxchg %1,%2" : "=a"(__b) : "q"(_x), "m"(*(_a)), "0"(_b) : "memory"); \
__b; \
})

Definition at line 333 of file modules/common/target/Linux-x86_64/include/citrusleaf/cf_atomic.h.

#define cf_atomic32_decr (   a)    (cf_atomic32_add((a), -1))
#define cf_atomic32_fas_m (   _a,
  _b 
)
Value:
({ \
__typeof__(_b) __b; \
__asm__ __volatile__ ("lock; xchg %0,%1" : "=r"(__b) : "m"(*(_a)), "0"(_b)); \
__b; \
})

Definition at line 327 of file modules/common/target/Linux-x86_64/include/citrusleaf/cf_atomic.h.

#define cf_atomic32_get (   a)    (a)

SYNOPSIS Atomic memory operations Memory barriers

cf_atomicX_add Atomic addition: add a value b into an atomic integer a, and return the result

cf_atomicX_cas Compare-and-swap: test a value b against an atomic integer a; if they are equal, store the value x into a, and return the initial value of a. "Success" can be checked by comparing the returned value against b NB: this is a strong memory barrier

cf_atomicX_fas Fetch-and-swap: swap the values of b and a

cf_atomicX_addunless Increment-unless: test a value b against an atomic integer a. If they are NOT equal, add x to a, and return non-zero; if they ARE equal, return zero

Definition at line 82 of file modules/common/target/Linux-x86_64/include/citrusleaf/cf_atomic.h.

#define cf_atomic32_incr (   a)    (cf_atomic32_add((a), 1))
#define cf_atomic32_set (   a,
 
)    (*(a) = (b))
#define cf_atomic32_sub (   a,
 
)    (cf_atomic32_add((a), (0 - (b))))
#define cf_atomic_int_add (   _a,
  _b 
)    cf_atomic32_add(_a, _b)
#define cf_atomic_int_addunless (   _a,
  _b,
  _x 
)    cf_atomic32_addunless(_a, _b, _x)
#define cf_atomic_int_cas (   _a,
  _b,
  _x 
)    cf_atomic32_cas(_a, _b, _x)
#define cf_atomic_int_cas_m (   _a,
  _b,
  _x 
)    cf_atomic32_cas_m(_a, _b, _x)
#define cf_atomic_int_decr (   _a)    cf_atomic32_add((_a), -1)
#define cf_atomic_int_fas (   _a,
  _b 
)    cf_atomic32_fas(_a, _b)
#define cf_atomic_int_fas_m (   _a,
  _b 
)    cf_atomic32_fas_m(_a, _b)
#define cf_atomic_int_get (   _a)    cf_atomic32_get(_a)
#define cf_atomic_int_incr (   _a)    cf_atomic32_add((_a), 1)
#define cf_atomic_int_set (   _a,
  _b 
)    cf_atomic32_set(_a, _b)
#define cf_atomic_int_setmax (   _a,
  _x 
)    cf_atomic32_setmax(_a, _x)
#define cf_atomic_int_sub (   _a,
  _b 
)    cf_atomic32_sub(_a, _b)
#define cf_atomic_p_add (   _a,
  _b 
)    cf_atomic32_add(_a, _b)
#define cf_atomic_p_addunless (   _a,
  _b,
  _x 
)    cf_atomic32_addunless(_a, _b, _x)
#define cf_atomic_p_cas (   _a,
  _b,
  _x 
)    cf_atomic32_cas(_a, _b, _x)
#define cf_atomic_p_cas_m (   _a,
  _b,
  _x 
)    cf_atomic32_cas_m(_a, _b, _x)
#define cf_atomic_p_decr (   _a)    cf_atomic32_add((_a), -1)
#define cf_atomic_p_fas (   _a,
  _b 
)    cf_atomic32_fas(_a, _b)
#define cf_atomic_p_fas_m (   _a,
  _b 
)    cf_atomic32_fas_m(_a, _b)
#define cf_atomic_p_get (   _a)    cf_atomic32_get(_a)
#define cf_atomic_p_incr (   _a)    cf_atomic32_add((_a), 1)
#define cf_atomic_p_set (   _a,
  _b 
)    cf_atomic32_set(_a, _b)
#define cf_atomic_p_setmax (   _a,
  _x 
)    cf_atomic32_setmax(_a, _x)
#define CF_MEMORY_BARRIER ( )    __asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory")
#define CF_MEMORY_BARRIER_READ ( )    CF_MEMORY_BARRIER()
#define CF_MEMORY_BARRIER_WRITE ( )    __asm__ __volatile__ ("" : : : "memory")
#define smb_mb ( )    asm volatile("mfence":::"memory")

Function Documentation

static int32_t cf_atomic32_add ( cf_atomic32 *  a,
int32_t  b 
)
inlinestatic
static int32_t cf_atomic32_addunless ( cf_atomic32 *  a,
int32_t  b,
int32_t  x 
)
inlinestatic
static int32_t cf_atomic32_cas ( cf_atomic32 *  a,
int32_t  b,
int32_t  x 
)
inlinestatic
static int32_t cf_atomic32_fas ( cf_atomic32 *  a,
cf_atomic32 *  b 
)
inlinestatic
static int32_t cf_atomic32_setmax ( cf_atomic32 *  a,
int32_t  x 
)
inlinestatic
static int64_t cf_atomic64_add ( cf_atomic64 *  ,
int64_t   
)
inlinestatic