From 70bc0a3ef40b1b9348750c12ca5df8f0863b7cfd Mon Sep 17 00:00:00 2001 From: Alexey Kopytov Date: Tue, 26 May 2015 23:56:00 +0300 Subject: Fixes MDEV-7658: MDEV-7026 fix reintroduces MDEV-6615 on AArch64 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is an addendum to the fix for MDEV-7026. The ARM memory model is similar to that of PowerPC and thus needs the same semantics with respect to memory barriers. That is, os_atomic_test_and_set_*_release() must be a store with a release barrier followed by a full barrier. Unlike x86 using __sync_lock_test_and_set() which is implemented as “exclusive load with acquire barriers + exclusive store” is insufficient in contexts where os_atomic_test_and_set_*_release() macros are used. --- storage/innobase/include/os0sync.h | 2 +- storage/xtradb/include/os0sync.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'storage') diff --git a/storage/innobase/include/os0sync.h b/storage/innobase/include/os0sync.h index 6f090c4b1b4..7fd1fde5e76 100644 --- a/storage/innobase/include/os0sync.h +++ b/storage/innobase/include/os0sync.h @@ -324,7 +324,7 @@ amount of increment. */ /**********************************************************//** Returns the old value of *ptr, atomically sets *ptr to new_val */ -#ifdef __powerpc__ +#if defined(__powerpc__) || defined(__aarch64__) /* os_atomic_test_and_set_byte_release() should imply a release barrier before setting, and a full barrier after. But __sync_lock_test_and_set() is only diff --git a/storage/xtradb/include/os0sync.h b/storage/xtradb/include/os0sync.h index 48b477d45a9..f0bdc76e0c9 100644 --- a/storage/xtradb/include/os0sync.h +++ b/storage/xtradb/include/os0sync.h @@ -331,7 +331,7 @@ amount of increment. */ /**********************************************************//** Returns the old value of *ptr, atomically sets *ptr to new_val */ -#ifdef __powerpc__ +#if defined(__powerpc__) || defined(__aarch64__) /* os_atomic_test_and_set_byte_release() should imply a release barrier before setting, and a full barrier after. But __sync_lock_test_and_set() is only -- cgit v1.2.1