#
# Begin pthreads checking.
#
# First, decide whether to use multithreading or not.
#
# Enable multithreading by default on systems where it is known
# to work well, and where debugging of multithreaded programs
# is supported.
#

AC_MSG_CHECKING(whether to build with thread support)

case $host in
*-dec-osf*)
       use_threads=true ;;
[*-solaris2.[0-6]])
       # Thread signals are broken on Solaris 2.6; they are sometimes
       # delivered to the wrong thread.
       use_threads=false ;;
*-solaris*)
       use_threads=true ;;
*-ibm-aix*)
       use_threads=true ;;
*-hp-hpux10*)
       use_threads=false ;;
*-hp-hpux11*)
       use_threads=true ;;
*-sgi-irix*)
       use_threads=true ;;
*-sco-sysv*uw*|*-*-sysv*UnixWare*)
       # UnixWare
       use_threads=false ;;
*-*-sysv*OpenUNIX*)
       # UnixWare
       use_threads=true ;;
*-netbsd*)
       if test -r /usr/lib/libpthread.so ; then
           use_threads=true
       else
           # Socket I/O optimizations introduced in 9.2 expose a
           # bug in unproven-pthreads; see PR #12650
           use_threads=false
       fi
       ;;
*-openbsd*)
       # OpenBSD users have reported that named dumps core on
       # startup when built with threads.
       use_threads=false ;;
*-freebsd*)
       use_threads=false ;;
*-bsdi[234]*)
       # Thread signals do not work reliably on some versions of BSD/OS.
       use_threads=false ;;
*-bsdi5*)
       use_threads=true ;;
*-linux*)
       # Threads are disabled on Linux by default because most
       # Linux kernels produce unusable core dumps from multithreaded
       # programs, and because of limitations in setuid().
       use_threads=false ;;
*)
       use_threads=false ;;
esac

AC_ARG_ENABLE(threads,
       [  --enable-threads     enable multithreading])
case "$enable_threads" in
       yes)
               use_threads=true
               ;;
       no)
               use_threads=false
               ;;
       '')
               # Use system-dependent default
               ;;
       *)
               AC_MSG_ERROR([--enable-threads takes yes or no])
               ;;
esac

if $use_threads
then
       AC_MSG_RESULT(yes)
else
       AC_MSG_RESULT(no)
fi

if $use_threads
then
       #
       # Search for / configure pthreads in a system-dependent fashion.
       #
       case "$host" in
         *-netbsd*)
               # NetBSD has multiple pthreads implementations.  The
               # recommended one to use is "unproven-pthreads".  The
               # older "mit-pthreads" may also work on some NetBSD
               # versions.  The PTL2 thread library does not
               # currently work with bind9, but can be chosen with
               # the --with-ptl2 option for those who wish to
               # experiment with it.
               CC="gcc"
               AC_MSG_CHECKING(which NetBSD thread library to use)

               AC_ARG_WITH(ptl2,
[  --with-ptl2          on NetBSD, use the ptl2 thread library (experimental)],
                   use_ptl2="$withval", use_ptl2="no")

               : ${LOCALBASE:=/usr/pkg}

               if test "X$use_ptl2" = "Xyes"
               then
                       AC_MSG_RESULT(PTL2)
                       AC_MSG_WARN(
[linking with PTL2 is highly experimental and not expected to work])
                       CC=ptlgcc
               else
                       if test -r /usr/lib/libpthread.so
                       then
                               AC_MSG_RESULT(native)
                               LIBS="-lpthread $LIBS"
                       else
                               if test ! -d $LOCALBASE/pthreads
                               then
                                       AC_MSG_RESULT(none)
                                       AC_MSG_ERROR("could not find thread libraries")
                               fi

                               if $use_threads
                               then
                                       AC_MSG_RESULT(mit-pthreads/unproven-pthreads)
                                       pkg="$LOCALBASE/pthreads"
                                       lib1="-L$pkg/lib -Wl,-R$pkg/lib"
                                       lib2="-lpthread -lm -lgcc -lpthread"
                                       LIBS="$lib1 $lib2 $LIBS"
                                       CPPFLAGS="$CPPFLAGS -I$pkg/include"
                                       STD_CINCLUDES="$STD_CINCLUDES -I$pkg/include"
                               fi
                       fi
               fi
               ;;
               *-freebsd*)
                       # We don't want to set -lpthread as that break
                       # the ability to choose threads library at final
                       # link time and is not valid for all architectures.

                       PTHREAD=
                       if test "X$GCC" = "Xyes"; then
                               saved_cc="$CC"
                               CC="$CC -pthread"
                               AC_MSG_CHECKING(for gcc -pthread support);
                               AC_TRY_LINK([#include <pthread.h>],
                                           [printf("%x\n", pthread_create);],
                                           PTHREAD="yes"
                                           AC_MSG_RESULT(yes),
                                           AC_MSG_RESULT(no))
                               CC="$saved_cc"
                       fi
                       if test "X$PTHREAD" != "Xyes"; then
                               AC_CHECK_LIB(pthread, pthread_create,,
                               AC_CHECK_LIB(thr, thread_create,,
                               AC_CHECK_LIB(c_r, pthread_create,,
                               AC_CHECK_LIB(c, pthread_create,,
                               AC_MSG_ERROR("could not find thread libraries")))))
                       fi
                       ;;
               *)
                       AC_CHECK_LIB(pthread, pthread_create,,
                               AC_CHECK_LIB(pthread, __pthread_create,,
                               AC_CHECK_LIB(pthread, __pthread_create_system,,
                               AC_CHECK_LIB(c_r, pthread_create,,
                               AC_CHECK_LIB(c, pthread_create,,
                               AC_MSG_ERROR("could not find thread libraries"))))))
               ;;
       esac
fi