📄 mutex.ac
字号:
# $Id: mutex.ac,v 11.46 2004/07/09 16:23:19 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.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, [db_cv_mutex=noorig_libs=$LIBS# 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# applications 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. There's a bug in SunOS 5.7 where applications 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. By using LWP threads we# avoid answering lots of user questions, not to mention the bugs.## 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.## Try and link with a threads library if possible. The problem is the Solaris# C library has UI/POSIX interface stubs, but they're broken, configuring them# for inter-process mutexes doesn't return an error, but it doesn't work either.if test "$db_cv_posixmutexes" = yes; then db_cv_mutex="posix_only";fiif test "$db_cv_uimutexes" = yes; then db_cv_mutex="ui_only";fi# User-specified Win32 mutexes (MinGW build)if test "$db_cv_mingw" = "yes"; then db_cv_mutex=win32/gccfi# LWP threads: _lwp_XXXif test "$db_cv_mutex" = no; thenAC_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"fiif test "$db_cv_mutex" = no -o "$db_cv_mutex" = "posix_only"; then AM_PTHREADS_SHARED("POSIX/pthreads")fiif test "$db_cv_mutex" = "posix_only"; then AM_PTHREADS_PRIVATE("POSIX/pthreads/private")fiif test "$db_cv_mutex" = "posix_only"; then LIBS="$LIBS -lpthread" AM_PTHREADS_PRIVATE("POSIX/pthreads/library/private") LIBS="$orig_libs"fiif test "$db_cv_mutex" = "posix_only"; then AC_MSG_ERROR([unable to find POSIX 1003.1 mutex interfaces])fi# UI threads: thr_XXXif test "$db_cv_mutex" = no -o "$db_cv_mutex" = "ui_only"; thenLIBS="$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"fiif test "$db_cv_mutex" = no -o "$db_cv_mutex" = "ui_only"; thenAC_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"])fiif test "$db_cv_mutex" = "ui_only"; then AC_MSG_ERROR([unable to find UI mutex interfaces])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. (I plan to move directly to pthreads on Solaris.)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# _lock_try/_lock_clear: Solaris# On Solaris systems without Pthread or UI 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/machlock.h>],[ typedef lock_t tsl_t; lock_t x; _lock_try(&x); _lock_clear(&x);], [db_cv_mutex="Solaris/_lock_try"])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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -