mirror of
git://git.musl-libc.org/musl
synced 2025-01-18 21:01:01 +00:00
3c43c0761e
despite being strongly ordered, the x86 memory model does not preclude reordering of loads across earlier stores. while a plain store suffices as a release barrier, we actually need a full barrier, since users of a_store subsequently load a waiter count to determine whether to issue a futex wait, and using a stale count will result in soft (fail-to-wake) deadlocks. these deadlocks were observed in malloc and possible with stdio locks and other libc-internal locking. on i386, an atomic operation on the caller's stack is used as the barrier rather than performing the store itself using xchg; this avoids the need to read the cache line on which the store is being performed. mfence is used on x86_64 where it's always available, and could be used on i386 with the appropriate cpu model checks if it's shown to perform better. |
||
---|---|---|
.. | ||
aarch64 | ||
arm | ||
i386 | ||
microblaze | ||
mips | ||
or1k | ||
powerpc | ||
sh | ||
x32 | ||
x86_64 |