| qbatomic.h | qbatomic.h | |||
|---|---|---|---|---|
| skipping to change at line 28 | skipping to change at line 28 | |||
| */ | */ | |||
| /* | /* | |||
| * Copied from the glib code base (glib/gatomic.h) and namespaced | * Copied from the glib code base (glib/gatomic.h) and namespaced | |||
| * for libqb. | * for libqb. | |||
| */ | */ | |||
| #ifndef QB_ATOMIC_DEFINED | #ifndef QB_ATOMIC_DEFINED | |||
| #define QB_ATOMIC_DEFINED | #define QB_ATOMIC_DEFINED | |||
| /* *INDENT-OFF* */ | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| /* *INDENT-ON* */ | ||||
| #include <stdint.h> | #include <stdint.h> | |||
| #include <qb/qbdefs.h> | #include <qb/qbdefs.h> | |||
| #include <qb/qbconfig.h> | ||||
| /** | /** | |||
| * @file | * @file | |||
| * Basic atomic integer and pointer operations | * Basic atomic integer and pointer operations | |||
| * | * | |||
| * The following functions can be used to atomically access integers and | * The following functions can be used to atomically access integers and | |||
| * pointers. They are implemented as inline assembler function on most | * pointers. They are implemented as inline assembler function on most | |||
| * platforms and use slower fall-backs otherwise. Using them can sometimes | * platforms and use slower fall-backs otherwise. Using them can sometimes | |||
| * save you from using a performance-expensive pthread_mutex to protect the | * save you from using a performance-expensive pthread_mutex to protect the | |||
| * integer or pointer. | * integer or pointer. | |||
| skipping to change at line 64 | skipping to change at line 71 | |||
| * in the foot. So if in doubt, use a pthread_mutex. If you don't know, wha t | * in the foot. So if in doubt, use a pthread_mutex. If you don't know, wha t | |||
| * memory barriers are, do not use anything but qb_atomic_int_inc() and | * memory barriers are, do not use anything but qb_atomic_int_inc() and | |||
| * qb_atomic_int_dec_and_test(). | * qb_atomic_int_dec_and_test(). | |||
| * | * | |||
| * It is not safe to set an integer or pointer just by assigning | * 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 follow ing | * to it, when it is concurrently accessed by other threads with the follow ing | |||
| * functions. Use qb_atomic_int_compare_and_exchange() or | * functions. Use qb_atomic_int_compare_and_exchange() or | |||
| * qb_atomic_pointer_compare_and_exchange() respectively. | * qb_atomic_pointer_compare_and_exchange() respectively. | |||
| */ | */ | |||
| /* *INDENT-OFF* */ | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| /* *INDENT-ON* */ | ||||
| void qb_atomic_init(void); | void qb_atomic_init(void); | |||
| /** | /** | |||
| * Atomically adds val to the integer pointed to by atomic. | * Atomically adds val to the integer pointed to by atomic. | |||
| * It returns the value of *atomic just before the addition | * It returns the value of *atomic just before the addition | |||
| * took place. Also acts as a memory barrier. | * took place. Also acts as a memory barrier. | |||
| * | * | |||
| * @param atomic a pointer to an integer | * @param atomic a pointer to an integer | |||
| * @param val the value to add to *atomic | * @param val the value to add to *atomic | |||
| * @return the value of *atomic before the addition. | * @return the value of *atomic before the addition. | |||
| skipping to change at line 166 | skipping to change at line 167 | |||
| * @param newval the new value | * @param newval the new value | |||
| * | * | |||
| */ | */ | |||
| void qb_atomic_pointer_set(volatile void* QB_GNUC_MAY_ALIAS * atomic, | void qb_atomic_pointer_set(volatile void* QB_GNUC_MAY_ALIAS * atomic, | |||
| void* newval); | void* newval); | |||
| #ifndef QB_ATOMIC_OP_MEMORY_BARRIER_NEEDED | #ifndef QB_ATOMIC_OP_MEMORY_BARRIER_NEEDED | |||
| #define qb_atomic_int_get(atomic) ((int32_t)*(atomic)) | #define qb_atomic_int_get(atomic) ((int32_t)*(atomic)) | |||
| #define qb_atomic_int_set(atomic, newval) ((void) (*(atomic) = (newval ))) | #define qb_atomic_int_set(atomic, newval) ((void) (*(atomic) = (newval ))) | |||
| #define qb_atomic_pointer_get(atomic) ((void*)*(atomic)) | #define qb_atomic_pointer_get(atomic) ((void*)*(atomic)) | |||
| #define qb_atomic_pointer_set(atomic, newval) ((void) (*(atomic) = (newval ))) | #define qb_atomic_pointer_set(atomic, newval) ((void*) (*(atomic) = (newva l))) | |||
| #else | #else | |||
| #define qb_atomic_int_get(atomic) \ | #define qb_atomic_int_get(atomic) \ | |||
| ((void) sizeof (char* [sizeof (*(atomic)) == sizeof (int32_t) ? 1 : -1]), \ | ((void) sizeof (char* [sizeof (*(atomic)) == sizeof (int32_t) ? 1 : -1]), \ | |||
| (qb_atomic_int_get) ((volatile int32_t QB_GNUC_MAY_ALIAS *) (volatile voi d *) (atomic))) | (qb_atomic_int_get) ((volatile int32_t QB_GNUC_MAY_ALIAS *) (volatile voi d *) (atomic))) | |||
| #define qb_atomic_int_set(atomic, newval) \ | #define qb_atomic_int_set(atomic, newval) \ | |||
| ((void) sizeof (char* [sizeof (*(atomic)) == sizeof (int32_t) ? 1 : -1]), \ | ((void) sizeof (char* [sizeof (*(atomic)) == sizeof (int32_t) ? 1 : -1]), \ | |||
| (qb_atomic_int_set) ((volatile int32_t QB_GNUC_MAY_ALIAS *) (volatile voi d *) (atomic), (newval))) | (qb_atomic_int_set) ((volatile int32_t QB_GNUC_MAY_ALIAS *) (volatile voi d *) (atomic), (newval))) | |||
| #define qb_atomic_pointer_get(atomic) \ | #define qb_atomic_pointer_get(atomic) \ | |||
| ((void) sizeof (char* [sizeof (*(atomic)) == sizeof (void*) ? 1 : -1]), \ | ((void) sizeof (char* [sizeof (*(atomic)) == sizeof (void*) ? 1 : -1]), \ | |||
| (qb_atomic_pointer_get) ((volatile void QB_GNUC_MAY_ALIAS *) (volatile vo id *) (atomic))) | (qb_atomic_pointer_get) ((volatile void* QB_GNUC_MAY_ALIAS *) (volatile v oid *) (atomic))) | |||
| #define qb_atomic_pointer_set(atomic, newval) \ | #define qb_atomic_pointer_set(atomic, newval) \ | |||
| ((void) sizeof (char* [sizeof (*(atomic)) == sizeof (void*) ? 1 : -1]), \ | ((void) sizeof (char* [sizeof (*(atomic)) == sizeof (void*) ? 1 : -1]), \ | |||
| (qb_atomic_pointer_set) ((volatile void QB_GNUC_MAY_ALIAS *) (volatile vo id *) (atomic), (newval))) | (qb_atomic_pointer_set) ((volatile void* QB_GNUC_MAY_ALIAS *) (volatile v oid *) (atomic), (newval))) | |||
| #endif /* QB_ATOMIC_OP_MEMORY_BARRIER_NEEDED */ | #endif /* QB_ATOMIC_OP_MEMORY_BARRIER_NEEDED */ | |||
| /** | /** | |||
| * Atomically increments the integer pointed to by atomic by 1. | * Atomically increments the integer pointed to by atomic by 1. | |||
| * | * | |||
| * @param atomic a pointer to an integer. | * @param atomic a pointer to an integer. | |||
| */ | */ | |||
| #define qb_atomic_int_inc(atomic) (qb_atomic_int_add ((atomic), 1)) | #define qb_atomic_int_inc(atomic) (qb_atomic_int_add ((atomic), 1)) | |||
| /** | /** | |||
| End of changes. 6 change blocks. | ||||
| 9 lines changed or deleted | 10 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||