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:
parent
a163e31b9a
commit
ded551e199
@ -29,7 +29,42 @@
|
||||
|
||||
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);
|
||||
|
||||
/**
|
||||
* @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
|
||||
|
@ -12,7 +12,7 @@
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file atomic.c - Implementation of atomic opertions for the gateway
|
||||
* @file atomic.c - Implementation of atomic operations for MaxScale
|
||||
*
|
||||
* @verbatim
|
||||
* Revision History
|
||||
@ -23,22 +23,6 @@
|
||||
* @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
|
||||
atomic_add(int *variable, int value)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user