📄 mutex.m4
字号:
# $Id: mutex.m4,v 12.26 2007/05/18 15:08:50 bostic Exp $# POSIX pthreads tests: inter-process safe and intra-process only.AC_DEFUN(AM_PTHREADS_SHARED, [AC_TRY_RUN([#include <pthread.h>main() { pthread_cond_t cond; pthread_mutex_t mutex; pthread_condattr_t condattr; pthread_mutexattr_t mutexattr; exit ( pthread_condattr_init(&condattr) || pthread_condattr_setpshared(&condattr, PTHREAD_PROCESS_SHARED) || pthread_mutexattr_init(&mutexattr) || pthread_mutexattr_setpshared(&mutexattr, PTHREAD_PROCESS_SHARED) || pthread_cond_init(&cond, &condattr) || pthread_mutex_init(&mutex, &mutexattr) || pthread_mutex_lock(&mutex) || pthread_mutex_unlock(&mutex) || pthread_mutex_destroy(&mutex) || pthread_cond_destroy(&cond) || pthread_condattr_destroy(&condattr) || pthread_mutexattr_destroy(&mutexattr));}], [db_cv_mutex="$1"],,AC_TRY_LINK([#include <pthread.h>],[ pthread_cond_t cond; pthread_mutex_t mutex; pthread_condattr_t condattr; pthread_mutexattr_t mutexattr; exit ( pthread_condattr_init(&condattr) || pthread_condattr_setpshared(&condattr, PTHREAD_PROCESS_SHARED) || pthread_mutexattr_init(&mutexattr) || pthread_mutexattr_setpshared(&mutexattr, PTHREAD_PROCESS_SHARED) || pthread_cond_init(&cond, &condattr) || pthread_mutex_init(&mutex, &mutexattr) || pthread_mutex_lock(&mutex) || pthread_mutex_unlock(&mutex) || pthread_mutex_destroy(&mutex) || pthread_cond_destroy(&cond) || pthread_condattr_destroy(&condattr) || pthread_mutexattr_destroy(&mutexattr));], [db_cv_mutex="$1"]))])AC_DEFUN(AM_PTHREADS_PRIVATE, [AC_TRY_RUN([#include <pthread.h>main() { pthread_cond_t cond; pthread_mutex_t mutex; pthread_condattr_t condattr; pthread_mutexattr_t mutexattr; exit ( pthread_condattr_init(&condattr) || pthread_mutexattr_init(&mutexattr) || pthread_cond_init(&cond, &condattr) || pthread_mutex_init(&mutex, &mutexattr) || pthread_mutex_lock(&mutex) || pthread_mutex_unlock(&mutex) || pthread_mutex_destroy(&mutex) || pthread_cond_destroy(&cond) || pthread_condattr_destroy(&condattr) || pthread_mutexattr_destroy(&mutexattr));}], [db_cv_mutex="$1"],,AC_TRY_LINK([#include <pthread.h>],[ pthread_cond_t cond; pthread_mutex_t mutex; pthread_condattr_t condattr; pthread_mutexattr_t mutexattr; exit ( pthread_condattr_init(&condattr) || pthread_mutexattr_init(&mutexattr) || pthread_cond_init(&cond, &condattr) || pthread_mutex_init(&mutex, &mutexattr) || pthread_mutex_lock(&mutex) || pthread_mutex_unlock(&mutex) || pthread_mutex_destroy(&mutex) || pthread_cond_destroy(&cond) || pthread_condattr_destroy(&condattr) || pthread_mutexattr_destroy(&mutexattr));], [db_cv_mutex="$1"]))])# Figure out mutexes for this compiler/architecture.## There are 3 mutex groups in BDB: pthreads-style, test-and-set, or a hybrid# combination of the two. We first test for the pthreads-style mutex, and# then for a test-and-set mutex.AC_DEFUN(AM_DEFINE_MUTEXES, [# Mutexes we don't test for, but want the #defines to exist for other ports.AH_TEMPLATE(HAVE_MUTEX_VMS, [Define to 1 to use VMS mutexes.])AH_TEMPLATE(HAVE_MUTEX_VXWORKS, [Define to 1 to use VxWorks mutexes.])AC_CACHE_CHECK([for mutexes], db_cv_mutex, [orig_libs=$LIBSdb_cv_mutex=no# Mutexes can be disabled.if test "$db_cv_build_mutexsupport" = no; then db_cv_mutex=disabled;fi# User-specified Win32 mutexes (MinGW build)if test "$db_cv_mingw" = yes; then db_cv_mutex=win32/gccfiif test "$db_cv_mutex" = no; then # User-specified POSIX or UI mutexes. # # There are two different reasons to specify mutexes: First, the # application is already using one type of mutex and doesn't want # to mix-and-match (for example, on Solaris, which has POSIX, UI # and LWP mutexes). Second, the application's POSIX pthreads # mutexes don't support inter-process locking, but the application # wants to use them anyway (for example, some Linux and *BSD systems). # # Test for LWP threads before testing for UI/POSIX threads, we prefer # them on Solaris, for two reasons: a bug in SunOS 5.7 causes # applications to get pwrite, not pwrite64, if they load the C library # before the appropriate threads library, e.g., tclsh using dlopen to # load the DB library. Second, LWP mutexes are faster than POSIX # pthread mutexes by some amount. # # Otherwise, test for POSIX threads before UI threads. There are Linux # systems that support a UI compatibility mode, and applications are # more likely to be written for POSIX threads than UI threads. if test "$db_cv_posixmutexes" = yes; then db_cv_mutex=posix_only; fi if test "$db_cv_uimutexes" = yes; then db_cv_mutex=ui_only; fi # LWP threads: _lwp_XXX if test "$db_cv_mutex" = no; then AC_TRY_LINK([ #include <synch.h>],[ static lwp_mutex_t mi = SHAREDMUTEX; static lwp_cond_t ci = SHAREDCV; lwp_mutex_t mutex = mi; lwp_cond_t cond = ci; exit ( _lwp_mutex_lock(&mutex) || _lwp_mutex_unlock(&mutex)); ], [db_cv_mutex=Solaris/lwp]) fi # POSIX.1 pthreads: pthread_XXX # # If the user specified we use POSIX pthreads mutexes, and we fail to # find the full interface, try and configure for just intra-process # support. if test "$db_cv_mutex" = no -o "$db_cv_mutex" = posix_only; then LIBS="$LIBS -lpthread" AM_PTHREADS_SHARED(POSIX/pthreads/library) LIBS="$orig_libs" fi if test "$db_cv_mutex" = no -o "$db_cv_mutex" = posix_only; then AM_PTHREADS_SHARED(POSIX/pthreads) fi if test "$db_cv_mutex" = posix_only; then AM_PTHREADS_PRIVATE(POSIX/pthreads/private) fi if test "$db_cv_mutex" = posix_only; then LIBS="$LIBS -lpthread" AM_PTHREADS_PRIVATE(POSIX/pthreads/library/private) LIBS="$orig_libs" fi if test "$db_cv_mutex" = posix_only; then AC_MSG_ERROR([unable to find POSIX 1003.1 mutex interfaces]) fi # UI threads: thr_XXX if test "$db_cv_mutex" = no -o "$db_cv_mutex" = ui_only; then LIBS="$LIBS -lthread" AC_TRY_LINK([ #include <thread.h> #include <synch.h>],[ mutex_t mutex; cond_t cond; int type = USYNC_PROCESS; exit ( mutex_init(&mutex, type, NULL) || cond_init(&cond, type, NULL) || mutex_lock(&mutex) || mutex_unlock(&mutex)); ], [db_cv_mutex=UI/threads/library]) LIBS="$orig_libs" fi if test "$db_cv_mutex" = no -o "$db_cv_mutex" = ui_only; then AC_TRY_LINK([ #include <thread.h> #include <synch.h>],[ mutex_t mutex; cond_t cond; int type = USYNC_PROCESS; exit ( mutex_init(&mutex, type, NULL) || cond_init(&cond, type, NULL) || mutex_lock(&mutex) || mutex_unlock(&mutex)); ], [db_cv_mutex=UI/threads]) fi if test "$db_cv_mutex" = ui_only; then AC_MSG_ERROR([unable to find UI mutex interfaces]) fi # We're done testing for pthreads-style mutexes. Next, check for # test-and-set mutexes. Check first for hybrid implementations, # because we check for them even if we've already found a # pthreads-style mutex and they're the most common architectures # anyway. # # x86/gcc: FreeBSD, NetBSD, BSD/OS, Linux AC_TRY_COMPILE(,[ #if (defined(i386) || defined(__i386__)) && defined(__GNUC__) exit(0); #else FAIL TO COMPILE/LINK #endif ], [db_cv_mutex="$db_cv_mutex/x86/gcc-assembly"]) # x86_64/gcc: FreeBSD, NetBSD, BSD/OS, Linux AC_TRY_COMPILE(,[ #if (defined(x86_64) || defined(__x86_64__)) && defined(__GNUC__) exit(0); #else FAIL TO COMPILE/LINK #endif ], [db_cv_mutex="$db_cv_mutex/x86_64/gcc-assembly"]) # Solaris is one of the systems where we can configure hybrid mutexes. # However, we require the membar_enter function for that, and only newer # Solaris releases have it. Check to see if we can configure hybrids. AC_TRY_LINK([ #include <sys/atomic.h> #include <sys/machlock.h>],[ typedef lock_t tsl_t; lock_t x; _lock_try(&x); _lock_clear(&x); membar_enter(); ], [db_cv_mutex="$db_cv_mutex/Solaris/_lock_try/membar"]) # Sparc/gcc: SunOS, Solaris AC_TRY_COMPILE(,[ #if defined(__sparc__) && defined(__GNUC__) exit(0); #else FAIL TO COMPILE/LINK #endif ], [db_cv_mutex="$db_cv_mutex/Sparc/gcc-assembly"]) # We're done testing for any hybrid mutex implementations. If we did # not find a pthreads-style mutex, but did find a test-and-set mutex, # we set db_cv_mutex to "no/XXX" -- clean that up. db_cv_mutex=`echo $db_cv_mutex | sed 's/^no\///'`fi# If we still don't have a mutex implementation yet, continue testing for a# test-and-set mutex implementation.# _lock_try/_lock_clear: Solaris# On Solaris systems without other mutex interfaces, DB uses the undocumented# _lock_try _lock_clear function calls instead of either the sema_trywait(3T)# or sema_wait(3T) function calls. This is because of problems in those# interfaces in some releases of the Solaris C library.if test "$db_cv_mutex" = no; thenAC_TRY_LINK([#include <sys/atomic.h>#include <sys/machlock.h>],[ typedef lock_t tsl_t; lock_t x; _lock_try(&x); _lock_clear(&x);], [db_cv_mutex=Solaris/_lock_try])fi# msemaphore: HPPA only# Try HPPA before general msem test, it needs special alignment.if test "$db_cv_mutex" = no; thenAC_TRY_LINK([#include <sys/mman.h>],[#if defined(__hppa) typedef msemaphore tsl_t; msemaphore x; msem_init(&x, 0); msem_lock(&x, 0); msem_unlock(&x, 0); exit(0);#else FAIL TO COMPILE/LINK#endif], [db_cv_mutex=HP/msem_init])fi# msemaphore: AIX, OSF/1if test "$db_cv_mutex" = no; thenAC_TRY_LINK([#include <sys/types.h>#include <sys/mman.h>],[ typedef msemaphore tsl_t; msemaphore x; msem_init(&x, 0); msem_lock(&x, 0); msem_unlock(&x, 0); exit(0);], [db_cv_mutex=UNIX/msem_init])fi# ReliantUNIXif test "$db_cv_mutex" = no; thenLIBS="$LIBS -lmproc"AC_TRY_LINK([#include <ulocks.h>],[ typedef spinlock_t tsl_t; spinlock_t x; initspin(&x, 1); cspinlock(&x); spinunlock(&x);], [db_cv_mutex=ReliantUNIX/initspin])LIBS="$orig_libs"fi# SCO: UnixWare has threads in libthread, but OpenServer doesn't.if test "$db_cv_mutex" = no; thenAC_TRY_COMPILE(,[#if defined(__USLC__) exit(0);#else FAIL TO COMPILE/LINK#endif], [db_cv_mutex=SCO/x86/cc-assembly])fi# abilock_t: SGIif test "$db_cv_mutex" = no; thenAC_TRY_LINK([#include <abi_mutex.h>],[ typedef abilock_t tsl_t; abilock_t x; init_lock(&x); acquire_lock(&x); release_lock(&x);], [db_cv_mutex=SGI/init_lock])fi# sema_t: Solaris# The sema_XXX calls do not work on Solaris 5.5. I see no reason to ever# turn this test on, unless we find some other platform that uses the old# POSIX.1 interfaces.if test "$db_cv_mutex" = DOESNT_WORK; thenAC_TRY_LINK([#include <synch.h>],[ typedef sema_t tsl_t; sema_t x; sema_init(&x, 1, USYNC_PROCESS, NULL); sema_wait(&x); sema_post(&x);], [db_cv_mutex=UNIX/sema_init])fi# _check_lock/_clear_lock: AIXif test "$db_cv_mutex" = no; thenAC_TRY_LINK([#include <sys/atomic_op.h>],[ int x; _check_lock(&x,0,1); _clear_lock(&x,0);], [db_cv_mutex=AIX/_check_lock])fi# _spin_lock_try/_spin_unlock: Apple/Darwinif test "$db_cv_mutex" = no; thenAC_TRY_LINK(,[ int x; _spin_lock_try(&x); _spin_unlock(&x);], [db_cv_mutex=Darwin/_spin_lock_try])fi# Tru64/ccif test "$db_cv_mutex" = no; thenAC_TRY_COMPILE(,[#if defined(__alpha) && defined(__DECC) exit(0);#else FAIL TO COMPILE/LINK#endif], [db_cv_mutex=Tru64/cc-assembly])fi# Alpha/gccif test "$db_cv_mutex" = no; thenAC_TRY_COMPILE(,[#if defined(__alpha) && defined(__GNUC__) exit(0);#else FAIL TO COMPILE/LINK
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -