⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mutex.m4

📁 linux 下的源代码分析阅读器 red hat公司新版
💻 M4
📖 第 1 页 / 共 2 页
字号:
# $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 + -