blob: 7f5e8e157afdb597160d9cf0ed70f9991905d28d [file] [log] [blame]
dnl @synopsis XERCES_MUTEXMGR_SELECTION
dnl
dnl Determines the which XMLMutexMgr to use
dnl
dnl @category C
dnl @author James Berry
dnl @version 2005-05-25
dnl @license AllPermissive
dnl
dnl $Id$
AC_DEFUN([XERCES_MUTEXMGR_SELECTION],
[
######################################################
# Test for availability of each mutex manager on this host.
# For each mutex manager that's available, and hasn't been
# disabled, add it to our list. If the mutex manager has been
# explicitly "enable"d, then vote for it strongly, in upper
# case.
######################################################
ml_list=
AC_REQUIRE([XERCES_NO_THREADS])
AC_REQUIRE([ACX_PTHREAD])
AC_REQUIRE([AC_CXX_HAVE_STD_THREAD])
# Use Standard C++11 threads if available
list_add=
AC_MSG_CHECKING([whether we can support the Standard C++11 threads-based MutexMgr])
AS_IF([test x$xerces_cv_no_threads = xno && test x$ac_cv_cxx_have_std_thread = xyes], [
AC_ARG_ENABLE([mutexmgr-standard],
AS_HELP_STRING([--enable-mutexmgr-standard],
[Enable Standard C++11 threads mutex manager support]),
[AS_IF([test x"$enableval" = xyes],
[list_add=STANDARD])],
[list_add=standard])
])
AS_IF([test x"$list_add" != x],
[mm_list="$mm_list -$list_add-"; AC_MSG_RESULT(yes)],
[AC_MSG_RESULT(no)]
)
# Check for OS-specific mutex managers
case $host_os in
windows* | mingw*)
# Native Windows threads
list_add=
AC_MSG_CHECKING([whether we can support the Windows threads-based MutexMgr])
AS_IF([test x$xerces_cv_no_threads = xno], [
AC_ARG_ENABLE([mutexmgr-windows],
AS_HELP_STRING([--enable-mutexmgr-windows],
[Enable Windows mutex manager support]),
[AS_IF([test x"$enableval" = xyes],
[list_add=WINDOWS])],
[list_add=windows])
])
AS_IF([test x"$list_add" != x],
[mm_list="$mm_list -$list_add-"; AC_MSG_RESULT(yes)],
[AC_MSG_RESULT(no)]
)
break
;;
*)
# Native POSIX threads
list_add=
AC_MSG_CHECKING([whether we can support the POSIX threads (pthreads)-based MutexMgr])
AS_IF([test x$xerces_cv_no_threads = xno], [
AC_ARG_ENABLE([mutexmgr-posix],
AS_HELP_STRING([--enable-mutexmgr-posix],
[Enable POSIX mutex manager support]),
[AS_IF([test x"$enableval" = xyes],
[list_add=POSIX])],
[list_add=posix])
])
AS_IF([test x"$list_add" != x],
[mm_list="$mm_list -$list_add-"; AC_MSG_RESULT(yes)],
[AC_MSG_RESULT(no)]
)
break
;;
esac
# If no threads is specified, use the NoThread Mutex Mgr
list_add=
AC_MSG_CHECKING([whether we can support the NoThreads MutexMgr])
AC_ARG_ENABLE([mutexmgr-nothreads],
AS_HELP_STRING([--enable-mutexmgr-nothreads],
[Enable NoThreads mutex manager support (no threading)]),
[AS_IF([test x"$enableval" = xyes],
[list_add=NOTHREADS])],
[list_add=nothreads])
AS_IF([test x"$list_add" != x],
[mm_list="$mm_list -$list_add-"; AC_MSG_RESULT(yes)],
[AC_MSG_RESULT(no)]
)
######################################################
# Determine which mutex manager to use.
#
# We do this in two passes. Mutex managers that have been
# enabled with "yes", and which start out in upper case, get
# the top priority on the first pass. On the second pass, we
# consider those which are simply available, but which were
# not "disable"d (these won't even be in our list).
######################################################
mutexmgr=
az_lower=abcdefghijklmnopqrstuvwxyz
az_upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
AC_MSG_CHECKING([for which mutex manager to use (choices:$mm_list)])
for i in 1 2; do
# Swap upper/lower case in the mm_list. Cannot use tr ranges
# because of the portability issues.
#
mm_list=`echo $mm_list | tr "$az_lower$az_upper" "$az_upper$az_lower"`
# Check for each mutexmgr, in implicit rank order
case $mm_list in
*-standard-*)
mutexmgr=standard;
AC_DEFINE([XERCES_USE_MUTEXMGR_STD], 1, [Define to use the C++ standard mutex mgr (requires C++11)])
case $host_os in
mingw*)
CXXFLAGS="${CXXFLAGS} -mthreads"
;;
esac
if test "$acx_pthread_ok" = yes; then
LIBS="${LIBS} ${PTHREAD_LIBS}"
CXXFLAGS="${CXXFLAGS} ${PTHREAD_CFLAGS}"
fi
break
;;
*-posix-*)
mutexmgr=POSIX;
AC_DEFINE([XERCES_USE_MUTEXMGR_POSIX], 1, [Define to use the POSIX mutex mgr])
# Set additional flags for link and compile
LIBS="${LIBS} ${PTHREAD_LIBS}"
CXXFLAGS="${CXXFLAGS} ${PTHREAD_CFLAGS}"
break
;;
*-windows-*)
mutexmgr=Windows;
AC_DEFINE([XERCES_USE_MUTEXMGR_WINDOWS], 1, [Define to use the Windows mutex mgr])
case $host_os in
mingw*)
CXXFLAGS="${CXXFLAGS} -mthreads"
;;
esac
break
;;
*-nothreads-*)
mutexmgr=NoThreads
AC_DEFINE([XERCES_USE_MUTEXMGR_NOTHREAD], 1, [Define to use the NoThread mutex mgr])
break
;;
*)
AS_IF([test $i -eq 2], [
AC_MSG_RESULT([Xerces cannot function without mutex support. You may want to --disable-threads.])
]
)
;;
esac
done
if test x"$mutexmgr" != x; then
AC_MSG_RESULT($mutexmgr)
fi
# Define the auto-make conditionals which determine what actually gets compiled
# Note that these macros can't be executed conditionally, which is why they're here, not above.
AM_CONDITIONAL([XERCES_USE_MUTEXMGR_NOTHREAD], [test x"$mutexmgr" = xNoThreads])
AM_CONDITIONAL([XERCES_USE_MUTEXMGR_STD], [test x"$mutexmgr" = xstandard])
AM_CONDITIONAL([XERCES_USE_MUTEXMGR_POSIX], [test x"$mutexmgr" = xPOSIX])
AM_CONDITIONAL([XERCES_USE_MUTEXMGR_WINDOWS], [test x"$mutexmgr" = xWindows])
]
)