Below is the list of changes that have just been committed into a local
5.1 repository of davi. When davi does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2008-01-08 12:06:54-02:00, davi@stripped +3 -0
Bug#33728 Atomic builtins
Use compiler provided atomic builtins as a 'backend' for
MySQL's atomic primitives. The builtins are available on
a handful of platforms and compilers.
configure.in@stripped, 2008-01-08 12:06:52-02:00, davi@stripped +23 -0
Check if the compiler provides atomic builtins and
that __sync_lock_test_and_set stores the correct value.
include/atomic/builtins.h@stripped, 2008-01-08 12:06:52-02:00, davi@stripped +33 -0
Implement the atomic ADD, SWAP, CAS, STORE (or operation
optimized away) and LOAD primitives using atomic builtins
provided by the compiler.
include/atomic/builtins.h@stripped, 2008-01-08 12:06:52-02:00, davi@stripped +0 -0
include/atomic/nolock.h@stripped, 2008-01-08 12:06:52-02:00, davi@stripped +4 -2
Use the atomic builtins if available.
diff -Nrup a/configure.in b/configure.in
--- a/configure.in 2007-12-14 15:03:30 -02:00
+++ b/configure.in 2008-01-08 12:06:52 -02:00
@@ -1688,6 +1688,29 @@ case "$with_atomic_ops" in
*) AC_MSG_ERROR(["$with_atomic_ops" is not a valid value for --with-atomic-ops]) ;;
esac
+AC_CACHE_CHECK([whether the compiler provides atomic builtins],
+ [mysql_cv_atomic_builtins], [AC_TRY_RUN([
+ int main()
+ {
+ int foo= -10; int bar= 10;
+ __sync_fetch_and_add(&foo, bar);
+ if (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;
+ return 0;
+ }
+], [mysql_cv_atomic_builtins=yes], [mysql_cv_atomic_builtins=no])])
+
+if test "x$mysql_cv_atomic_builtins" = xyes; then
+ AC_DEFINE(HAVE_ATOMIC_BUILTINS, 1,
+ [Define to 1 if compiler provides atomic builtins.])
+fi
+
# Force static compilation to avoid linking problems/get more speed
AC_ARG_WITH(mysqld-ldflags,
[ --with-mysqld-ldflags Extra linking arguments for mysqld],
diff -Nrup a/include/atomic/builtins.h b/include/atomic/builtins.h
--- /dev/null Wed Dec 31 16:00:00 196900
+++ b/include/atomic/builtins.h 2008-01-08 12:06:52 -02:00
@@ -0,0 +1,33 @@
+/* Copyright (C) 2008 MySQL AB
+
+ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#define make_atomic_add_body(S) \
+ v= __sync_fetch_and_add(a, v);
+#define make_atomic_swap_body(S) \
+ v= __sync_lock_test_and_set(a, v);
+#define make_atomic_cas_body(S) \
+ int ## S sav; \
+ sav= __sync_val_compare_and_swap(a, *cmp, set); \
+ if (!(ret= (sav == *cmp))) *cmp= sav;
+
+#ifdef MY_ATOMIC_MODE_DUMMY
+#define make_atomic_load_body(S) ret= *a
+#define make_atomic_store_body(S) *a= v
+#else
+#define make_atomic_load_body(S) \
+ ret= __sync_fetch_and_or(a, 0);
+#define make_atomic_store_body(S) \
+ (void) __sync_lock_test_and_set(a, v);
+#endif
diff -Nrup a/include/atomic/nolock.h b/include/atomic/nolock.h
--- a/include/atomic/nolock.h 2006-12-23 17:33:28 -02:00
+++ b/include/atomic/nolock.h 2008-01-08 12:06:52 -02:00
@@ -13,7 +13,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-#if defined(__i386__) || defined(_M_IX86)
+#if defined(__i386__) || defined(_M_IX86) || defined(HAVE_ATOMIC_BUILTINS)
#ifdef MY_ATOMIC_MODE_DUMMY
# define LOCK ""
@@ -21,7 +21,9 @@
# define LOCK "lock"
#endif
-#ifdef __GNUC__
+#ifdef HAVE_ATOMIC_BUILTINS
+#include "builtins.h"
+#elif __GNUC__
#include "x86-gcc.h"
#elif defined(_MSC_VER)
#include "x86-msvc.h"