1 Description: Fix mips missing atomics primitives
2 On mips we don't have native support for 64bit atomic operations. Make use
3 of libatomic to emulate them.
4 Author: Vicențiu Ciorbaru <vicentiu@mariadb.org>
8 @@ -128,7 +128,7 @@ IF(UNIX)
12 - SET(CMAKE_REQUIRED_LIBRARIES
13 + LIST(APPEND CMAKE_REQUIRED_LIBRARIES
14 ${LIBM} ${LIBNSL} ${LIBBIND} ${LIBCRYPT} ${LIBSOCKET} ${LIBDL} ${CMAKE_THREAD_LIBS_INIT} ${LIBRT} ${LIBEXECINFO})
15 # Need explicit pthread for gcc -fsanitize=address
16 IF(CMAKE_USE_PTHREADS_INIT AND CMAKE_C_FLAGS MATCHES "-fsanitize=")
17 @@ -1038,7 +1038,26 @@ ELSEIF(NOT WITH_ATOMIC_OPS)
18 long long int *ptr= &var;
19 return (int)__atomic_load_n(ptr, __ATOMIC_SEQ_CST);
21 - HAVE_GCC_C11_ATOMICS)
22 + HAVE_GCC_C11_ATOMICS_WITHOUT_LIBATOMIC)
23 + IF(HAVE_GCC_C11_ATOMICS_WITHOUT_LIBATOMIC)
24 + SET(HAVE_GCC_C11_ATOMICS True)
26 + SET(OLD_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
27 + LIST(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
28 + CHECK_CXX_SOURCE_COMPILES("
31 + long long int var= 1;
32 + long long int *ptr= &var;
33 + return (int)__atomic_load_n(ptr, __ATOMIC_SEQ_CST);
35 + HAVE_GCC_C11_ATOMICS_WITH_LIBATOMIC)
36 + IF(HAVE_GCC_C11_ATOMICS_WITH_LIBATOMIC)
37 + SET(HAVE_GCC_C11_ATOMICS True)
39 + SET(CMAKE_REQUIRED_LIBRARIES ${OLD_CMAKE_REQUIRED_LIBRARIES})
43 MESSAGE(FATAL_ERROR "${WITH_ATOMIC_OPS} is not a valid value for WITH_ATOMIC_OPS!")
45 --- a/include/atomic/gcc_builtins.h
46 +++ b/include/atomic/gcc_builtins.h
48 along with this program; if not, write to the Free Software
49 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
51 +#if defined (HAVE_GCC_ATOMIC_BUILTINS)
52 #define make_atomic_add_body(S) \
53 v= __sync_fetch_and_add(a, v);
54 #define make_atomic_fas_body(S) \
56 sav= __sync_val_compare_and_swap(a, cmp_val, set);\
57 if (!(ret= (sav == cmp_val))) *cmp= sav
59 +#elif defined(HAVE_GCC_C11_ATOMICS)
61 +#define make_atomic_add_body(S) \
62 + v= __atomic_fetch_add(a, v, __ATOMIC_SEQ_CST)
63 +#define make_atomic_fas_body(S) \
64 + v= __atomic_exchange_n(a, v, __ATOMIC_SEQ_CST)
65 +#define make_atomic_cas_body(S) \
67 + ret= __atomic_compare_exchange_n(a, cmp, set, \
73 #ifdef MY_ATOMIC_MODE_DUMMY
74 #define make_atomic_load_body(S) ret= *a
75 #define make_atomic_store_body(S) *a= v
76 --- a/include/atomic/nolock.h
77 +++ b/include/atomic/nolock.h
79 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
81 #if defined(__i386__) || defined(_MSC_VER) || defined(__x86_64__) \
82 - || defined(HAVE_GCC_ATOMIC_BUILTINS) \
83 + || defined(HAVE_GCC_ATOMIC_BUILTINS) || defined(HAVE_GCC_C11_ATOMICS) \
84 || defined(HAVE_SOLARIS_ATOMIC)
86 # ifdef MY_ATOMIC_MODE_DUMMY
89 # if defined(HAVE_SOLARIS_ATOMIC)
91 -# elif defined(HAVE_GCC_ATOMIC_BUILTINS)
92 +# elif defined(HAVE_GCC_ATOMIC_BUILTINS) || defined(HAVE_GCC_C11_ATOMICS)
93 # include "gcc_builtins.h"
94 # elif defined(__i386__) || defined(__x86_64__)
96 --- a/mysys/CMakeLists.txt
97 +++ b/mysys/CMakeLists.txt
98 @@ -78,6 +78,10 @@ IF(HAVE_BFD_H)
99 TARGET_LINK_LIBRARIES(mysys bfd)
102 +IF(HAVE_GCC_C11_ATOMICS_WITH_LIBATOMIC)
103 + TARGET_LINK_LIBRARIES(mysys atomic)
107 TARGET_LINK_LIBRARIES(mysys IPHLPAPI)
109 --- a/sql/CMakeLists.txt
110 +++ b/sql/CMakeLists.txt
111 @@ -165,6 +165,10 @@ TARGET_LINK_LIBRARIES(sql ${MYSQLD_STATI
115 +IF(HAVE_GCC_C11_ATOMICS_WITH_LIBATOMIC)
116 + TARGET_LINK_LIBRARIES(sql atomic)
120 SET(MYSQLD_SOURCE main.cc nt_servc.cc message.rc)
121 TARGET_LINK_LIBRARIES(sql psapi)