diff options
Diffstat (limited to 'bdb')
-rw-r--r-- | bdb/dist/acconfig.h | 1 | ||||
-rw-r--r-- | bdb/dist/aclocal/mutex.m4 | 12 | ||||
-rw-r--r-- | bdb/include/mutex.h | 22 |
3 files changed, 35 insertions, 0 deletions
diff --git a/bdb/dist/acconfig.h b/bdb/dist/acconfig.h index e30d0e3d2c2..19f85a460d9 100644 --- a/bdb/dist/acconfig.h +++ b/bdb/dist/acconfig.h @@ -52,6 +52,7 @@ #undef HAVE_MUTEX_WIN16 #undef HAVE_MUTEX_WIN32 #undef HAVE_MUTEX_X86_GCC_ASSEMBLY +#undef HAVE_MUTEX_X86_64_GCC_ASSEMBLY /* Define if building on QNX. */ #undef HAVE_QNX diff --git a/bdb/dist/aclocal/mutex.m4 b/bdb/dist/aclocal/mutex.m4 index 5f16ee0e114..a6b1fa1a053 100644 --- a/bdb/dist/aclocal/mutex.m4 +++ b/bdb/dist/aclocal/mutex.m4 @@ -314,6 +314,18 @@ AC_TRY_RUN([main(){ }], [db_cv_mutex="x86/gcc-assembly"]) fi +dnl x86_64/gcc: FreeBSD, NetBSD, BSD/OS, Linux +if test "$db_cv_mutex" = no; then +AC_TRY_RUN([main(){ +#if defined(x86_64) || defined(__x86_64__) +#if defined(__GNUC__) + exit(0); +#endif +#endif + exit(1); +}], [db_cv_mutex="x86_64/gcc-assembly"]) +fi + dnl ia86/gcc: Linux if test "$db_cv_mutex" = no; then AC_TRY_RUN([main(){ diff --git a/bdb/include/mutex.h b/bdb/include/mutex.h index a8a41451012..4c1b265355d 100644 --- a/bdb/include/mutex.h +++ b/bdb/include/mutex.h @@ -611,6 +611,28 @@ typedef unsigned char tsl_t; #endif #endif +#ifdef HAVE_MUTEX_X86_64_GCC_ASSEMBLY +typedef unsigned char tsl_t; + +#ifdef LOAD_ACTUAL_MUTEX_CODE +/* + * For gcc/x86, 0 is clear, 1 is set. + */ +#define MUTEX_SET(tsl) ({ \ + register tsl_t *__l = (tsl); \ + int __r; \ + asm volatile("mov $1,%%rax; lock; xchgb %1,%%al; xor $1,%%rax"\ + : "=&a" (__r), "=m" (*__l) \ + : "1" (*__l) \ + ); \ + __r & 1; \ +}) + +#define MUTEX_UNSET(tsl) (*(tsl) = 0) +#define MUTEX_INIT(tsl) MUTEX_UNSET(tsl) +#endif +#endif + /* * Mutex alignment defaults to one byte. * |