mirror of
https://github.com/MariaDB/server.git
synced 2026-05-15 19:37:16 +02:00
MDEV-6450 - MariaDB crash on Power8 when built with advance tool
chain InnoDB mutex_exit() function calls __sync_test_and_set() to release the lock. According to manual this function is supposed to create "acquire" memory barrier whereas in fact we need "release" memory barrier at mutex_exit(). The problem isn't repeatable with gcc because it creates "acquire-release" memory barrier for __sync_test_and_set(). ATC creates just "acquire" barrier. Fixed by creating proper barrier at mutex_exit() by using __sync_lock_release() instead of __sync_test_and_set().
This commit is contained in:
parent
c599cc6c03
commit
c0ebb3f388
4 changed files with 20 additions and 8 deletions
|
|
@ -434,6 +434,9 @@ Returns the old value of *ptr, atomically sets *ptr to new_val */
|
|||
# define os_atomic_test_and_set_ulint(ptr, new_val) \
|
||||
__sync_lock_test_and_set(ptr, new_val)
|
||||
|
||||
# define os_atomic_lock_release_byte(ptr) \
|
||||
__sync_lock_release(ptr)
|
||||
|
||||
#elif defined(HAVE_IB_SOLARIS_ATOMICS)
|
||||
|
||||
# define HAVE_ATOMIC_BUILTINS
|
||||
|
|
@ -515,6 +518,9 @@ Returns the old value of *ptr, atomically sets *ptr to new_val */
|
|||
# define os_atomic_test_and_set_ulint(ptr, new_val) \
|
||||
atomic_swap_ulong(ptr, new_val)
|
||||
|
||||
# define os_atomic_lock_release_byte(ptr) \
|
||||
(void) atomic_swap_uchar(ptr, 0)
|
||||
|
||||
#elif defined(HAVE_WINDOWS_ATOMICS)
|
||||
|
||||
# define HAVE_ATOMIC_BUILTINS
|
||||
|
|
@ -637,6 +643,9 @@ clobbered */
|
|||
# define os_atomic_test_and_set_ulong(ptr, new_val) \
|
||||
InterlockedExchange(ptr, new_val)
|
||||
|
||||
# define os_atomic_lock_release_byte(ptr) \
|
||||
(void) InterlockedExchange(ptr, 0)
|
||||
|
||||
#else
|
||||
# define IB_ATOMICS_STARTUP_MSG \
|
||||
"Mutexes and rw_locks use InnoDB's own implementation"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue