Skip to content

Commit

Permalink
MDEV-11212 - Clean-up MariaDB atomic operations
Browse files Browse the repository at this point in the history
Removed MY_ATOMIC_MODE_DUMMY and WITH_ATOMIC_OPS: MariaDB is not functional
without atomic operations anymore.
  • Loading branch information
Sergey Vojtovich committed Dec 13, 2016
1 parent bb99281 commit 8ff3b89
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 74 deletions.
1 change: 0 additions & 1 deletion config.h.cmake
Expand Up @@ -388,7 +388,6 @@

#cmakedefine HAVE_SOLARIS_STYLE_GETHOST 1

#cmakedefine MY_ATOMIC_MODE_DUMMY 1
#cmakedefine HAVE_GCC_ATOMIC_BUILTINS 1
#cmakedefine HAVE_GCC_C11_ATOMICS 1
#cmakedefine HAVE_SOLARIS_ATOMIC 1
Expand Down
74 changes: 32 additions & 42 deletions configure.cmake
Expand Up @@ -908,48 +908,38 @@ SET(SIGNAL_WITH_VIO_CLOSE 1)
MARK_AS_ADVANCED(NO_ALARM)


IF(WITH_ATOMIC_OPS STREQUAL "up")
SET(MY_ATOMIC_MODE_DUMMY 1 CACHE BOOL "Assume single-CPU mode, no concurrency")
ELSEIF(WITH_ATOMIC_OPS STREQUAL "smp")
ELSEIF(NOT WITH_ATOMIC_OPS)
CHECK_CXX_SOURCE_COMPILES("
int main()
{
int foo= -10; int bar= 10;
long long int foo64= -10; long long int bar64= 10;
if (!__sync_fetch_and_add(&foo, bar) || foo)
return -1;
bar= __sync_lock_test_and_set(&foo, bar);
if (bar || foo != 10)
return -1;
bar= __sync_val_compare_and_swap(&bar, foo, 15);
if (bar)
return -1;
if (!__sync_fetch_and_add(&foo64, bar64) || foo64)
return -1;
bar64= __sync_lock_test_and_set(&foo64, bar64);
if (bar64 || foo64 != 10)
return -1;
bar64= __sync_val_compare_and_swap(&bar64, foo, 15);
if (bar64)
return -1;
return 0;
}"
HAVE_GCC_ATOMIC_BUILTINS)
CHECK_CXX_SOURCE_COMPILES("
int main()
{
long long int var= 1;
long long int *ptr= &var;
return (int)__atomic_load_n(ptr, __ATOMIC_SEQ_CST);
}"
HAVE_GCC_C11_ATOMICS)
ELSE()
MESSAGE(FATAL_ERROR "${WITH_ATOMIC_OPS} is not a valid value for WITH_ATOMIC_OPS!")
ENDIF()

SET(WITH_ATOMIC_OPS "${WITH_ATOMIC_OPS}" CACHE STRING "Implement atomic operations using atomic CPU instructions for multi-processor (smp) or uniprocessor (up) configuration. By default gcc built-in sync functions are used, if available and 'smp' configuration otherwise.")
MARK_AS_ADVANCED(WITH_ATOMIC_OPS MY_ATOMIC_MODE_DUMMY)
CHECK_CXX_SOURCE_COMPILES("
int main()
{
int foo= -10; int bar= 10;
long long int foo64= -10; long long int bar64= 10;
if (!__sync_fetch_and_add(&foo, bar) || foo)
return -1;
bar= __sync_lock_test_and_set(&foo, bar);
if (bar || foo != 10)
return -1;
bar= __sync_val_compare_and_swap(&bar, foo, 15);
if (bar)
return -1;
if (!__sync_fetch_and_add(&foo64, bar64) || foo64)
return -1;
bar64= __sync_lock_test_and_set(&foo64, bar64);
if (bar64 || foo64 != 10)
return -1;
bar64= __sync_val_compare_and_swap(&bar64, foo, 15);
if (bar64)
return -1;
return 0;
}"
HAVE_GCC_ATOMIC_BUILTINS)
CHECK_CXX_SOURCE_COMPILES("
int main()
{
long long int var= 1;
long long int *ptr= &var;
return (int)__atomic_load_n(ptr, __ATOMIC_SEQ_CST);
}"
HAVE_GCC_C11_ATOMICS)

IF(WITH_VALGRIND)
SET(HAVE_valgrind 1)
Expand Down
7 changes: 1 addition & 6 deletions include/atomic/gcc_builtins.h
Expand Up @@ -26,12 +26,7 @@
sav= __sync_val_compare_and_swap(a, cmp_val, set);\
if (!(ret= (sav == cmp_val))) *cmp= sav

#ifdef MY_ATOMIC_MODE_DUMMY
#define make_atomic_load_body(S) ret= *a
#define make_atomic_store_body(S) *a= v
#define MY_ATOMIC_MODE "gcc-builtins-up"

#elif defined(HAVE_GCC_C11_ATOMICS)
#if defined(HAVE_GCC_C11_ATOMICS)
#define MY_ATOMIC_MODE "gcc-atomics-smp"
#define make_atomic_load_body(S) \
ret= __atomic_load_n(a, __ATOMIC_SEQ_CST)
Expand Down
5 changes: 0 additions & 5 deletions include/atomic/generic-msvc.h
Expand Up @@ -17,11 +17,6 @@
#ifndef _atomic_h_cleanup_
#define _atomic_h_cleanup_ "atomic/generic-msvc.h"

/*
We don't implement anything specific for MY_ATOMIC_MODE_DUMMY, always use
intrinsics.
*/

#include <windows.h>
/*
x86 compilers (both VS2003 or VS2005) never use instrinsics, but generate
Expand Down
9 changes: 0 additions & 9 deletions include/atomic/solaris.h
Expand Up @@ -45,21 +45,12 @@

/* ------------------------------------------------------------------------ */

#ifdef MY_ATOMIC_MODE_DUMMY

#define make_atomic_load_body(S) ret= *a
#define make_atomic_store_body(S) *a= v

#else /* MY_ATOMIC_MODE_DUMMY */

#define make_atomic_load_body(S) \
ret= atomic_or_ ## S ## _nv((volatile uint ## S ## _t *)a, 0)

#define make_atomic_store_body(S) \
(void) atomic_swap_ ## S((volatile uint ## S ## _t *)a, (uint ## S ## _t)v)

#endif

#define make_atomic_fas_body(S) \
v= atomic_swap_ ## S((volatile uint ## S ## _t *)a, (uint ## S ## _t)v)

Expand Down
11 changes: 0 additions & 11 deletions storage/perfschema/ha_perfschema.cc
Expand Up @@ -31,17 +31,6 @@
#include "pfs_user.h"
#include "pfs_account.h"

#ifdef MY_ATOMIC_MODE_DUMMY
/*
The performance schema can can not function with MY_ATOMIC_MODE_DUMMY,
a fully functional implementation of MY_ATOMIC should be used instead.
If the build fails with this error message:
- either use a different ./configure --with-atomic-ops option
- or do not build with the performance schema.
*/
#error "The performance schema needs a functional MY_ATOMIC implementation."
#endif

handlerton *pfs_hton= NULL;

static handler* pfs_create_handler(handlerton *hton,
Expand Down

0 comments on commit 8ff3b89

Please sign in to comment.