dnl Copyright (C) 2010 Vincent Torri <vtorri at univ-evry dot fr> dnl rwlock code added by Mike Blumenkrantz <mike at zentific dot com> dnl This code is public domain and can be freely used or copied. dnl Macro that check if POSIX or Win32 threads library is available or not. dnl Usage: EFL_CHECK_THREADS(ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]) dnl Call AC_SUBST(EFL_PTHREAD_CFLAGS) dnl Call AC_SUBST(EFL_PTHREAD_LIBS) dnl Defines EFL_HAVE_POSIX_THREADS or EFL_HAVE_WIN32_THREADS, and EFL_HAVE_THREADS AC_DEFUN([EFL_CHECK_THREADS], [ dnl configure option AC_ARG_ENABLE([posix-threads], [AC_HELP_STRING([--disable-posix-threads], [enable POSIX threads code @<:@default=auto@:>@])], [ if test "x${enableval}" = "xyes" ; then _efl_enable_posix_threads="yes" else _efl_enable_posix_threads="no" fi ], [_efl_enable_posix_threads="auto"]) AC_MSG_CHECKING([whether to build POSIX threads code]) AC_MSG_RESULT([${_efl_enable_posix_threads}]) AC_ARG_ENABLE([win32-threads], [AC_HELP_STRING([--disable-win32-threads], [enable Win32 threads code @<:@default=no@:>@])], [ if test "x${enableval}" = "xyes" ; then _efl_enable_win32_threads="yes" else _efl_enable_win32_threads="no" fi ], [_efl_enable_win32_threads="no"]) AC_MSG_CHECKING([whether to build Windows threads code]) AC_MSG_RESULT([${_efl_enable_win32_threads}]) dnl dnl * no + no dnl * yes + no : win32: error, other : pthread dnl * yes + yes : win32 : wthread, other : pthread dnl * no + yes : win32 : wthread, other : error if test "x${_efl_enable_posix_threads}" = "xyes" && test "x${_efl_enable_win32_threads}" = "xyes" ; then case "$host_os" in mingw*) _efl_enable_posix_threads=no ;; *) _efl_enable_win32_threads=no ;; esac fi if test "x${_efl_enable_win32_threads}" = "xyes" ; then case "$host_os" in mingw*) ;; *) AC_MSG_ERROR([Win32 threads support requested but non Windows system found.]) ;; esac fi if test "x${_efl_enable_posix_threads}" = "xyes" ; then case "$host_os" in mingw*) AC_MSG_ERROR([POSIX threads support requested but Windows system found.]) ;; *) ;; esac fi dnl check if the compiler supports POSIX threads case "$host_os" in mingw*) ;; solaris*) _efl_threads_cflags="-mt" _efl_threads_libs="-mt" ;; *) _efl_threads_cflags="-pthread" _efl_threads_libs="-pthread" ;; esac _efl_have_posix_threads="no" _efl_have_win32_threads="no" if test "x${_efl_enable_posix_threads}" = "xyes" || test "x${_efl_enable_posix_threads}" = "xauto" ; then SAVE_CFLAGS=${CFLAGS} CFLAGS="${CFLAGS} ${_efl_threads_cflags}" SAVE_LIBS=${LIBS} LIBS="${LIBS} ${_efl_threads_libs}" AC_LINK_IFELSE( [AC_LANG_PROGRAM([[ #include <pthread.h> ]], [[ pthread_t id; id = pthread_self(); ]])], [_efl_have_posix_threads="yes"], [_efl_have_posix_threads="no"]) CFLAGS=${SAVE_CFLAGS} LIBS=${SAVE_LIBS} fi AC_MSG_CHECKING([whether system support POSIX threads]) AC_MSG_RESULT([${_efl_have_posix_threads}]) if test "$x{_efl_enable_posix_threads}" = "xyes" && test "x${_efl_have_posix_threads}" = "xno"; then AC_MSG_ERROR([POSIX threads support requested but not found.]) fi EFL_PTHREAD_CFLAGS="" EFL_PTHREAD_LIBS="" if test "x${_efl_have_posix_threads}" = "xyes" ; then EFL_PTHREAD_CFLAGS=${_efl_threads_cflags} EFL_PTHREAD_LIBS=${_efl_threads_libs} fi AC_SUBST(EFL_PTHREAD_CFLAGS) AC_SUBST(EFL_PTHREAD_LIBS) _efl_enable_on_off_threads="no" AC_ARG_ENABLE([on-off-threads], [AC_HELP_STRING([--enable-on-off-threads], [only turn this on if you know what you are doing, and don't complain if the world freeze])], [_efl_enable_on_off_threads="${enableval}"]) have_on_off_threads="no" if test "x${_efl_enable_on_off_threads}" = "xyes"; then have_on_off_threads="yes" AC_DEFINE([EFL_ON_OFF_THREADS], [1], [make it possible to disable all locks]) fi AC_MSG_CHECKING([whether to turn on/off threads lock on demand]) AC_MSG_RESULT([${_efl_enable_on_off_threads}]) _efl_enable_debug_threads="no" AC_ARG_ENABLE([debug-threads], [AC_HELP_STRING([--enable-debug-threads], [disable assert when you forgot to call eina_threads_init])], [_efl_enable_debug_threads="${enableval}"]) have_debug_threads="no" if test "x${_efl_have_posix_threads}" = "xyes" -a "x${_efl_enable_debug_threads}" = "xyes"; then have_debug_threads="yes" AC_DEFINE([EFL_DEBUG_THREADS], [1], [Assert when forgot to call eina_threads_init]) fi if test "x${_efl_have_posix_threads}" = "xyes" ; then AC_DEFINE([EFL_HAVE_POSIX_THREADS], [1], [Define to mention that POSIX threads are supported]) fi if test "x${_efl_enable_win32_threads}" = "xyes" ; then _efl_have_win32_threads="yes" AC_DEFINE([EFL_HAVE_WIN32_THREADS], [1], [Define to mention that Win32 threads are supported]) fi if test "x${_efl_have_posix_threads}" = "xyes" || test "x${_efl_have_win32_threads}" = "xyes" ; then AC_DEFINE([EFL_HAVE_THREADS], [1], [Define to mention that POSIX or Win32 threads are supported]) fi AS_IF([test "x$_efl_have_posix_threads" = "xyes" || test "x$_efl_have_win32_threads" = "xyes"], [$1], [$2]) ]) dnl Usage: EFL_CHECK_SPINLOCK(ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]) dnl Defines EFL_HAVE_POSIX_THREADS_SPINLOCK AC_DEFUN([EFL_CHECK_SPINLOCK], [ dnl check if the compiler supports pthreads spinlock _efl_have_posix_threads_spinlock="no" if test "x${_efl_have_posix_threads}" = "xyes" ; then SAVE_CFLAGS=${CFLAGS} CFLAGS="${CFLAGS} ${EFL_PTHREAD_CFLAGS}" SAVE_LIBS=${LIBS} LIBS="${LIBS} ${EFL_PTHREAD_LIBS}" AC_LINK_IFELSE( [AC_LANG_PROGRAM([[ #include <pthread.h> ]], [[ pthread_spinlock_t lock; int res; res = pthread_spin_init(&lock, PTHREAD_PROCESS_PRIVATE); ]])], [_efl_have_posix_threads_spinlock="yes"], [_efl_have_posix_threads_spinlock="no"]) CFLAGS=${SAVE_CFLAGS} LIBS=${SAVE_LIBS} fi AC_MSG_CHECKING([whether to build POSIX threads spinlock code]) AC_MSG_RESULT([${_efl_have_posix_threads_spinlock}]) if test "x${_efl_enable_posix_threads}" = "xyes" && test "x${_efl_have_posix_threads_spinlock}" = "xno" ; then AC_MSG_WARN([POSIX threads support requested but spinlocks are not supported]) fi if test "x${_efl_have_posix_threads_spinlock}" = "xyes" ; then AC_DEFINE([EFL_HAVE_POSIX_THREADS_SPINLOCK], [1], [Define to mention that POSIX threads spinlocks are supported]) fi AS_IF([test "x$_efl_have_posix_threads_spinlock" = "xyes"], [$1], [$2]) ])