Add function for full memory barrier into maxscale/atomic.h
This allows safer lock-free reads to be done on lists that never shrink in size. The main use-case for this is to allow servers to be added to a service without locking the service each time a new session is created. Synchronizing the memory before adding new components into a list guarantees that if a session reads from the list and sees the new list item, the memory pointed by the item is valid.
This commit is contained in:
@ -29,7 +29,42 @@
|
|||||||
|
|
||||||
MXS_BEGIN_DECLS
|
MXS_BEGIN_DECLS
|
||||||
|
|
||||||
int atomic_add(int *variable, int value);
|
/**
|
||||||
|
* Implementation of an atomic add operation for the GCC environment, or the
|
||||||
|
* X86 processor. If we are working within GNU C then we can use the GCC
|
||||||
|
* atomic add built in function, which is portable across platforms that
|
||||||
|
* implement GCC. Otherwise, this function currently supports only X86
|
||||||
|
* architecture (without further development).
|
||||||
|
*
|
||||||
|
* Adds a value to the contents of a location pointed to by the first parameter.
|
||||||
|
* The add operation is atomic and the return value is the value stored in the
|
||||||
|
* location prior to the operation. The number that is added may be signed,
|
||||||
|
* therefore atomic_subtract is merely an atomic add with a negative value.
|
||||||
|
*
|
||||||
|
* @param variable Pointer the the variable to add to
|
||||||
|
* @param value Value to be added
|
||||||
|
* @return The value of variable before the add occurred
|
||||||
|
*/
|
||||||
int atomic_add(int *variable, int value);
|
int atomic_add(int *variable, int value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Impose a full memory barrier
|
||||||
|
*
|
||||||
|
* A full memory barrier guarantees that all store and load operations complete
|
||||||
|
* before the function is called.
|
||||||
|
*
|
||||||
|
* Currently, only the GNUC __sync_synchronize() is used. C11 introduces
|
||||||
|
* standard functions for atomic memory operations and should be taken into use.
|
||||||
|
*
|
||||||
|
* @see https://www.kernel.org/doc/Documentation/memory-barriers.txt
|
||||||
|
*/
|
||||||
|
static inline void atomic_synchronize()
|
||||||
|
{
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__sync_synchronize(); /* Memory barrier. */
|
||||||
|
#else
|
||||||
|
#error "No GNUC atomics available."
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
MXS_END_DECLS
|
MXS_END_DECLS
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file atomic.c - Implementation of atomic opertions for the gateway
|
* @file atomic.c - Implementation of atomic operations for MaxScale
|
||||||
*
|
*
|
||||||
* @verbatim
|
* @verbatim
|
||||||
* Revision History
|
* Revision History
|
||||||
@ -23,22 +23,6 @@
|
|||||||
* @endverbatim
|
* @endverbatim
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* Implementation of an atomic add operation for the GCC environment, or the
|
|
||||||
* X86 processor. If we are working within GNU C then we can use the GCC
|
|
||||||
* atomic add built in function, which is portable across platforms that
|
|
||||||
* implement GCC. Otherwise, this function currently supports only X86
|
|
||||||
* architecture (without further development).
|
|
||||||
*
|
|
||||||
* Adds a value to the contents of a location pointed to by the first parameter.
|
|
||||||
* The add operation is atomic and the return value is the value stored in the
|
|
||||||
* location prior to the operation. The number that is added may be signed,
|
|
||||||
* therefore atomic_subtract is merely an atomic add with a negative value.
|
|
||||||
*
|
|
||||||
* @param variable Pointer the the variable to add to
|
|
||||||
* @param value Value to be added
|
|
||||||
* @return The value of variable before the add occurred
|
|
||||||
*/
|
|
||||||
int
|
int
|
||||||
atomic_add(int *variable, int value)
|
atomic_add(int *variable, int value)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user