📄 mutex.m4
字号:
dnl $Id: mutex.m4,v 11.20 2000/12/20 22:16:56 bostic Exp $dnl Figure out mutexes for this compiler/architecture.AC_DEFUN(AM_DEFINE_MUTEXES, [AC_CACHE_CHECK([for mutexes], db_cv_mutex, [dnldb_cv_mutex=noorig_libs=$LIBSdnl User-specified POSIX mutexes.dnldnl Assume that -lpthread exists when the user specifies POSIX mutexes. (Idnl only expect this option to be used on Solaris, which has -lpthread.)if test "$db_cv_posixmutexes" = yes; then db_cv_mutex="posix_only"fidnl User-specified UI mutexes.dnldnl Assume that -lthread exists when the user specifies UI mutexes. (I onlydnl expect this option to be used on Solaris, which has -lthread.)if test "$db_cv_uimutexes" = yes; then db_cv_mutex="ui_only"fidnl LWP threads: _lwp_XXXdnldnl Test for LWP threads before testing for UI/POSIX threads, we prefer themdnl on Solaris. There are two reasons: the Solaris C library has UI/POSIXdnl interface stubs, but they're broken, configuring them for inter-processdnl mutexes doesn't return an error, but it doesn't work either. Second,dnl there's a bug in SunOS 5.7 where applications get pwrite, not pwrite64,dnl if they load the C library before the appropriate threads library, e.g.,dnl tclsh using dlopen to load the DB library. Anyway, by using LWP threadsdnl we avoid answering lots of user questions, not to mention the bugs.if test "$db_cv_mutex" = no; thenAC_TRY_RUN([#include <synch.h>main(){ 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"])fidnl UI threads: thr_XXXdnldnl Try with and without the -lthread library.if test "$db_cv_mutex" = no -o "$db_cv_mutex" = "ui_only"; thenLIBS="-lthread $LIBS"AC_TRY_RUN([#include <thread.h>#include <synch.h>main(){ 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_RUN([#include <thread.h>#include <synch.h>main(){ 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])fidnl POSIX.1 pthreads: pthread_XXXdnldnl Try with and without the -lpthread library.if test "$db_cv_mutex" = no -o "$db_cv_mutex" = "posix_only"; thenAC_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="POSIX/pthreads"])fiif test "$db_cv_mutex" = no -o "$db_cv_mutex" = "posix_only"; thenLIBS="-lpthread $LIBS"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="POSIX/pthreads/library"])LIBS="$orig_libs"fiif test "$db_cv_mutex" = "posix_only"; then AC_MSG_ERROR([unable to find POSIX mutex interfaces])fidnl msemaphore: HPPA onlydnl Try HPPA before general msem test, it needs special alignment.if test "$db_cv_mutex" = no; thenAC_TRY_RUN([#include <sys/mman.h>main(){#if defined(__hppa) typedef msemaphore tsl_t; msemaphore x; msem_init(&x, 0); msem_lock(&x, 0); msem_unlock(&x, 0); exit(0);#else exit(1);#endif}], [db_cv_mutex="HP/msem_init"])fidnl msemaphore: AIX, OSF/1if test "$db_cv_mutex" = no; thenAC_TRY_RUN([#include <sys/types.h>#include <sys/mman.h>;main(){ 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"])fidnl 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"fidnl SCO: UnixWare has threads in libthread, but OpenServer doesn't.if test "$db_cv_mutex" = no; thenAC_TRY_RUN([main(){#if defined(__USLC__) exit(0);#endif exit(1);}], [db_cv_mutex="SCO/x86/cc-assembly"])fidnl 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"])fidnl sema_t: Solarisdnl The sema_XXX calls do not work on Solaris 5.5. I see no reason to everdnl turn this test on, unless we find some other platform that uses the olddnl 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"])fidnl _lock_try/_lock_clear: Solarisdnl On Solaris systems without Pthread or UI mutex interfaces, DB uses thednl undocumented _lock_try _lock_clear function calls instead of either thednl sema_trywait(3T) or sema_wait(3T) function calls. This is because ofdnl 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"])fidnl _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"])fidnl Alpha/gcc: OSF/1dnl The alpha/gcc code doesn't work as far as I know. There arednl two versions, both have problems. See Support Request #1583.if test "$db_cv_mutex" = DOESNT_WORK; thenAC_TRY_RUN([main(){#if defined(__alpha)#if defined(__GNUC__)exit(0);#endif#endifexit(1);}],[db_cv_mutex="ALPHA/gcc-assembly"])fidnl PaRisc/gcc: HP/UXif test "$db_cv_mutex" = no; thenAC_TRY_RUN([main(){#if defined(__hppa)#if defined(__GNUC__)exit(0);#endif#endifexit(1);}],[db_cv_mutex="HPPA/gcc-assembly"])fidnl PPC/gcc:if test "$db_cv_mutex" = no; thenAC_TRY_RUN([main(){#if defined(__powerpc__)#if defined(__GNUC__)exit(0);#endif#endifexit(1);}],[db_cv_mutex="PPC/gcc-assembly"])fidnl Sparc/gcc: SunOS, Solarisdnl The sparc/gcc code doesn't always work, specifically, I've seen assemblerdnl failures from the stbar instruction on SunOS 4.1.4/sun4c and gcc 2.7.2.2.if test "$db_cv_mutex" = DOESNT_WORK; thenAC_TRY_RUN([main(){#if defined(__sparc__)#if defined(__GNUC__) exit(0);#endif#endif exit(1);}], [db_cv_mutex="Sparc/gcc-assembly"])fidnl 68K/gcc: SunOSif test "$db_cv_mutex" = no; thenAC_TRY_RUN([main(){#if (defined(mc68020) || defined(sun3))#if defined(__GNUC__) exit(0);#endif#endif exit(1);}], [db_cv_mutex="68K/gcc-assembly"])fidnl x86/gcc: FreeBSD, NetBSD, BSD/OS, Linuxif test "$db_cv_mutex" = no; thenAC_TRY_RUN([main(){#if defined(i386) || defined(__i386__)#if defined(__GNUC__) exit(0);#endif#endif exit(1);}], [db_cv_mutex="x86/gcc-assembly"])fidnl ia86/gcc: Linuxif test "$db_cv_mutex" = no; thenAC_TRY_RUN([main(){#if defined(__ia64)#if defined(__GNUC__) exit(0);#endif#endif exit(1);}], [db_cv_mutex="ia64/gcc-assembly"])fidnl: uts/cc: UTSif test "$db_cv_mutex" = no; thenAC_TRY_RUN([main(){#if defined(_UTS) exit(0);#endif exit(1);}], [db_cv_mutex="UTS/cc-assembly"])fi])if test "$db_cv_mutex" = no; then AC_MSG_WARN( [THREAD MUTEXES NOT AVAILABLE FOR THIS COMPILER/ARCHITECTURE.]) ADDITIONAL_OBJS="mut_fcntl${o} $ADDITIONAL_OBJS"else AC_DEFINE(HAVE_MUTEX_THREADS)ficase "$db_cv_mutex" in68K/gcc-assembly) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_68K_GCC_ASSEMBLY);;AIX/_check_lock) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_AIX_CHECK_LOCK);;ALPHA/gcc-assembly) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_ALPHA_GCC_ASSEMBLY);;HP/msem_init) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_HPPA_MSEM_INIT);;HPPA/gcc-assembly) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_HPPA_GCC_ASSEMBLY);;ia64/gcc-assembly) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_IA64_GCC_ASSEMBLY);;POSIX/pthreads) ADDITIONAL_OBJS="mut_pthread${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_PTHREADS);;POSIX/pthreads/library) LIBS="-lpthread $LIBS" ADDITIONAL_OBJS="mut_pthread${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_PTHREADS);;PPC/gcc-assembly) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_PPC_GCC_ASSEMBLY);;ReliantUNIX/initspin) LIBS="$LIBS -lmproc" ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_RELIANTUNIX_INITSPIN);;SCO/x86/cc-assembly) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_SCO_X86_CC_ASSEMBLY);;SGI/init_lock) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_SGI_INIT_LOCK);;Solaris/_lock_try) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_SOLARIS_LOCK_TRY);;Solaris/lwp) ADDITIONAL_OBJS="mut_pthread${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_SOLARIS_LWP);;Sparc/gcc-assembly) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_SPARC_GCC_ASSEMBLY);;UI/threads) ADDITIONAL_OBJS="mut_pthread${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_UI_THREADS);;UI/threads/library) LIBS="-lthread $LIBS" ADDITIONAL_OBJS="mut_pthread${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_UI_THREADS);;UNIX/msem_init) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_MSEM_INIT);;UNIX/sema_init) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_SEMA_INIT);;UTS/cc-assembly) ADDITIONAL_OBJS="$ADDITIONAL_OBJS uts4.cc${o}" AC_DEFINE(HAVE_MUTEX_UTS_CC_ASSEMBLY);;x86/gcc-assembly) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS" AC_DEFINE(HAVE_MUTEX_X86_GCC_ASSEMBLY);;esac])dnl
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -