table of contents
qbatomic.h(3) | libqb | qbatomic.h(3) |
NAME¶
qbatomic.h -
Basic atomic integer and pointer operations.
SYNOPSIS¶
#include <stdint.h>
#include <qb/qbdefs.h>
#include <qb/qbconfig.h>
Macros¶
#define qb_atomic_int_get(atomic)
#define qb_atomic_int_set(atomic, newval)
#define qb_atomic_pointer_get(atomic)
#define qb_atomic_pointer_set(atomic, newval)
#define qb_atomic_int_inc(atomic) (qb_atomic_int_add ((atomic),
1))
Atomically increments the integer pointed to by atomic by 1. #define
qb_atomic_int_dec_and_test(atomic)
(qb_atomic_int_exchange_and_add ((atomic), -1) == 1)
Atomically decrements the integer pointed to by atomic by 1.
Functions¶
void qb_atomic_init (void)
int32_t qb_atomic_int_exchange_and_add (volatile int32_t
QB_GNUC_MAY_ALIAS *atomic, int32_t val)
Atomically adds val to the integer pointed to by atomic. void
qb_atomic_int_add (volatile int32_t QB_GNUC_MAY_ALIAS *atomic,
int32_t val)
Atomically adds val to the integer pointed to by atomic. int32_t
qb_atomic_int_compare_and_exchange (volatile int32_t
QB_GNUC_MAY_ALIAS *atomic, int32_t oldval, int32_t newval)
Compares oldval with the integer pointed to by atomic and if they are
equal, atomically exchanges *atomic with newval. int32_t
qb_atomic_pointer_compare_and_exchange (volatile void
*QB_GNUC_MAY_ALIAS *atomic, void *oldval, void *newval)
Compares oldval with the pointer pointed to by atomic and if they are
equal, atomically exchanges *atomic with newval. int32_t
qb_atomic_int_get (volatile int32_t QB_GNUC_MAY_ALIAS *atomic)
Reads the value of the integer pointed to by atomic. void
qb_atomic_int_set (volatile int32_t QB_GNUC_MAY_ALIAS *atomic,
int32_t newval)
Sets the value of the integer pointed to by atomic. void *
qb_atomic_pointer_get (volatile void *QB_GNUC_MAY_ALIAS
*atomic)
Reads the value of the pointer pointed to by atomic. void
qb_atomic_pointer_set (volatile void *QB_GNUC_MAY_ALIAS
*atomic, void *newval)
Sets the value of the pointer pointed to by atomic.
Detailed Description¶
Basic atomic integer and pointer operations.
The following functions can be used to atomically access integers and pointers. They are implemented as inline assembler function on most platforms and use slower fall-backs otherwise. Using them can sometimes save you from using a performance-expensive pthread_mutex to protect the integer or pointer.
The most important usage is reference counting. Using qb_atomic_int_inc() and qb_atomic_int_dec_and_test() makes reference counting a very fast operation.
You must not directly read integers or pointers concurrently accessed by multiple threads, but use the atomic accessor functions instead. That is, always use qb_atomic_int_get() and qb_atomic_pointer_get() for read outs. They provide the necessary synchonization mechanisms like memory barriers to access memory locations concurrently.
If you are using those functions for anything apart from simple reference counting, you should really be aware of the implications of doing that. There are literally thousands of ways to shoot yourself in the foot. So if in doubt, use a pthread_mutex. If you don't know, what memory barriers are, do not use anything but qb_atomic_int_inc() and qb_atomic_int_dec_and_test().
It is not safe to set an integer or pointer just by assigning to it, when it is concurrently accessed by other threads with the following functions. Use qb_atomic_int_compare_and_exchange() or qb_atomic_pointer_compare_and_exchange() respectively.
Macro Definition Documentation¶
#define qb_atomic_int_dec_and_test(atomic) (qb_atomic_int_exchange_and_add ((atomic), -1) == 1)¶
Atomically decrements the integer pointed to by atomic by 1.
Parameters:
Returns:
#define qb_atomic_int_get(atomic)¶
Value:
((void) sizeof (char* [sizeof (*(atomic)) == sizeof (int32_t) ? 1 : -1]), (qb_atomic_int_get) ((volatile int32_t QB_GNUC_MAY_ALIAS *) (volatile void *) (atomic)))
#define qb_atomic_int_inc(atomic) (qb_atomic_int_add ((atomic), 1))¶
Atomically increments the integer pointed to by atomic by 1.
Parameters:
#define qb_atomic_int_set(atomic, newval)¶
Value:
((void) sizeof (char* [sizeof (*(atomic)) == sizeof (int32_t) ? 1 : -1]), (qb_atomic_int_set) ((volatile int32_t QB_GNUC_MAY_ALIAS *) (volatile void *) (atomic), (newval)))
#define qb_atomic_pointer_get(atomic)¶
Value:
((void) sizeof (char* [sizeof (*(atomic)) == sizeof (void*) ? 1 : -1]), (qb_atomic_pointer_get) ((volatile void* QB_GNUC_MAY_ALIAS *) (volatile void *) (atomic)))
#define qb_atomic_pointer_set(atomic, newval)¶
Value:
((void) sizeof (char* [sizeof (*(atomic)) == sizeof (void*) ? 1 : -1]), (qb_atomic_pointer_set) ((volatile void* QB_GNUC_MAY_ALIAS *) (volatile void *) (atomic), (newval)))
Function Documentation¶
void qb_atomic_init (void)¶
void qb_atomic_int_add (volatile int32_t QB_GNUC_MAY_ALIAS *atomic, int32_tval)¶
Atomically adds val to the integer pointed to by atomic. Also acts as a memory barrier.
Parameters:
val the value to add to *atomic
int32_t qb_atomic_int_compare_and_exchange (volatile int32_t QB_GNUC_MAY_ALIAS *atomic, int32_toldval, int32_tnewval)¶
Compares oldval with the integer pointed to by atomic and if they are equal, atomically exchanges *atomic with newval. Also acts as a memory barrier.
Parameters:
oldval the assumed old value of *atomic
newval the new value of *atomic
Returns:
int32_t qb_atomic_int_exchange_and_add (volatile int32_t QB_GNUC_MAY_ALIAS *atomic, int32_tval)¶
Atomically adds val to the integer pointed to by atomic. It returns the value of *atomic just before the addition took place. Also acts as a memory barrier.
Parameters:
val the value to add to *atomic
Returns:
int32_t qb_atomic_int_get (volatile int32_t QB_GNUC_MAY_ALIAS *atomic)¶
Reads the value of the integer pointed to by atomic. Also acts as a memory barrier.
Parameters:
Returns:
void qb_atomic_int_set (volatile int32_t QB_GNUC_MAY_ALIAS *atomic, int32_tnewval)¶
Sets the value of the integer pointed to by atomic. Also acts as a memory barrier.
Parameters:
newval the new value
int32_t qb_atomic_pointer_compare_and_exchange (volatile void *QB_GNUC_MAY_ALIAS *atomic, void *oldval, void *newval)¶
Compares oldval with the pointer pointed to by atomic and if they are equal, atomically exchanges *atomic with newval. Also acts as a memory barrier.
Parameters:
oldval the assumed old value of *atomic
newval the new value of *atomic
Returns:
void* qb_atomic_pointer_get (volatile void *QB_GNUC_MAY_ALIAS *atomic)¶
Reads the value of the pointer pointed to by atomic. Also acts as a memory barrier.
Parameters:
Returns:
void qb_atomic_pointer_set (volatile void *QB_GNUC_MAY_ALIAS *atomic, void *newval)¶
Sets the value of the pointer pointed to by atomic. Also acts as a memory barrier.
Parameters:
newval the new value
Author¶
Generated automatically by Doxygen for libqb from the source code.
Wed Apr 1 2020 | Version 1.0.1 |