libmetal
Macros | Typedefs | Enumerations
atomic.h File Reference

Go to the source code of this file.

Macros

#define ATOMIC_FLAG_INIT   0
 
#define ATOMIC_VAR_INIT(VAL)   (VAL)
 
#define atomic_flag_test_and_set(FLAG)    __sync_lock_test_and_set((FLAG), 1)
 
#define atomic_flag_test_and_set_explicit(FLAG, MO)    atomic_flag_test_and_set(FLAG)
 
#define atomic_flag_clear(FLAG)    __sync_lock_release((FLAG))
 
#define atomic_flag_clear_explicit(FLAG, MO)    atomic_flag_clear(FLAG)
 
#define atomic_init(OBJ, VAL)    do { *(OBJ) = (VAL); } while (0)
 
#define atomic_is_lock_free(OBJ)    (sizeof(*(OBJ)) <= sizeof(long))
 
#define atomic_store(OBJ, VAL)    do { *(OBJ) = (VAL); __sync_synchronize(); } while (0)
 
#define atomic_store_explicit(OBJ, VAL, MO)    atomic_store((OBJ), (VAL))
 
#define atomic_load(OBJ)    ({ __sync_synchronize(); *(OBJ); })
 
#define atomic_load_explicit(OBJ, MO)    atomic_load(OBJ)
 
#define atomic_exchange(OBJ, DES)
 
#define atomic_exchange_explicit(OBJ, DES, MO)    atomic_exchange((OBJ), (DES))
 
#define atomic_compare_exchange_strong(OBJ, EXP, DES)
 
#define atomic_compare_exchange_strong_explicit(OBJ, EXP, DES, MO)    atomic_compare_exchange_strong((OBJ), (EXP), (DES))
 
#define atomic_compare_exchange_weak(OBJ, EXP, DES)    atomic_compare_exchange_strong((OBJ), (EXP), (DES))
 
#define atomic_compare_exchange_weak_explicit(OBJ, EXP, DES, MO)    atomic_compare_exchange_weak((OBJ), (EXP), (DES))
 
#define atomic_fetch_add(OBJ, VAL)    __sync_fetch_and_add((OBJ), (VAL))
 
#define atomic_fetch_add_explicit(OBJ, VAL, MO)    atomic_fetch_add((OBJ), (VAL))
 
#define atomic_fetch_sub(OBJ, VAL)    __sync_fetch_and_sub((OBJ), (VAL))
 
#define atomic_fetch_sub_explicit(OBJ, VAL, MO)    atomic_fetch_sub((OBJ), (VAL))
 
#define atomic_fetch_or(OBJ, VAL)    __sync_fetch_and_or((OBJ), (VAL))
 
#define atomic_fetch_or_explicit(OBJ, VAL, MO)    atomic_fetch_or((OBJ), (VAL))
 
#define atomic_fetch_xor(OBJ, VAL)    __sync_fetch_and_xor((OBJ), (VAL))
 
#define atomic_fetch_xor_explicit(OBJ, VAL, MO)    atomic_fetch_xor((OBJ), (VAL))
 
#define atomic_fetch_and(OBJ, VAL)    __sync_fetch_and_and((OBJ), (VAL))
 
#define atomic_fetch_and_explicit(OBJ, VAL, MO)    atomic_fetch_and((OBJ), (VAL))
 
#define atomic_thread_fence(MO)    __sync_synchronize()
 
#define atomic_signal_fence(MO)    __sync_synchronize()
 

Typedefs

typedef int atomic_flag
 
typedef char atomic_char
 
typedef unsigned char atomic_uchar
 
typedef short atomic_short
 
typedef unsigned short atomic_ushort
 
typedef int atomic_int
 
typedef unsigned int atomic_uint
 
typedef atomic_uint atomic_uintptr_t
 
typedef long atomic_long
 
typedef unsigned long atomic_ulong
 
typedef long long atomic_llong
 
typedef unsigned long long atomic_ullong
 

Enumerations

enum  memory_order {
  memory_order_relaxed , memory_order_consume , memory_order_acquire , memory_order_release ,
  memory_order_acq_rel , memory_order_seq_cst
}
 

Macro Definition Documentation

◆ atomic_compare_exchange_strong

#define atomic_compare_exchange_strong (   OBJ,
  EXP,
  DES 
)
Value:
({ \
__typeof__(OBJ) obj = (OBJ); \
__typeof__(EXP) exp = (EXP); \
__typeof__(*obj) expval = *exp; \
__typeof__(*obj) oldval = __sync_val_compare_and_swap( \
obj, expval, (DES)); \
*exp = oldval; \
oldval == expval; \
})

◆ atomic_compare_exchange_strong_explicit

#define atomic_compare_exchange_strong_explicit (   OBJ,
  EXP,
  DES,
  MO 
)     atomic_compare_exchange_strong((OBJ), (EXP), (DES))

◆ atomic_compare_exchange_weak

#define atomic_compare_exchange_weak (   OBJ,
  EXP,
  DES 
)     atomic_compare_exchange_strong((OBJ), (EXP), (DES))

◆ atomic_compare_exchange_weak_explicit

#define atomic_compare_exchange_weak_explicit (   OBJ,
  EXP,
  DES,
  MO 
)     atomic_compare_exchange_weak((OBJ), (EXP), (DES))

◆ atomic_exchange

#define atomic_exchange (   OBJ,
  DES 
)
Value:
({ \
__typeof__(OBJ) obj = (OBJ); \
__typeof__(*obj) des = (DES); \
__typeof__(*obj) expval; \
__typeof__(*obj) oldval = atomic_load(obj); \
do { \
expval = oldval; \
oldval = __sync_val_compare_and_swap( \
obj, expval, des); \
} while (oldval != expval); \
oldval; \
})
#define atomic_load(OBJ)
Definition: atomic.h:60

◆ atomic_exchange_explicit

#define atomic_exchange_explicit (   OBJ,
  DES,
  MO 
)     atomic_exchange((OBJ), (DES))

◆ atomic_fetch_add

#define atomic_fetch_add (   OBJ,
  VAL 
)     __sync_fetch_and_add((OBJ), (VAL))

◆ atomic_fetch_add_explicit

#define atomic_fetch_add_explicit (   OBJ,
  VAL,
  MO 
)     atomic_fetch_add((OBJ), (VAL))

◆ atomic_fetch_and

#define atomic_fetch_and (   OBJ,
  VAL 
)     __sync_fetch_and_and((OBJ), (VAL))

◆ atomic_fetch_and_explicit

#define atomic_fetch_and_explicit (   OBJ,
  VAL,
  MO 
)     atomic_fetch_and((OBJ), (VAL))

◆ atomic_fetch_or

#define atomic_fetch_or (   OBJ,
  VAL 
)     __sync_fetch_and_or((OBJ), (VAL))

◆ atomic_fetch_or_explicit

#define atomic_fetch_or_explicit (   OBJ,
  VAL,
  MO 
)     atomic_fetch_or((OBJ), (VAL))

◆ atomic_fetch_sub

#define atomic_fetch_sub (   OBJ,
  VAL 
)     __sync_fetch_and_sub((OBJ), (VAL))

◆ atomic_fetch_sub_explicit

#define atomic_fetch_sub_explicit (   OBJ,
  VAL,
  MO 
)     atomic_fetch_sub((OBJ), (VAL))

◆ atomic_fetch_xor

#define atomic_fetch_xor (   OBJ,
  VAL 
)     __sync_fetch_and_xor((OBJ), (VAL))

◆ atomic_fetch_xor_explicit

#define atomic_fetch_xor_explicit (   OBJ,
  VAL,
  MO 
)     atomic_fetch_xor((OBJ), (VAL))

◆ atomic_flag_clear

#define atomic_flag_clear (   FLAG)     __sync_lock_release((FLAG))

◆ atomic_flag_clear_explicit

#define atomic_flag_clear_explicit (   FLAG,
  MO 
)     atomic_flag_clear(FLAG)

◆ ATOMIC_FLAG_INIT

#define ATOMIC_FLAG_INIT   0

◆ atomic_flag_test_and_set

#define atomic_flag_test_and_set (   FLAG)     __sync_lock_test_and_set((FLAG), 1)

◆ atomic_flag_test_and_set_explicit

#define atomic_flag_test_and_set_explicit (   FLAG,
  MO 
)     atomic_flag_test_and_set(FLAG)

◆ atomic_init

#define atomic_init (   OBJ,
  VAL 
)     do { *(OBJ) = (VAL); } while (0)

◆ atomic_is_lock_free

#define atomic_is_lock_free (   OBJ)     (sizeof(*(OBJ)) <= sizeof(long))

◆ atomic_load

#define atomic_load (   OBJ)     ({ __sync_synchronize(); *(OBJ); })

◆ atomic_load_explicit

#define atomic_load_explicit (   OBJ,
  MO 
)     atomic_load(OBJ)

◆ atomic_signal_fence

#define atomic_signal_fence (   MO)     __sync_synchronize()

◆ atomic_store

#define atomic_store (   OBJ,
  VAL 
)     do { *(OBJ) = (VAL); __sync_synchronize(); } while (0)

◆ atomic_store_explicit

#define atomic_store_explicit (   OBJ,
  VAL,
  MO 
)     atomic_store((OBJ), (VAL))

◆ atomic_thread_fence

#define atomic_thread_fence (   MO)     __sync_synchronize()

◆ ATOMIC_VAR_INIT

#define ATOMIC_VAR_INIT (   VAL)    (VAL)

Typedef Documentation

◆ atomic_char

typedef char atomic_char

◆ atomic_flag

typedef int atomic_flag

◆ atomic_int

typedef int atomic_int

◆ atomic_llong

typedef long long atomic_llong

◆ atomic_long

typedef long atomic_long

◆ atomic_short

typedef short atomic_short

◆ atomic_uchar

typedef unsigned char atomic_uchar

◆ atomic_uint

typedef unsigned int atomic_uint

◆ atomic_uintptr_t

◆ atomic_ullong

typedef unsigned long long atomic_ullong

◆ atomic_ulong

typedef unsigned long atomic_ulong

◆ atomic_ushort

typedef unsigned short atomic_ushort

Enumeration Type Documentation

◆ memory_order

Enumerator
memory_order_relaxed 
memory_order_consume 
memory_order_acquire 
memory_order_release 
memory_order_acq_rel 
memory_order_seq_cst