From 354bb40e75d94466e91fe6960523612c9d17ccfb Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Thu, 2 Nov 2017 23:11:29 +0300 Subject: Add implementation --- mysql/my_atomic.h | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 mysql/my_atomic.h (limited to 'mysql/my_atomic.h') diff --git a/mysql/my_atomic.h b/mysql/my_atomic.h new file mode 100644 index 0000000..065209d --- /dev/null +++ b/mysql/my_atomic.h @@ -0,0 +1,76 @@ +#ifndef MY_ATOMIC_INCLUDED +#define MY_ATOMIC_INCLUDED + +/* Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +/* + This header defines five atomic operations: + + my_atomic_add#(&var, what) + 'Fetch and Add' + add 'what' to *var, and return the old value of *var + + my_atomic_fas#(&var, what) + 'Fetch And Store' + store 'what' in *var, and return the old value of *var + + my_atomic_cas#(&var, &old, new) + An odd variation of 'Compare And Set/Swap' + if *var is equal to *old, then store 'new' in *var, and return TRUE + otherwise store *var in *old, and return FALSE + Usually, &old should not be accessed if the operation is successful. + + my_atomic_load#(&var) + return *var + + my_atomic_store#(&var, what) + store 'what' in *var + + '#' is substituted by a size suffix - 32, 64, or ptr + (e.g. my_atomic_add64, my_atomic_fas32, my_atomic_casptr). +*/ + +/* + We choose implementation as follows: + ------------------------------------ + On Windows using Visual C++ the native implementation should be + preferrable. When using gcc we prefer the Solaris implementation + before the gcc because of stability preference, we choose gcc + builtins if available. If neither Visual C++ or gcc we still choose + the Solaris implementation on Solaris (mainly for SunStudio compilers). +*/ +#if defined(_MSC_VER) +# include "atomic/generic-msvc.h" +#elif defined(HAVE_SOLARIS_ATOMIC) +# include "atomic/solaris.h" +#elif defined(HAVE_GCC_SYNC_BUILTINS) /* Use old __sync by default */ +# include "atomic/gcc_sync.h" +#elif defined(HAVE_GCC_ATOMIC_BUILTINS) /* Use __atomic on e.g. powerpc */ +# include "atomic/gcc_atomic.h" +#else +# error Native atomics support not found! +#endif + +/* + the macro below defines (as an expression) the code that + will be run in spin-loops. Intel manuals recummend to have PAUSE there. + It is expected to be defined in include/atomic/ *.h files +*/ +#ifndef LF_BACKOFF +#define LF_BACKOFF (1) +#endif + +#endif /* MY_ATOMIC_INCLUDED */ -- cgit v1.1