mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-02-18 11:47:03 +00:00
MINOR: threads/atomic: implement pl_mb() in asm on x86
[ plock commit 44081ea493dd78dab48076980e881748e9b33db5 ] Older compilers (eg: gcc 3.4) don't provide __sync_synchronize() so let's do it by hand on this platform.
This commit is contained in:
parent
f7ba77eb80
commit
01b8398b9e
@ -8,14 +8,22 @@ static inline void pl_barrier()
|
|||||||
asm volatile("" ::: "memory");
|
asm volatile("" ::: "memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* full memory barrier */
|
#if defined(__i386__) || defined (__i486__) || defined (__i586__) || defined (__i686__) || defined (__x86_64__)
|
||||||
|
|
||||||
|
/* full memory barrier using mfence when SSE2 is supported, falling back to
|
||||||
|
* "lock add %esp" (gcc uses "lock add" or "lock or").
|
||||||
|
*/
|
||||||
static inline void pl_mb()
|
static inline void pl_mb()
|
||||||
{
|
{
|
||||||
__sync_synchronize();
|
#if defined(__SSE2__)
|
||||||
|
asm volatile("mfence" ::: "memory");
|
||||||
|
#elif defined(__x86_64__)
|
||||||
|
asm volatile("lock addl $0,0 (%%rsp)" ::: "memory", "cc");
|
||||||
|
#else
|
||||||
|
asm volatile("lock addl $0,0 (%%esp)" ::: "memory", "cc");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__i386__) || defined (__i486__) || defined (__i586__) || defined (__i686__) || defined (__x86_64__)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Generic functions common to the x86 family
|
* Generic functions common to the x86 family
|
||||||
*/
|
*/
|
||||||
@ -488,6 +496,12 @@ static inline void pl_cpu_relax()
|
|||||||
asm volatile("");
|
asm volatile("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* full memory barrier */
|
||||||
|
static inline void pl_mb()
|
||||||
|
{
|
||||||
|
__sync_synchronize();
|
||||||
|
}
|
||||||
|
|
||||||
#define pl_inc_noret(ptr) ({ __sync_add_and_fetch((ptr), 1); })
|
#define pl_inc_noret(ptr) ({ __sync_add_and_fetch((ptr), 1); })
|
||||||
#define pl_dec_noret(ptr) ({ __sync_sub_and_fetch((ptr), 1); })
|
#define pl_dec_noret(ptr) ({ __sync_sub_and_fetch((ptr), 1); })
|
||||||
#define pl_inc(ptr) ({ __sync_add_and_fetch((ptr), 1); })
|
#define pl_inc(ptr) ({ __sync_add_and_fetch((ptr), 1); })
|
||||||
|
Loading…
Reference in New Issue
Block a user