OpenMPI  0.1.1
atomic.h File Reference

Atomic operations. More...

#include "opal_config.h"
#include "opal/sys/architecture.h"
#include "opal/sys/atomic_impl.h"

Go to the source code of this file.

Data Structures

struct  opal_atomic_lock_t
 Volatile lock object (with optional padding). More...
 

Macros

#define OMPI_GCC_INLINE_ASSEMBLY   OPAL_C_GCC_INLINE_ASSEMBLY
 
#define OMPI_DEC_INLINE_ASSEMBLY   OPAL_C_DEC_INLINE_ASSEMBLY
 
#define OMPI_XLC_INLINE_ASSEMBLY   OPAL_C_XLC_INLINE_ASSEMBLY
 
#define OPAL_HAVE_INLINE_ATOMIC_MEM_BARRIER   0
 
#define OPAL_HAVE_INLINE_ATOMIC_CMPSET_32   0
 
#define OPAL_HAVE_INLINE_ATOMIC_CMPSET_64   0
 
#define OPAL_HAVE_INLINE_ATOMIC_ADD_32   0
 
#define OPAL_HAVE_INLINE_ATOMIC_SUB_32   0
 
#define OPAL_HAVE_INLINE_ATOMIC_ADD_64   0
 
#define OPAL_HAVE_INLINE_ATOMIC_SUB_64   0
 
#define OPAL_HAVE_INLINE_ATOMIC_SWAP_32   0
 
#define OPAL_HAVE_INLINE_ATOMIC_SWAP_64   0
 
#define OPAL_HAVE_ATOMIC_SPINLOCKS   (OPAL_HAVE_ATOMIC_CMPSET_32 || OPAL_HAVE_ATOMIC_CMPSET_64)
 
#define OPAL_NEED_INLINE_ATOMIC_SPINLOCKS
 
#define OPAL_HAVE_ATOMIC_MATH_32   OPAL_HAVE_ATOMIC_CMPSET_32
 
#define OPAL_HAVE_ATOMIC_MATH_64   0
 
#define OPAL_HAVE_ATOMIC_MATH_64   OPAL_HAVE_ATOMIC_CMPSET_64
 
#define opal_atomic_cmpset(ADDR, OLDVAL, NEWVAL)
 Atomic compare and set of pointer with relaxed semantics. More...
 
#define opal_atomic_cmpset_acq(ADDR, OLDVAL, NEWVAL)
 Atomic compare and set of pointer with acquire semantics. More...
 
#define opal_atomic_cmpset_rel(ADDR, OLDVAL, NEWVAL)
 Atomic compare and set of pointer with release semantics. More...
 
#define opal_atomic_add(ADDR, VALUE)
 Atomically increment the content depending on the type. More...
 
#define opal_atomic_sub(ADDR, VALUE)
 Atomically decrement the content depending on the type. More...
 

Typedefs

typedef struct opal_atomic_lock_t opal_atomic_lock_t
 

Enumerations

enum  { OPAL_ATOMIC_UNLOCKED = 0, OPAL_ATOMIC_LOCKED = 1 }
 Enumeration of lock states.
 

Functions

void opal_atomic_mb (void)
 Memory barrier. More...
 
void opal_atomic_rmb (void)
 Read memory barrier. More...
 
void opal_atomic_wmb (void)
 Write memory barrier. More...
 
static void opal_atomic_init (opal_atomic_lock_t *lock, int32_t value)
 Initialize a lock to value. More...
 
static int opal_atomic_trylock (opal_atomic_lock_t *lock)
 Try to acquire a lock. More...
 
static void opal_atomic_lock (opal_atomic_lock_t *lock)
 Acquire a lock by spinning. More...
 
static void opal_atomic_unlock (opal_atomic_lock_t *lock)
 Release a lock. More...
 
int opal_atomic_cmpset_32 (volatile int32_t *addr, int32_t oldval, int32_t newval)
 
int opal_atomic_cmpset_acq_32 (volatile int32_t *addr, int32_t oldval, int32_t newval)
 
int opal_atomic_cmpset_rel_32 (volatile int32_t *addr, int32_t oldval, int32_t newval)
 
int opal_atomic_cmpset_64 (volatile int64_t *addr, int64_t oldval, int64_t newval)
 
int opal_atomic_cmpset_acq_64 (volatile int64_t *addr, int64_t oldval, int64_t newval)
 
int opal_atomic_cmpset_rel_64 (volatile int64_t *addr, int64_t oldval, int64_t newval)
 
int32_t opal_atomic_add_32 (volatile int32_t *addr, int delta)
 
int32_t opal_atomic_sub_32 (volatile int32_t *addr, int delta)
 
int64_t opal_atomic_add_64 (volatile int64_t *addr, int64_t delta)
 
int64_t opal_atomic_sub_64 (volatile int64_t *addr, int64_t delta)
 
static size_t opal_atomic_add_size_t (volatile size_t *addr, int delta)
 
static size_t opal_atomic_sub_size_t (volatile size_t *addr, int delta)
 
static int opal_atomic_cmpset_xx (volatile void *addr, int64_t oldval, int64_t newval, size_t length)
 
static int opal_atomic_cmpset_acq_xx (volatile void *addr, int64_t oldval, int64_t newval, size_t length)
 
static int opal_atomic_cmpset_rel_xx (volatile void *addr, int64_t oldval, int64_t newval, size_t length)
 
static int opal_atomic_cmpset_ptr (volatile void *addr, void *oldval, void *newval)
 
static int opal_atomic_cmpset_acq_ptr (volatile void *addr, void *oldval, void *newval)
 
static int opal_atomic_cmpset_rel_ptr (volatile void *addr, void *oldval, void *newval)
 
static void opal_atomic_add_xx (volatile void *addr, int32_t value, size_t length)
 
static void opal_atomic_sub_xx (volatile void *addr, int32_t value, size_t length)
 

Detailed Description

Atomic operations.

This API is patterned after the FreeBSD kernel atomic interface (which is influenced by Intel's ia64 architecture). The FreeBSD interface is documented at

http://www.freebsd.org/cgi/man.cgi?query=atomic&sektion=9

Only the necessary subset of functions are implemented here.

The following #defines will be true / false based on assembly support:

  • OPAL_HAVE_ATOMIC_MEM_BARRIER atomic memory barriers
  • OPAL_HAVE_ATOMIC_SPINLOCKS atomic spinlocks
  • OPAL_HAVE_ATOMIC_MATH_32 if 32 bit add/sub/cmpset can be done "atomicly"
  • OPAL_HAVE_ATOMIC_MATH_64 if 32 bit add/sub/cmpset can be done "atomicly"

Note that for the Atomic math, atomic add/sub may be implemented as C code using opal_atomic_cmpset. The appearance of atomic operation will be upheld in these cases.

Macro Definition Documentation

#define opal_atomic_add (   ADDR,
  VALUE 
)
Value:
opal_atomic_add_xx( (volatile void*)(ADDR), (int32_t)(VALUE), \
sizeof(*(ADDR)) )

Atomically increment the content depending on the type.

This macro detect at compile time the type of the first argument and choose the correct function to be called.

Note
This macro should only be used for integer types.
Parameters
addrAddress of <TYPE>
deltaValue to add (converted to <TYPE>).

Referenced by mca_coll_sm_barrier_intra(), opal_list_insert(), and opal_progress().

#define opal_atomic_cmpset (   ADDR,
  OLDVAL,
  NEWVAL 
)
Value:
opal_atomic_cmpset_xx( (volatile void*)(ADDR), (intptr_t)(OLDVAL), \
(intptr_t)(NEWVAL), sizeof(*(ADDR)) )

Atomic compare and set of pointer with relaxed semantics.

This macro detect at compile time the type of the first argument and choose the correct function to be called.

Note
This macro should only be used for integer types.
Parameters
addrAddress of <TYPE>.
oldvalComparison value <TYPE>.
newvalNew value to set if comparision is true <TYPE>.

See opal_atomic_cmpset_* for pseudo-code.

#define opal_atomic_cmpset_acq (   ADDR,
  OLDVAL,
  NEWVAL 
)
Value:
opal_atomic_cmpset_acq_xx( (volatile void*)(ADDR), (int64_t)(OLDVAL), \
(int64_t)(NEWVAL), sizeof(*(ADDR)) )

Atomic compare and set of pointer with acquire semantics.

This macro detect at compile time the type of the first argument and choose the correct function to be called.

Note
This macro should only be used for integer types.
Parameters
addrAddress of <TYPE>.
oldvalComparison value <TYPE>.
newvalNew value to set if comparision is true <TYPE>.

See opal_atomic_cmpset_acq_* for pseudo-code.

#define opal_atomic_cmpset_rel (   ADDR,
  OLDVAL,
  NEWVAL 
)
Value:
opal_atomic_cmpset_rel_xx( (volatile void*)(ADDR), (int64_t)(OLDVAL), \
(int64_t)(NEWVAL), sizeof(*(ADDR)) )

Atomic compare and set of pointer with release semantics.

This macro detect at compile time the type of the first argument and choose the correct function to b

Note
This macro should only be used for integer types.
Parameters
addrAddress of <TYPE>.
oldvalComparison value <TYPE>.
newvalNew value to set if comparision is true <TYPE>.

See opal_atomic_cmpsetrel_* for pseudo-code.

#define opal_atomic_sub (   ADDR,
  VALUE 
)
Value:
opal_atomic_sub_xx( (volatile void*)(ADDR), (int32_t)(VALUE), \
sizeof(*(ADDR)) )

Atomically decrement the content depending on the type.

This macro detect at compile time the type of the first argument and choose the correct function to be called.

Note
This macro should only be used for integer types.
Parameters
addrAddress of <TYPE>
deltaValue to substract (converted to <TYPE>).

Function Documentation

static void opal_atomic_init ( opal_atomic_lock_t lock,
int32_t  value 
)
inlinestatic

Initialize a lock to value.

Parameters
lockAddress of the lock
valueInitial value to set lock to

Referenced by opal_progress_init(), and orte_locks_init().

static void opal_atomic_lock ( opal_atomic_lock_t lock)
inlinestatic
void opal_atomic_mb ( void  )

Memory barrier.

Will use system-specific features to instruct the processor and memory controller that all writes and reads that have been posted before the call to opal_atomic_mb() must appear to have completed before the next read or write.

Note
This can have some expensive side effects, including flushing the pipeline, preventing the cpu from reordering instructions, and generally grinding the memory controller's performance. Use only if you need both read and write barriers.
void opal_atomic_rmb ( void  )

Read memory barrier.

Use system-specific features to instruct the processor and memory conrtoller that all reads that have been posted before the call to opal_atomic_rmb() must appear to have been completed before the next read. Nothing is said about the ordering of writes when using opal_atomic_rmb().

Referenced by mca_btl_sm_add_procs(), mca_btl_smcuda_add_procs(), and mca_mpool_grdma_evict().

static int opal_atomic_trylock ( opal_atomic_lock_t lock)
inlinestatic

Try to acquire a lock.

Parameters
lockAddress of the lock.
Returns
0 if the lock was acquired, 1 otherwise.

Referenced by orte_finalize().

static void opal_atomic_unlock ( opal_atomic_lock_t lock)
inlinestatic
void opal_atomic_wmb ( void  )

Write memory barrier.

Use system-specific features to instruct the processor and memory conrtoller that all writes that have been posted before the call to opal_atomic_wmb() must appear to have been completed before the next write. Nothing is said about the ordering of reads when using opal_atomic_wmb().

Referenced by mca_btl_sm_add_procs(), mca_btl_smcuda_add_procs(), mca_coll_sm_bcast_intra(), and mca_mpool_grdma_evict().