diff --git a/CHANGES b/CHANGES index f032524123..eb27b9a471 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,5 @@ +5011. [func] Remove support for unthreaded named. [GL #478] + 5010. [func] New "validate-except" option specifies a list of domains beneath which DNSSEC validation should not be performed. [GL #237] diff --git a/aclocal.m4 b/aclocal.m4 index cd81b695a8..5a16166751 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -289,6 +289,7 @@ AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR m4_include([m4/ax_check_openssl.m4]) +m4_include([m4/ax_pthread.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) diff --git a/bin/dig/dig.c b/bin/dig/dig.c index e4955b358f..fbb0336396 100644 --- a/bin/dig/dig.c +++ b/bin/dig/dig.c @@ -263,7 +263,7 @@ received(unsigned int bytes, isc_sockaddr_t *from, dig_query_t *query) { printf(";; Query time: %ld msec\n", (long) diff / 1000); printf(";; SERVER: %s(%s)\n", fromtext, query->servname); time(&tnow); -#if defined(ISC_PLATFORM_USETHREADS) && !defined(WIN32) +#if !defined(WIN32) (void)localtime_r(&tnow, &tmnow); #else tmnow = *localtime(&tnow); diff --git a/bin/named/main.c b/bin/named/main.c index 963e3c2435..e193a50e42 100644 --- a/bin/named/main.c +++ b/bin/named/main.c @@ -720,11 +720,7 @@ parse_command_line(int argc, char *argv[]) { printf("linked to zlib version: %s\n", zlibVersion()); #endif -#ifdef ISC_PLATFORM_USETHREADS printf("threads support is enabled\n"); -#else - printf("threads support is disabled\n"); -#endif exit(0); case 'x': /* Obsolete. No longer in use. Ignore. */ @@ -776,7 +772,6 @@ create_managers(void) { INSIST(named_g_cpus_detected > 0); -#ifdef ISC_PLATFORM_USETHREADS if (named_g_cpus == 0) named_g_cpus = named_g_cpus_detected; isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, @@ -785,9 +780,6 @@ create_managers(void) { named_g_cpus_detected, named_g_cpus_detected == 1 ? "" : "s", named_g_cpus, named_g_cpus == 1 ? "" : "s"); -#else - named_g_cpus = 1; -#endif #ifdef WIN32 named_g_udpdisp = 1; #else @@ -800,12 +792,10 @@ create_managers(void) { if (named_g_udpdisp > named_g_cpus) named_g_udpdisp = named_g_cpus; #endif -#ifdef ISC_PLATFORM_USETHREADS isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, NAMED_LOGMODULE_SERVER, ISC_LOG_INFO, "using %u UDP listener%s per interface", named_g_udpdisp, named_g_udpdisp == 1 ? "" : "s"); -#endif result = isc_taskmgr_create(named_g_mctx, named_g_cpus, 0, &named_g_taskmgr); @@ -917,12 +907,10 @@ setup(void) { isc_mem_free(named_g_mctx, instance); #endif /* HAVE_LIBSCF */ -#ifdef ISC_PLATFORM_USETHREADS /* * Check for the number of cpu's before named_os_chroot(). */ named_g_cpus_detected = isc_os_ncpus(); -#endif named_os_chroot(named_g_chrootdir); diff --git a/bin/named/server.c b/bin/named/server.c index 2145578736..79e6dd2655 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -11252,7 +11252,6 @@ named_server_status(named_server_t *server, isc_buffer_t **text) { } CHECK(putstr(text, line)); -#ifdef ISC_PLATFORM_USETHREADS snprintf(line, sizeof(line), "CPUs found: %u\n", named_g_cpus_detected); CHECK(putstr(text, line)); @@ -11262,10 +11261,6 @@ named_server_status(named_server_t *server, isc_buffer_t **text) { snprintf(line, sizeof(line), "UDP listeners per interface: %u\n", named_g_udpdisp); CHECK(putstr(text, line)); -#else - snprintf(line, sizeof(line), "CPUs found: N/A (threads disabled)\n"); - CHECK(putstr(text, line)); -#endif snprintf(line, sizeof(line), "number of zones: %u (%u automatic)\n", zonecount, automatic); diff --git a/bin/tests/optional/rwlock_test.c b/bin/tests/optional/rwlock_test.c index a540e3cd50..c6686737dd 100644 --- a/bin/tests/optional/rwlock_test.c +++ b/bin/tests/optional/rwlock_test.c @@ -25,8 +25,6 @@ #define sleep(x) Sleep(1000 * x) #endif -#ifdef ISC_PLATFORM_USETHREADS - isc_rwlock_t lock; static isc_threadresult_t @@ -130,15 +128,3 @@ main(int argc, char *argv[]) { return (0); } - -#else - -int -main(int argc, char *argv[]) { - UNUSED(argc); - UNUSED(argv); - fprintf(stderr, "This test requires threads.\n"); - return(1); -} - -#endif diff --git a/config.h.in b/config.h.in index 9429c043eb..35ffb1141d 100644 --- a/config.h.in +++ b/config.h.in @@ -326,36 +326,21 @@ int sigwait(const unsigned int *set, int *sig); /* Define to 1 if you have the header file. */ #undef HAVE_KRB5_KRB5_H -/* Define to 1 if you have the `c' library (-lc). */ -#undef HAVE_LIBC - /* if system have backtrace function */ #undef HAVE_LIBCTRACE -/* Define to 1 if you have the `c_r' library (-lc_r). */ -#undef HAVE_LIBC_R - /* Define if libidn2 was found */ #undef HAVE_LIBIDN2 /* Define to 1 if you have the `nsl' library (-lnsl). */ #undef HAVE_LIBNSL -/* Define to 1 if you have the `pthread' library (-lpthread). */ -#undef HAVE_LIBPTHREAD - -/* Define to 1 if you have the `rt' library (-lrt). */ -#undef HAVE_LIBRT - /* Define to 1 if you have the `scf' library (-lscf). */ #undef HAVE_LIBSCF /* Define to 1 if you have the `socket' library (-lsocket). */ #undef HAVE_LIBSOCKET -/* Define to 1 if you have the `thr' library (-lthr). */ -#undef HAVE_LIBTHR - /* Define if libxml2 was found */ #undef HAVE_LIBXML2 @@ -389,12 +374,24 @@ int sigwait(const unsigned int *set, int *sig); /* define if OpenSSL supports Ed25519 */ #undef HAVE_OPENSSL_ED25519 +/* Define if you have POSIX threads libraries and header files. */ +#undef HAVE_PTHREAD + +/* Define to 1 if you have the `pthread_attr_getstacksize' function. */ +#undef HAVE_PTHREAD_ATTR_GETSTACKSIZE + +/* Define to 1 if you have the `pthread_attr_setstacksize' function. */ +#undef HAVE_PTHREAD_ATTR_SETSTACKSIZE + /* Support for PTHREAD_MUTEX_ADAPTIVE_NP */ #undef HAVE_PTHREAD_MUTEX_ADAPTIVE_NP /* Define to 1 if you have the header file. */ #undef HAVE_PTHREAD_NP_H +/* Have PTHREAD_PRIO_INHERIT. */ +#undef HAVE_PTHREAD_PRIO_INHERIT + /* Define to 1 if you have the `pthread_setname_np' function. */ #undef HAVE_PTHREAD_SETNAME_NP @@ -443,6 +440,9 @@ int sigwait(const unsigned int *set, int *sig); /* Define to 1 if you have the `setresuid' function. */ #undef HAVE_SETRESUID +/* Define to 1 if you have the `sigwait' function. */ +#undef HAVE_SIGWAIT + /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H @@ -589,6 +589,10 @@ int sigwait(const unsigned int *set, int *sig); (O_NDELAY/O_NONBLOCK). */ #undef PORT_NONBLOCK +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +#undef PTHREAD_CREATE_JOINABLE + /* The size of `void *', as computed by sizeof. */ #undef SIZEOF_VOID_P diff --git a/configure b/configure index 49385509b3..87b09c1a66 100755 --- a/configure +++ b/configure @@ -805,11 +805,11 @@ OPENSSL_INCLUDES OPENSSL_LIBS OPENSSL_CFLAGS INSTALL_LIBRARY -ISC_THREAD_DIR -THREADOPTSRCS -THREADOPTOBJS -ISC_PLATFORM_USETHREADS ALWAYS_DEFINES +PTHREAD_CFLAGS +PTHREAD_LIBS +PTHREAD_CC +ax_pthread_config CHECK_DSA GEOIPLINKOBJS GEOIPLINKSRCS @@ -959,7 +959,6 @@ enable_kqueue enable_epoll enable_devpoll with_geoip -enable_threads with_locktype with_libtool with_openssl @@ -1662,7 +1661,6 @@ Optional Features: --enable-kqueue use BSD kqueue when available [default=yes] --enable-epoll use Linux epoll when available [default=auto] --enable-devpoll use /dev/poll when available [default=yes] - --enable-threads enable multithreading --enable-native-pkcs11 use native PKCS11 for public-key crypto [default=no] --enable-largefile 64-bit file support --enable-backtrace log stack backtrace on abort [default=yes] @@ -12092,11 +12090,6 @@ $as_echo "#define ENABLE_AFL 1" >>confdefs.h fi -case "$enable_afl" in -yes) - LIBS="$LIBS -lpthread" - ;; -esac # # Make very sure that these are the first files processed by @@ -14855,825 +14848,722 @@ fi done -# -# 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. -# -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with thread support" >&5 -$as_echo_n "checking whether to build with thread support... " >&6; } -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[1234].*) - # NetBSD earlier than NetBSD 5.0 has poor pthreads. - # Don't use it by default. - use_threads=false ;; -*-netbsd*) - use_threads=true ;; -*-openbsd*) - # OpenBSD users have reported that named dumps core on - # startup when built with threads. - use_threads=false ;; -*-freebsd[1234567].*) - # Threads are broken at least up to FreeBSD 4.11. - # FreeBSD 5, 6 and 7 we have never officially supported threads - # on. YMMV - use_threads=false ;; -*-freebsd*) - use_threads=true ;; -*-bsdi[234]*) - # Thread signals do not work reliably on some versions of BSD/OS. - use_threads=false ;; -*-bsdi5*) - use_threads=true ;; -*-linux*) - use_threads=true ;; -*-darwin[123456789].*) - use_threads=false ;; -*-darwin*.*) - use_threads=true ;; -*) - use_threads=true ;; -esac -# Check whether --enable-threads was given. -if test "${enable_threads+set}" = set; then : - enableval=$enable_threads; + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on Tru64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then + ax_pthread_save_CC="$CC" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + if test "x$PTHREAD_CC" != "x"; then : + CC="$PTHREAD_CC" +fi + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5 +$as_echo_n "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_join (); +int +main () +{ +return pthread_join (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +$as_echo "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = "xno"; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + CC="$ax_pthread_save_CC" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" fi -case "$enable_threads" in - yes) - use_threads=true - ;; - no) - use_threads=false - ;; - '') - # Use system-dependent default - ;; - *) - as_fn_error $? "--enable-threads takes yes or no" "$LINENO" 5 - ;; +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 +# (Note: HP C rejects this with "bad form for `-t' option") +# -pthreads: Solaris/gcc (Note: HP C also rejects) +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads and +# -D_REENTRANT too), HP C (must be checked before -lpthread, which +# is present but should not be used directly; and before -mthreads, +# because the compiler interprets this as "-mt" + "-hreads") +# -mthreads: Mingw32/gcc, Lynx/gcc +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case $host_os in + + freebsd*) + + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) + # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) + + ax_pthread_flags="-kthread lthread $ax_pthread_flags" + ;; + + hpux*) + + # From the cc(1) man page: "[-mt] Sets various -D flags to enable + # multi-threading and also sets -lpthread." + + ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" + ;; + + openedition*) + + # IBM z/OS requires a feature-test macro to be defined in order to + # enable POSIX threads at all, so give the user a hint if this is + # not set. (We don't define these ourselves, as they can affect + # other portions of the system API in unpredictable ways.) + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) + AX_PTHREAD_ZOS_MISSING +# endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 +$as_echo "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} +fi +rm -f conftest* + + ;; + + solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (N.B.: The stubs are missing + # pthread_cleanup_push, or rather a function called by this macro, + # so we could check for that, but who knows whether they'll stub + # that too in a future libc.) So we'll check first for the + # standard Solaris way of linking pthreads (-mt -lpthread). + + ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags" + ;; esac -if $use_threads -then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) + +if test "x$GCC" = "xyes"; then : + ax_pthread_flags="-pthread -pthreads $ax_pthread_flags" +fi + +# The presence of a feature test macro requesting re-entrant function +# definitions is, on some systems, a strong hint that pthreads support is +# correctly enabled + +case $host_os in + darwin* | hpux* | linux* | osf* | solaris*) + ax_pthread_check_macro="_REENTRANT" + ;; + + aix*) + ax_pthread_check_macro="_THREAD_SAFE" + ;; + + *) + ax_pthread_check_macro="--" + ;; +esac +if test "x$ax_pthread_check_macro" = "x--"; then : + ax_pthread_check_cond=0 else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + ax_pthread_check_cond="!defined($ax_pthread_check_macro)" +fi + +# Are we compiling with Clang? + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5 +$as_echo_n "checking whether $CC is Clang... " >&6; } +if ${ax_cv_PTHREAD_CLANG+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_PTHREAD_CLANG=no + # Note that Autoconf sets GCC=yes for Clang as well as GCC + if test "x$GCC" = "xyes"; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ +# if defined(__clang__) && defined(__llvm__) + AX_PTHREAD_CC_IS_CLANG +# endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1; then : + ax_cv_PTHREAD_CLANG=yes +fi +rm -f conftest* + + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 +$as_echo "$ax_cv_PTHREAD_CLANG" >&6; } +ax_pthread_clang="$ax_cv_PTHREAD_CLANG" + +ax_pthread_clang_warning=no + +# Clang needs special handling, because older versions handle the -pthread +# option in a rather... idiosyncratic way + +if test "x$ax_pthread_clang" = "xyes"; then + + # Clang takes -pthread; it has never supported any other flag + + # (Note 1: This will need to be revisited if a system that Clang + # supports has POSIX threads in a separate library. This tends not + # to be the way of modern systems, but it's conceivable.) + + # (Note 2: On some systems, notably Darwin, -pthread is not needed + # to get POSIX threads support; the API is always present and + # active. We could reasonably leave PTHREAD_CFLAGS empty. But + # -pthread does define _REENTRANT, and while the Darwin headers + # ignore this macro, third-party headers might not.) + + PTHREAD_CFLAGS="-pthread" + PTHREAD_LIBS= + + ax_pthread_ok=yes + + # However, older versions of Clang make a point of warning the user + # that, in an invocation where only linking and no compilation is + # taking place, the -pthread option has no effect ("argument unused + # during compilation"). They expect -pthread to be passed in only + # when source code is being compiled. + # + # Problem is, this is at odds with the way Automake and most other + # C build frameworks function, which is that the same flags used in + # compilation (CFLAGS) are also used in linking. Many systems + # supported by AX_PTHREAD require exactly this for POSIX threads + # support, and in fact it is often not straightforward to specify a + # flag that is used only in the compilation phase and not in + # linking. Such a scenario is extremely rare in practice. + # + # Even though use of the -pthread flag in linking would only print + # a warning, this can be a nuisance for well-run software projects + # that build with -Werror. So if the active version of Clang has + # this misfeature, we search for an option to squash it. + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5 +$as_echo_n "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; } +if ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown + # Create an alternate version of $ac_link that compiles and + # links in two steps (.c -> .o, .o -> exe) instead of one + # (.c -> exe), because the warning occurs only in the second + # step + ax_pthread_save_ac_link="$ac_link" + ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' + ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` + ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" + ax_pthread_save_CFLAGS="$CFLAGS" + for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do + if test "x$ax_pthread_try" = "xunknown"; then : + break +fi + CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" + ac_link="$ax_pthread_save_ac_link" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(void){return 0;} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_link="$ax_pthread_2step_ac_link" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(void){return 0;} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + ac_link="$ax_pthread_save_ac_link" + CFLAGS="$ax_pthread_save_CFLAGS" + if test "x$ax_pthread_try" = "x"; then : + ax_pthread_try=no +fi + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 +$as_echo "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } + + case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in + no | unknown) ;; + *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; + esac + +fi # $ax_pthread_clang = yes + +if test "x$ax_pthread_ok" = "xno"; then +for ax_pthread_try_flag in $ax_pthread_flags; do + + case $ax_pthread_try_flag in + none) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 +$as_echo_n "checking whether pthreads work without any flags... " >&6; } + ;; + + -mt,pthread) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with -mt -lpthread" >&5 +$as_echo_n "checking whether pthreads work with -mt -lpthread... " >&6; } + PTHREAD_CFLAGS="-mt" + PTHREAD_LIBS="-lpthread" + ;; + + -*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5 +$as_echo_n "checking whether pthreads work with $ax_pthread_try_flag... " >&6; } + PTHREAD_CFLAGS="$ax_pthread_try_flag" + ;; + + pthread-config) + # Extract the first word of "pthread-config", so it can be a program name with args. +set dummy pthread-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ax_pthread_config+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ax_pthread_config"; then + ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ax_pthread_config="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" +fi +fi +ax_pthread_config=$ac_cv_prog_ax_pthread_config +if test -n "$ax_pthread_config"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 +$as_echo "$ax_pthread_config" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -if $use_threads -then - # - # Search for / configure pthreads in a system-dependent fashion. - # - case "$host" in - *-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" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc -pthread support" >&5 -$as_echo_n "checking for gcc -pthread support... " >&6; }; - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + if test "x$ax_pthread_config" = "xno"; then : + continue +fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5 +$as_echo_n "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } + PTHREAD_LIBS="-l$ax_pthread_try_flag" + ;; + esac + + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +# if $ax_pthread_check_cond +# error "$ax_pthread_check_macro must be defined" +# endif + static void routine(void *a) { a = 0; } + static void *start_routine(void *a) { return a; } +int +main () +{ +pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +$as_echo "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = "xyes"; then : + break +fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$ax_pthread_ok" = "xyes"; then + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 +$as_echo_n "checking for joinable pthread attribute... " >&6; } +if ${ax_cv_PTHREAD_JOINABLE_ATTR+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_PTHREAD_JOINABLE_ATTR=unknown + for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { -printf("%x\n", pthread_create); +int attr = $ax_pthread_attr; return attr /* ; */ ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - PTHREAD="yes" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 +$as_echo "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } + if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ + test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ + test "x$ax_pthread_joinable_attr_defined" != "xyes"; then : + +cat >>confdefs.h <<_ACEOF +#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR +_ACEOF + + ax_pthread_joinable_attr_defined=yes + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5 +$as_echo_n "checking whether more special flags are required for pthreads... " >&6; } +if ${ax_cv_PTHREAD_SPECIAL_FLAGS+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_PTHREAD_SPECIAL_FLAGS=no + case $host_os in + solaris*) + ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" + ;; + esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 +$as_echo "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } + if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ + test "x$ax_pthread_special_flags_added" != "xyes"; then : + PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" + ax_pthread_special_flags_added=yes +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 +$as_echo_n "checking for PTHREAD_PRIO_INHERIT... " >&6; } +if ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +int i = PTHREAD_PRIO_INHERIT; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_PTHREAD_PRIO_INHERIT=yes +else + ax_cv_PTHREAD_PRIO_INHERIT=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 +$as_echo "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } + if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ + test "x$ax_pthread_prio_inherit_defined" != "xyes"; then : + +$as_echo "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h + + ax_pthread_prio_inherit_defined=yes + +fi + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + # More AIX lossage: compile with *_r variant + if test "x$GCC" != "xyes"; then + case $host_os in + aix*) + case "x/$CC" in #( + x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) : + #handle absolute path differently from PATH based program lookup + case "x$CC" in #( + x/*) : + if as_fn_executable_p ${CC}_r; then : + PTHREAD_CC="${CC}_r" +fi ;; #( + *) : + for ac_prog in ${CC}_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_PTHREAD_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$PTHREAD_CC"; then + ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PTHREAD_CC=$ac_cv_prog_PTHREAD_CC +if test -n "$PTHREAD_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 +$as_echo "$PTHREAD_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - CC="$saved_cc" - fi - if test "X$PTHREAD" != "Xyes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 -$as_echo_n "checking for pthread_create in -lpthread... " >&6; } -if ${ac_cv_lib_pthread_pthread_create+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpthread $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_create (); -int -main () -{ -return pthread_create (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_pthread_pthread_create=yes + + test -n "$PTHREAD_CC" && break +done +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" + ;; +esac ;; #( + *) : + ;; +esac + ;; + esac + fi +fi + +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" + + + + + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test "x$ax_pthread_ok" = "xyes"; then + +$as_echo "#define HAVE_PTHREAD 1" >>confdefs.h + + : else - ac_cv_lib_pthread_pthread_create=no + ax_pthread_ok=no + fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5 -$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } -if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then : +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +LIBS="$PTHREAD_LIBS $LIBS" +CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +CC="$PTHREAD_CC" + +# +# We'd like to use sigwait() too +# +for ac_func in sigwait pthread_attr_getstacksize pthread_attr_setstacksize +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF -#define HAVE_LIBPTHREAD 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF - LIBS="-lpthread $LIBS" - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for thread_create in -lthr" >&5 -$as_echo_n "checking for thread_create in -lthr... " >&6; } -if ${ac_cv_lib_thr_thread_create+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lthr $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char thread_create (); -int -main () -{ -return thread_create (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_thr_thread_create=yes -else - ac_cv_lib_thr_thread_create=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_thr_thread_create" >&5 -$as_echo "$ac_cv_lib_thr_thread_create" >&6; } -if test "x$ac_cv_lib_thr_thread_create" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBTHR 1 -_ACEOF - - LIBS="-lthr $LIBS" - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lc_r" >&5 -$as_echo_n "checking for pthread_create in -lc_r... " >&6; } -if ${ac_cv_lib_c_r_pthread_create+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lc_r $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_create (); -int -main () -{ -return pthread_create (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_c_r_pthread_create=yes -else - ac_cv_lib_c_r_pthread_create=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_create" >&5 -$as_echo "$ac_cv_lib_c_r_pthread_create" >&6; } -if test "x$ac_cv_lib_c_r_pthread_create" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBC_R 1 -_ACEOF - - LIBS="-lc_r $LIBS" - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lc" >&5 -$as_echo_n "checking for pthread_create in -lc... " >&6; } -if ${ac_cv_lib_c_pthread_create+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lc $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_create (); -int -main () -{ -return pthread_create (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_c_pthread_create=yes -else - ac_cv_lib_c_pthread_create=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_pthread_create" >&5 -$as_echo "$ac_cv_lib_c_pthread_create" >&6; } -if test "x$ac_cv_lib_c_pthread_create" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBC 1 -_ACEOF - - LIBS="-lc $LIBS" - -else - as_fn_error $? "\"could not find thread libraries\"" "$LINENO" 5 -fi - -fi - -fi - -fi - - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 -$as_echo_n "checking for pthread_create in -lpthread... " >&6; } -if ${ac_cv_lib_pthread_pthread_create+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpthread $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_create (); -int -main () -{ -return pthread_create (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_pthread_pthread_create=yes -else - ac_cv_lib_pthread_pthread_create=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5 -$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } -if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBPTHREAD 1 -_ACEOF - - LIBS="-lpthread $LIBS" - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_create in -lpthread" >&5 -$as_echo_n "checking for __pthread_create in -lpthread... " >&6; } -if ${ac_cv_lib_pthread___pthread_create+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpthread $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char __pthread_create (); -int -main () -{ -return __pthread_create (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_pthread___pthread_create=yes -else - ac_cv_lib_pthread___pthread_create=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread___pthread_create" >&5 -$as_echo "$ac_cv_lib_pthread___pthread_create" >&6; } -if test "x$ac_cv_lib_pthread___pthread_create" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBPTHREAD 1 -_ACEOF - - LIBS="-lpthread $LIBS" - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_create_system in -lpthread" >&5 -$as_echo_n "checking for __pthread_create_system in -lpthread... " >&6; } -if ${ac_cv_lib_pthread___pthread_create_system+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpthread $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char __pthread_create_system (); -int -main () -{ -return __pthread_create_system (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_pthread___pthread_create_system=yes -else - ac_cv_lib_pthread___pthread_create_system=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread___pthread_create_system" >&5 -$as_echo "$ac_cv_lib_pthread___pthread_create_system" >&6; } -if test "x$ac_cv_lib_pthread___pthread_create_system" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBPTHREAD 1 -_ACEOF - - LIBS="-lpthread $LIBS" - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lc_r" >&5 -$as_echo_n "checking for pthread_create in -lc_r... " >&6; } -if ${ac_cv_lib_c_r_pthread_create+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lc_r $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_create (); -int -main () -{ -return pthread_create (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_c_r_pthread_create=yes -else - ac_cv_lib_c_r_pthread_create=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_create" >&5 -$as_echo "$ac_cv_lib_c_r_pthread_create" >&6; } -if test "x$ac_cv_lib_c_r_pthread_create" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBC_R 1 -_ACEOF - - LIBS="-lc_r $LIBS" - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lc" >&5 -$as_echo_n "checking for pthread_create in -lc... " >&6; } -if ${ac_cv_lib_c_pthread_create+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lc $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_create (); -int -main () -{ -return pthread_create (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_c_pthread_create=yes -else - ac_cv_lib_c_pthread_create=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_pthread_create" >&5 -$as_echo "$ac_cv_lib_c_pthread_create" >&6; } -if test "x$ac_cv_lib_c_pthread_create" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBC 1 -_ACEOF - - LIBS="-lc $LIBS" - -else - as_fn_error $? "\"could not find thread libraries\"" "$LINENO" 5 -fi - -fi - -fi - -fi - -fi - - ;; - esac -fi - -if $use_threads -then - if test "X$GCC" = "Xyes"; then - case "$host" in - *-freebsd*) - CC="$CC -pthread" - CCOPT="$CCOPT -pthread" - CCNOOPT="$CCNOOPT -pthread" - STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE" - ;; - *-openbsd*) - CC="$CC -pthread" - CCOPT="$CCOPT -pthread" - CCNOOPT="$CCNOOPT -pthread" - ;; - *-solaris*) - LIBS="$LIBS -lthread" - ;; - *-ibm-aix*) - STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE" - ;; - esac - else - case $host in - *-dec-osf*) - CC="$CC -pthread" - CCOPT="$CCOPT -pthread" - CCNOOPT="$CCNOOPT -pthread" - ;; - *-solaris*) - CC="$CC -mt" - CCOPT="$CCOPT -mt" - CCNOOPT="$CCNOOPT -mt" - ;; - *-ibm-aix*) - STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE" - ;; - *-sco-sysv*uw*|*-*-sysv*UnixWare*) - CC="$CC -Kthread" - CCOPT="$CCOPT -Kthread" - CCNOOPT="$CCNOOPT -Kthread" - ;; - *-*-sysv*OpenUNIX*) - CC="$CC -Kpthread" - CCOPT="$CCOPT -Kpthread" - CCNOOPT="$CCNOOPT -Kpthread" - ;; - esac - fi - ALWAYS_DEFINES="-D_REENTRANT" - ISC_PLATFORM_USETHREADS="#define ISC_PLATFORM_USETHREADS 1" - THREADOPTOBJS='${THREADOPTOBJS}' - THREADOPTSRCS='${THREADOPTSRCS}' - thread_dir=pthreads - # - # We'd like to use sigwait() too - # - ac_fn_c_check_func "$LINENO" "sigwait" "ac_cv_func_sigwait" -if test "x$ac_cv_func_sigwait" = xyes; then : - $as_echo "#define HAVE_SIGWAIT 1" >>confdefs.h - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigwait in -lc" >&5 -$as_echo_n "checking for sigwait in -lc... " >&6; } -if ${ac_cv_lib_c_sigwait+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lc $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char sigwait (); -int -main () -{ -return sigwait (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_c_sigwait=yes -else - ac_cv_lib_c_sigwait=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_sigwait" >&5 -$as_echo "$ac_cv_lib_c_sigwait" >&6; } -if test "x$ac_cv_lib_c_sigwait" = xyes; then : - $as_echo "#define HAVE_SIGWAIT 1" >>confdefs.h - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigwait in -lpthread" >&5 -$as_echo_n "checking for sigwait in -lpthread... " >&6; } -if ${ac_cv_lib_pthread_sigwait+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpthread $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char sigwait (); -int -main () -{ -return sigwait (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_pthread_sigwait=yes -else - ac_cv_lib_pthread_sigwait=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_sigwait" >&5 -$as_echo "$ac_cv_lib_pthread_sigwait" >&6; } -if test "x$ac_cv_lib_pthread_sigwait" = xyes; then : - $as_echo "#define HAVE_SIGWAIT 1" >>confdefs.h - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _Psigwait in -lpthread" >&5 -$as_echo_n "checking for _Psigwait in -lpthread... " >&6; } -if ${ac_cv_lib_pthread__Psigwait+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpthread $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char _Psigwait (); -int -main () -{ -return _Psigwait (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_pthread__Psigwait=yes -else - ac_cv_lib_pthread__Psigwait=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread__Psigwait" >&5 -$as_echo "$ac_cv_lib_pthread__Psigwait" >&6; } -if test "x$ac_cv_lib_pthread__Psigwait" = xyes; then : - $as_echo "#define HAVE_SIGWAIT 1" >>confdefs.h - -fi - -fi - -fi - -fi - - - ac_fn_c_check_func "$LINENO" "pthread_attr_getstacksize" "ac_cv_func_pthread_attr_getstacksize" -if test "x$ac_cv_func_pthread_attr_getstacksize" = xyes; then : - $as_echo "#define HAVE_PTHREAD_ATTR_GETSTACKSIZE 1" >>confdefs.h - -fi - - - ac_fn_c_check_func "$LINENO" "pthread_attr_setstacksize" "ac_cv_func_pthread_attr_setstacksize" -if test "x$ac_cv_func_pthread_attr_setstacksize" = xyes; then : - $as_echo "#define HAVE_PTHREAD_ATTR_SETSTACKSIZE 1" >>confdefs.h - fi +done # Check whether --with-locktype was given. if test "${with_locktype+set}" = set; then : - withval=$with_locktype; locktype="$withval" + withval=$with_locktype; else - locktype="adaptive" + with_locktype="adaptive" fi - case "$locktype" in - adaptive) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_MUTEX_ADAPTIVE_NP" >&5 -$as_echo_n "checking for PTHREAD_MUTEX_ADAPTIVE_NP... " >&6; } +case $with_locktype in #( + adaptive) : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_MUTEX_ADAPTIVE_NP" >&5 +$as_echo_n "checking for PTHREAD_MUTEX_ADAPTIVE_NP... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - #ifndef _GNU_SOURCE - #define _GNU_SOURCE - #endif - #include + #ifndef _GNU_SOURCE + #define _GNU_SOURCE + #endif + #include int main () { - return (PTHREAD_MUTEX_ADAPTIVE_NP); + return (PTHREAD_MUTEX_ADAPTIVE_NP); + ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: using adaptive lock type" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: using adaptive lock type" >&5 $as_echo "using adaptive lock type" >&6; } $as_echo "#define HAVE_PTHREAD_MUTEX_ADAPTIVE_NP 1" >>confdefs.h else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: using standard lock type" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: using standard lock type" >&5 $as_echo "using standard lock type" >&6; } -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ;; - standard) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: using standard lock type" >&5 -$as_echo "using standard lock type" >&6; } - ;; - *) - as_fn_error $? "You must specify \"adaptive\" or \"standard\" for --with-locktype." "$LINENO" 5 - ;; - esac - for ac_header in sched.h +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; #( + standard) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: using standard lock type" >&5 +$as_echo "using standard lock type" >&6; } ;; #( + *) : + as_fn_error $? "You must specify \"adaptive\" or \"standard\" for --with-locktype." "$LINENO" 5 + ;; +esac + +for ac_header in sched.h do : ac_fn_c_check_header_mongrel "$LINENO" "sched.h" "ac_cv_header_sched_h" "$ac_includes_default" if test "x$ac_cv_header_sched_h" = xyes; then : @@ -15686,15 +15576,12 @@ fi done - case "$host" in - *solaris-*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5 -$as_echo_n "checking for sched_yield in -lrt... " >&6; } -if ${ac_cv_lib_rt_sched_yield+:} false; then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sched_yield" >&5 +$as_echo_n "checking for library containing sched_yield... " >&6; } +if ${ac_cv_search_sched_yield+:} false; then : $as_echo_n "(cached) " >&6 else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lrt $LIBS" + ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15713,30 +15600,39 @@ return sched_yield (); return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_rt_sched_yield=yes -else - ac_cv_lib_rt_sched_yield=no +for ac_lib in '' rt; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_sched_yield=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS + conftest$ac_exeext + if ${ac_cv_search_sched_yield+:} false; then : + break fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sched_yield" >&5 -$as_echo "$ac_cv_lib_rt_sched_yield" >&6; } -if test "x$ac_cv_lib_rt_sched_yield" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBRT 1 -_ACEOF +done +if ${ac_cv_search_sched_yield+:} false; then : - LIBS="-lrt $LIBS" +else + ac_cv_search_sched_yield=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sched_yield" >&5 +$as_echo "$ac_cv_search_sched_yield" >&6; } +ac_res=$ac_cv_search_sched_yield +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi - ;; - esac - - for ac_func in sched_yield pthread_yield pthread_yield_np +for ac_func in sched_yield pthread_yield pthread_yield_np do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" @@ -15749,15 +15645,15 @@ fi done +# +# Additional OS-specific issues related to pthreads and sigwait. +# +case "$host" in # - # Additional OS-specific issues related to pthreads and sigwait. + # One more place to look for sigwait. # - case "$host" in - # - # One more place to look for sigwait. - # - *-freebsd*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigwait in -lc_r" >&5 + *-freebsd*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigwait in -lc_r" >&5 $as_echo_n "checking for sigwait in -lc_r... " >&6; } if ${ac_cv_lib_c_r_sigwait+:} false; then : $as_echo_n "(cached) " >&6 @@ -15798,60 +15694,60 @@ if test "x$ac_cv_lib_c_r_sigwait" = xyes; then : fi - case $host in - *-freebsd5.[012]|*-freebsd5.[012].*);; - *-freebsd5.[3456789]|*-freebsd5.[3456789].*) - $as_echo "#define NEED_PTHREAD_SCOPE_SYSTEM 1" >>confdefs.h - - ;; - *-freebsd6.*) - $as_echo "#define NEED_PTHREAD_SCOPE_SYSTEM 1" >>confdefs.h - - ;; - esac - ;; - # - # BSDI 3.0 through 4.0.1 needs pthread_init() to be - # called before certain pthreads calls. This is deprecated - # in BSD/OS 4.1. - # - *-bsdi3.*|*-bsdi4.0*) - $as_echo "#define NEED_PTHREAD_INIT 1" >>confdefs.h + case $host in + *-freebsd5.[012]|*-freebsd5.[012].*);; + *-freebsd5.[3456789]|*-freebsd5.[3456789].*) + $as_echo "#define NEED_PTHREAD_SCOPE_SYSTEM 1" >>confdefs.h ;; - # - # LinuxThreads requires some changes to the way we - # deal with signals. - # - *-linux*) - $as_echo "#define HAVE_LINUXTHREADS 1" >>confdefs.h + *-freebsd6.*) + $as_echo "#define NEED_PTHREAD_SCOPE_SYSTEM 1" >>confdefs.h ;; - # - # Ensure the right sigwait() semantics on Solaris and make - # sure we call pthread_setconcurrency. - # - *-solaris*) - $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + esac + ;; + # + # BSDI 3.0 through 4.0.1 needs pthread_init() to be + # called before certain pthreads calls. This is deprecated + # in BSD/OS 4.1. + # + *-bsdi3.*|*-bsdi4.0*) + $as_echo "#define NEED_PTHREAD_INIT 1" >>confdefs.h - ac_fn_c_check_func "$LINENO" "pthread_setconcurrency" "ac_cv_func_pthread_setconcurrency" + ;; + # + # LinuxThreads requires some changes to the way we + # deal with signals. + # + *-linux*) + $as_echo "#define HAVE_LINUXTHREADS 1" >>confdefs.h + + ;; + # + # Ensure the right sigwait() semantics on Solaris and make + # sure we call pthread_setconcurrency. + # + *-solaris*) + $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + + ac_fn_c_check_func "$LINENO" "pthread_setconcurrency" "ac_cv_func_pthread_setconcurrency" if test "x$ac_cv_func_pthread_setconcurrency" = xyes; then : $as_echo "#define CALL_PTHREAD_SETCONCURRENCY 1" >>confdefs.h fi - ;; - # - # UnixWare does things its own way. - # - *-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*) - $as_echo "#define HAVE_UNIXWARE_SIGWAIT 1" >>confdefs.h + ;; + # + # UnixWare does things its own way. + # + *-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*) + $as_echo "#define HAVE_UNIXWARE_SIGWAIT 1" >>confdefs.h - ;; - esac + ;; +esac - # Look for functions relating to thread naming - for ac_func in pthread_setname_np pthread_set_name_np +# Look for functions relating to thread naming +for ac_func in pthread_setname_np pthread_set_name_np do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" @@ -15863,7 +15759,7 @@ _ACEOF fi done - for ac_header in pthread_np.h +for ac_header in pthread_np.h do : ac_fn_c_check_header_compile "$LINENO" "pthread_np.h" "ac_cv_header_pthread_np_h" "#include " @@ -15877,29 +15773,16 @@ fi done - # - # Look for sysconf to allow detection of the number of processors. - # - ac_fn_c_check_func "$LINENO" "sysconf" "ac_cv_func_sysconf" +# +# Look for sysconf to allow detection of the number of processors. +# +ac_fn_c_check_func "$LINENO" "sysconf" "ac_cv_func_sysconf" if test "x$ac_cv_func_sysconf" = xyes; then : $as_echo "#define HAVE_SYSCONF 1" >>confdefs.h fi -else - ISC_PLATFORM_USETHREADS="#undef ISC_PLATFORM_USETHREADS" - thread_dir=nothreads - THREADOPTOBJS="" - THREADOPTSRCS="" - ALWAYS_DEFINES="" -fi - - - - - -ISC_THREAD_DIR=$thread_dir { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libtool" >&5 @@ -17531,23 +17414,6 @@ if test "x$ac_cv_func_getc_unlocked" = xyes; then : fi -# -# Indicate what the final decision was regarding threads. -# -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with threads" >&5 -$as_echo_n "checking whether to build with threads... " >&6; } -if $use_threads; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - -# -# End of pthreads stuff. -# - # # Large File # @@ -20287,14 +20153,12 @@ fi # # CPU relax (for spin locks) # -if $use_threads -then - case "$host" in - i[3456]86-*) - # x86_32 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if asm(\"rep; nop\"); works" >&5 +case "$host" in +i[3456]86-*) + # x86_32 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if asm(\"rep; nop\"); works" >&5 $as_echo_n "checking if asm(\"rep; nop\"); works... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -20308,18 +20172,18 @@ _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } - ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")" + ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ;; - x86_64-*|amd64-*) - # x86_64 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if asm(\"rep; nop\"); works" >&5 + ;; +x86_64-*|amd64-*) + # x86_64 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if asm(\"rep; nop\"); works" >&5 $as_echo_n "checking if asm(\"rep; nop\"); works... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -20333,18 +20197,18 @@ _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } - ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")" + ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ;; - ia64-*) - # ia64 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if asm(\"hint @pause\"); works" >&5 + ;; +ia64-*) + # ia64 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if asm(\"hint @pause\"); works" >&5 $as_echo_n "checking if asm(\"hint @pause\"); works... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -20358,28 +20222,28 @@ _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } - ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"hint @pause\")" + ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"hint @pause\")" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ;; - sparc-*) - # sparc - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if cpu_relax(); or __cpu_relax(); works" >&5 + ;; +sparc-*) + # sparc + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if cpu_relax(); or __cpu_relax(); works" >&5 $as_echo_n "checking if cpu_relax(); or __cpu_relax(); works... " >&6; } - ac_fn_c_check_func "$LINENO" "cpu_relax" "ac_cv_func_cpu_relax" + ac_fn_c_check_func "$LINENO" "cpu_relax" "ac_cv_func_cpu_relax" if test "x$ac_cv_func_cpu_relax" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } - ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP cpu_relax()" + ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP cpu_relax()" else ac_fn_c_check_func "$LINENO" "__cpu_relax" "ac_cv_func___cpu_relax" if test "x$ac_cv_func___cpu_relax" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } - ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP __cpu_relax()" + ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP __cpu_relax()" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } @@ -20387,9 +20251,8 @@ fi fi - ;; - esac -fi + ;; +esac @@ -20702,9 +20565,6 @@ DNSTAPOBJS= DNSTAPTARGETS= DNSTAP_PB_C_H= if test "x$use_dnstap" != "xno"; then - if ! $use_threads; then - as_fn_error $? "Dnstap requires threads." "$LINENO" 5 - fi # Check whether --with-protobuf-c was given. if test "${with_protobuf_c+set}" = set; then : @@ -22392,9 +22252,6 @@ fi case "$use_tuning" in large) - if ! $use_threads; then - as_fn_error $? "Large-system tuning requires threads." "$LINENO" 5 - fi $as_echo "#define TUNE_LARGE 1" >>confdefs.h @@ -23806,7 +23663,7 @@ ac_config_commands="$ac_config_commands chmod" # elsewhere if there's a good reason for doing so. # -ac_config_files="$ac_config_files make/Makefile make/mkdep Makefile bin/Makefile bin/check/Makefile bin/confgen/Makefile bin/confgen/unix/Makefile bin/delv/Makefile bin/dig/Makefile bin/dnssec/Makefile bin/named/Makefile bin/named/unix/Makefile bin/nsupdate/Makefile bin/pkcs11/Makefile bin/python/Makefile bin/python/isc/Makefile bin/python/isc/utils.py bin/python/isc/tests/Makefile bin/python/dnssec-checkds.py bin/python/dnssec-coverage.py bin/python/dnssec-keymgr.py bin/python/isc/__init__.py bin/python/isc/checkds.py bin/python/isc/coverage.py bin/python/isc/dnskey.py bin/python/isc/eventlist.py bin/python/isc/keydict.py bin/python/isc/keyevent.py bin/python/isc/keymgr.py bin/python/isc/keyseries.py bin/python/isc/keyzone.py bin/python/isc/policy.py bin/python/isc/rndc.py bin/python/isc/tests/dnskey_test.py bin/python/isc/tests/policy_test.py bin/rndc/Makefile bin/tests/Makefile bin/tests/headerdep_test.sh bin/tests/optional/Makefile bin/tests/pkcs11/Makefile bin/tests/pkcs11/benchmarks/Makefile bin/tests/system/Makefile bin/tests/system/conf.sh bin/tests/system/dlz/prereq.sh bin/tests/system/dlzexternal/Makefile bin/tests/system/dlzexternal/ns1/dlzs.conf bin/tests/system/dyndb/Makefile bin/tests/system/dyndb/driver/Makefile bin/tests/system/inline/checkdsa.sh bin/tests/system/pipelined/Makefile bin/tests/system/rndc/Makefile bin/tests/system/rpz/Makefile bin/tests/system/rsabigexponent/Makefile bin/tests/system/tkey/Makefile bin/tests/virtual-time/Makefile bin/tests/virtual-time/conf.sh bin/tools/Makefile contrib/scripts/check-secure-delegation.pl contrib/scripts/zone-edit.sh doc/Makefile doc/arm/Makefile doc/arm/noteversion.xml doc/arm/pkgversion.xml doc/arm/releaseinfo.xml doc/doxygen/Doxyfile doc/doxygen/Makefile doc/doxygen/doxygen-input-filter doc/misc/Makefile doc/tex/Makefile doc/tex/armstyle.sty doc/xsl/Makefile doc/xsl/isc-docbook-chunk.xsl doc/xsl/isc-docbook-html.xsl doc/xsl/isc-manpage.xsl doc/xsl/isc-notes-html.xsl isc-config.sh lib/Makefile lib/bind9/Makefile lib/bind9/include/Makefile lib/bind9/include/bind9/Makefile lib/dns/Makefile lib/dns/include/Makefile lib/dns/include/dns/Makefile lib/dns/include/dst/Makefile lib/dns/tests/Makefile lib/irs/Makefile lib/irs/include/Makefile lib/irs/include/irs/Makefile lib/irs/include/irs/netdb.h lib/irs/include/irs/platform.h lib/irs/tests/Makefile lib/isc/$arch/Makefile lib/isc/$arch/include/Makefile lib/isc/$arch/include/isc/Makefile lib/isc/$thread_dir/Makefile lib/isc/$thread_dir/include/Makefile lib/isc/$thread_dir/include/isc/Makefile lib/isc/Makefile lib/isc/include/Makefile lib/isc/include/isc/Makefile lib/isc/include/isc/platform.h lib/isc/include/pk11/Makefile lib/isc/include/pkcs11/Makefile lib/isc/tests/Makefile lib/isc/nls/Makefile lib/isc/unix/Makefile lib/isc/unix/include/Makefile lib/isc/unix/include/isc/Makefile lib/isc/unix/include/pkcs11/Makefile lib/isccc/Makefile lib/isccc/include/Makefile lib/isccc/include/isccc/Makefile lib/isccfg/Makefile lib/isccfg/include/Makefile lib/isccfg/include/isccfg/Makefile lib/isccfg/tests/Makefile lib/ns/Makefile lib/ns/include/Makefile lib/ns/include/ns/Makefile lib/ns/tests/Makefile lib/samples/Makefile lib/samples/Makefile-postinstall unit/Makefile unit/unittest.sh" +ac_config_files="$ac_config_files make/Makefile make/mkdep Makefile bin/Makefile bin/check/Makefile bin/confgen/Makefile bin/confgen/unix/Makefile bin/delv/Makefile bin/dig/Makefile bin/dnssec/Makefile bin/named/Makefile bin/named/unix/Makefile bin/nsupdate/Makefile bin/pkcs11/Makefile bin/python/Makefile bin/python/isc/Makefile bin/python/isc/utils.py bin/python/isc/tests/Makefile bin/python/dnssec-checkds.py bin/python/dnssec-coverage.py bin/python/dnssec-keymgr.py bin/python/isc/__init__.py bin/python/isc/checkds.py bin/python/isc/coverage.py bin/python/isc/dnskey.py bin/python/isc/eventlist.py bin/python/isc/keydict.py bin/python/isc/keyevent.py bin/python/isc/keymgr.py bin/python/isc/keyseries.py bin/python/isc/keyzone.py bin/python/isc/policy.py bin/python/isc/rndc.py bin/python/isc/tests/dnskey_test.py bin/python/isc/tests/policy_test.py bin/rndc/Makefile bin/tests/Makefile bin/tests/headerdep_test.sh bin/tests/optional/Makefile bin/tests/pkcs11/Makefile bin/tests/pkcs11/benchmarks/Makefile bin/tests/system/Makefile bin/tests/system/conf.sh bin/tests/system/dlz/prereq.sh bin/tests/system/dlzexternal/Makefile bin/tests/system/dlzexternal/ns1/dlzs.conf bin/tests/system/dyndb/Makefile bin/tests/system/dyndb/driver/Makefile bin/tests/system/inline/checkdsa.sh bin/tests/system/pipelined/Makefile bin/tests/system/rndc/Makefile bin/tests/system/rpz/Makefile bin/tests/system/rsabigexponent/Makefile bin/tests/system/tkey/Makefile bin/tests/virtual-time/Makefile bin/tests/virtual-time/conf.sh bin/tools/Makefile contrib/scripts/check-secure-delegation.pl contrib/scripts/zone-edit.sh doc/Makefile doc/arm/Makefile doc/arm/noteversion.xml doc/arm/pkgversion.xml doc/arm/releaseinfo.xml doc/doxygen/Doxyfile doc/doxygen/Makefile doc/doxygen/doxygen-input-filter doc/misc/Makefile doc/tex/Makefile doc/tex/armstyle.sty doc/xsl/Makefile doc/xsl/isc-docbook-chunk.xsl doc/xsl/isc-docbook-html.xsl doc/xsl/isc-manpage.xsl doc/xsl/isc-notes-html.xsl isc-config.sh lib/Makefile lib/bind9/Makefile lib/bind9/include/Makefile lib/bind9/include/bind9/Makefile lib/dns/Makefile lib/dns/include/Makefile lib/dns/include/dns/Makefile lib/dns/include/dst/Makefile lib/dns/tests/Makefile lib/irs/Makefile lib/irs/include/Makefile lib/irs/include/irs/Makefile lib/irs/include/irs/netdb.h lib/irs/include/irs/platform.h lib/irs/tests/Makefile lib/isc/$arch/Makefile lib/isc/$arch/include/Makefile lib/isc/$arch/include/isc/Makefile lib/isc/pthreads/Makefile lib/isc/pthreads/include/Makefile lib/isc/pthreads/include/isc/Makefile lib/isc/Makefile lib/isc/include/Makefile lib/isc/include/isc/Makefile lib/isc/include/isc/platform.h lib/isc/include/pk11/Makefile lib/isc/include/pkcs11/Makefile lib/isc/tests/Makefile lib/isc/nls/Makefile lib/isc/unix/Makefile lib/isc/unix/include/Makefile lib/isc/unix/include/isc/Makefile lib/isc/unix/include/pkcs11/Makefile lib/isccc/Makefile lib/isccc/include/Makefile lib/isccc/include/isccc/Makefile lib/isccfg/Makefile lib/isccfg/include/Makefile lib/isccfg/include/isccfg/Makefile lib/isccfg/tests/Makefile lib/ns/Makefile lib/ns/include/Makefile lib/ns/include/ns/Makefile lib/ns/tests/Makefile lib/samples/Makefile lib/samples/Makefile-postinstall unit/Makefile unit/unittest.sh" # @@ -24902,9 +24759,9 @@ do "lib/isc/$arch/Makefile") CONFIG_FILES="$CONFIG_FILES lib/isc/$arch/Makefile" ;; "lib/isc/$arch/include/Makefile") CONFIG_FILES="$CONFIG_FILES lib/isc/$arch/include/Makefile" ;; "lib/isc/$arch/include/isc/Makefile") CONFIG_FILES="$CONFIG_FILES lib/isc/$arch/include/isc/Makefile" ;; - "lib/isc/$thread_dir/Makefile") CONFIG_FILES="$CONFIG_FILES lib/isc/$thread_dir/Makefile" ;; - "lib/isc/$thread_dir/include/Makefile") CONFIG_FILES="$CONFIG_FILES lib/isc/$thread_dir/include/Makefile" ;; - "lib/isc/$thread_dir/include/isc/Makefile") CONFIG_FILES="$CONFIG_FILES lib/isc/$thread_dir/include/isc/Makefile" ;; + "lib/isc/pthreads/Makefile") CONFIG_FILES="$CONFIG_FILES lib/isc/pthreads/Makefile" ;; + "lib/isc/pthreads/include/Makefile") CONFIG_FILES="$CONFIG_FILES lib/isc/pthreads/include/Makefile" ;; + "lib/isc/pthreads/include/isc/Makefile") CONFIG_FILES="$CONFIG_FILES lib/isc/pthreads/include/isc/Makefile" ;; "lib/isc/Makefile") CONFIG_FILES="$CONFIG_FILES lib/isc/Makefile" ;; "lib/isc/include/Makefile") CONFIG_FILES="$CONFIG_FILES lib/isc/include/Makefile" ;; "lib/isc/include/isc/Makefile") CONFIG_FILES="$CONFIG_FILES lib/isc/include/isc/Makefile" ;; @@ -26154,11 +26011,8 @@ report() { echo "Configuration summary:" echo "-------------------------------------------------------------------------------" echo "Optional features enabled:" - if $use_threads; then - echo " Multiprocessing support (--enable-threads)" - if test "yes" = "$enable_full_report" -o "standard" = "$locktype"; then - echo " Mutex lock type: $locktype" - fi + if test "yes" = "$enable_full_report" -o "standard" = "$locktype"; then + echo " Mutex lock type: $locktype" fi test "large" = "$use_tuning" && echo " Large-system tuning (--with-tuning)" test "no" = "$use_dnstap" || \ @@ -26223,7 +26077,6 @@ report() { echo "-------------------------------------------------------------------------------" echo "Features disabled or unavailable on this platform:" - $use_threads || echo " Multiprocessing support (--enable-threads)" test "no" = "$enable_ipv6" -o "no" = "$found_ipv6" && \ echo " IPv6 support (--enable-ipv6)" test "large" = "$use_tuning" || echo " Large-system tuning (--with-tuning)" diff --git a/configure.in b/configure.in index 9dcd1ff814..95bc7bcac7 100644 --- a/configure.in +++ b/configure.in @@ -105,11 +105,6 @@ AC_ARG_ENABLE(afl, [default=no]]), [AC_DEFINE([ENABLE_AFL], [1], [Define to enable American Fuzzy Lop test harness])]) -case "$enable_afl" in -yes) - LIBS="$LIBS -lpthread" - ;; -esac # # Make very sure that these are the first files processed by @@ -842,195 +837,113 @@ AC_SUBST(CHECK_DSA) # AC_CHECK_FUNCS(arc4random arc4random_buf arc4random_uniform getrandom) -sinclude(config.threads.in)dnl +AX_PTHREAD -if $use_threads -then - if test "X$GCC" = "Xyes"; then - case "$host" in - *-freebsd*) - CC="$CC -pthread" - CCOPT="$CCOPT -pthread" - CCNOOPT="$CCNOOPT -pthread" - STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE" - ;; - *-openbsd*) - CC="$CC -pthread" - CCOPT="$CCOPT -pthread" - CCNOOPT="$CCNOOPT -pthread" - ;; - *-solaris*) - LIBS="$LIBS -lthread" - ;; - *-ibm-aix*) - STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE" - ;; - esac - else +LIBS="$PTHREAD_LIBS $LIBS" +CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +CC="$PTHREAD_CC" + +# +# We'd like to use sigwait() too +# +AC_CHECK_FUNCS([sigwait pthread_attr_getstacksize pthread_attr_setstacksize]) + +AC_ARG_WITH([locktype], + AS_HELP_STRING([--with-locktype=ARG], + [Specify mutex lock type + (adaptive or standard)]), + [], [with_locktype="adaptive"]) + +AS_CASE([$with_locktype], + [adaptive],[ + AC_MSG_CHECKING([for PTHREAD_MUTEX_ADAPTIVE_NP]) + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[ + #ifndef _GNU_SOURCE + #define _GNU_SOURCE + #endif + #include + ]], + [[ + return (PTHREAD_MUTEX_ADAPTIVE_NP); + ]] + )], + [AC_MSG_RESULT([using adaptive lock type]) + AC_DEFINE([HAVE_PTHREAD_MUTEX_ADAPTIVE_NP], 1, + [Support for PTHREAD_MUTEX_ADAPTIVE_NP]) ], + [AC_MSG_RESULT([using standard lock type])] + )], + [standard],[AC_MSG_RESULT([using standard lock type])], + [AC_MSG_ERROR([You must specify "adaptive" or "standard" for --with-locktype.])] + ) + +AC_CHECK_HEADERS([sched.h]) + +AC_SEARCH_LIBS([sched_yield],[rt]) +AC_CHECK_FUNCS([sched_yield pthread_yield pthread_yield_np]) + +# +# Additional OS-specific issues related to pthreads and sigwait. +# +case "$host" in + # + # One more place to look for sigwait. + # + *-freebsd*) + AC_CHECK_LIB(c_r, sigwait, AC_DEFINE(HAVE_SIGWAIT),) case $host in - *-dec-osf*) - CC="$CC -pthread" - CCOPT="$CCOPT -pthread" - CCNOOPT="$CCNOOPT -pthread" + *-freebsd5.[[012]]|*-freebsd5.[[012]].*);; + *-freebsd5.[[3456789]]|*-freebsd5.[[3456789]].*) + AC_DEFINE(NEED_PTHREAD_SCOPE_SYSTEM) ;; - *-solaris*) - CC="$CC -mt" - CCOPT="$CCOPT -mt" - CCNOOPT="$CCNOOPT -mt" - ;; - *-ibm-aix*) - STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE" - ;; - *-sco-sysv*uw*|*-*-sysv*UnixWare*) - CC="$CC -Kthread" - CCOPT="$CCOPT -Kthread" - CCNOOPT="$CCNOOPT -Kthread" - ;; - *-*-sysv*OpenUNIX*) - CC="$CC -Kpthread" - CCOPT="$CCOPT -Kpthread" - CCNOOPT="$CCNOOPT -Kpthread" + *-freebsd6.*) + AC_DEFINE(NEED_PTHREAD_SCOPE_SYSTEM) ;; esac - fi - ALWAYS_DEFINES="-D_REENTRANT" - ISC_PLATFORM_USETHREADS="#define ISC_PLATFORM_USETHREADS 1" - THREADOPTOBJS='${THREADOPTOBJS}' - THREADOPTSRCS='${THREADOPTSRCS}' - thread_dir=pthreads - # - # We'd like to use sigwait() too - # - AC_CHECK_FUNC(sigwait, - AC_DEFINE(HAVE_SIGWAIT), - AC_CHECK_LIB(c, sigwait, - AC_DEFINE(HAVE_SIGWAIT), - AC_CHECK_LIB(pthread, sigwait, - AC_DEFINE(HAVE_SIGWAIT), - AC_CHECK_LIB(pthread, _Psigwait, - AC_DEFINE(HAVE_SIGWAIT),)))) - - AC_CHECK_FUNC(pthread_attr_getstacksize, - AC_DEFINE(HAVE_PTHREAD_ATTR_GETSTACKSIZE),) - - AC_CHECK_FUNC(pthread_attr_setstacksize, - AC_DEFINE(HAVE_PTHREAD_ATTR_SETSTACKSIZE),) - - AC_ARG_WITH(locktype, - AS_HELP_STRING([--with-locktype=ARG], - [Specify mutex lock type - (adaptive or standard)]), - locktype="$withval", locktype="adaptive") - - case "$locktype" in - adaptive) - AC_MSG_CHECKING([for PTHREAD_MUTEX_ADAPTIVE_NP]) - - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #ifndef _GNU_SOURCE - #define _GNU_SOURCE - #endif - #include - ]], [[ - return (PTHREAD_MUTEX_ADAPTIVE_NP); - ]])], - [ AC_MSG_RESULT(using adaptive lock type) - AC_DEFINE([HAVE_PTHREAD_MUTEX_ADAPTIVE_NP], 1, - [Support for PTHREAD_MUTEX_ADAPTIVE_NP]) ], - [ AC_MSG_RESULT(using standard lock type) ]) - ;; - standard) - AC_MSG_RESULT(using standard lock type) - ;; - *) - AC_MSG_ERROR([You must specify "adaptive" or "standard" for --with-locktype.]) - ;; - esac - - AC_CHECK_HEADERS(sched.h) - - case "$host" in - *solaris-*) - AC_CHECK_LIB(rt, sched_yield) ;; - esac - - AC_CHECK_FUNCS(sched_yield pthread_yield pthread_yield_np) - # - # Additional OS-specific issues related to pthreads and sigwait. + # BSDI 3.0 through 4.0.1 needs pthread_init() to be + # called before certain pthreads calls. This is deprecated + # in BSD/OS 4.1. # - case "$host" in - # - # One more place to look for sigwait. - # - *-freebsd*) - AC_CHECK_LIB(c_r, sigwait, AC_DEFINE(HAVE_SIGWAIT),) - case $host in - *-freebsd5.[[012]]|*-freebsd5.[[012]].*);; - *-freebsd5.[[3456789]]|*-freebsd5.[[3456789]].*) - AC_DEFINE(NEED_PTHREAD_SCOPE_SYSTEM) - ;; - *-freebsd6.*) - AC_DEFINE(NEED_PTHREAD_SCOPE_SYSTEM) - ;; - esac - ;; - # - # BSDI 3.0 through 4.0.1 needs pthread_init() to be - # called before certain pthreads calls. This is deprecated - # in BSD/OS 4.1. - # - *-bsdi3.*|*-bsdi4.0*) - AC_DEFINE(NEED_PTHREAD_INIT) - ;; - # - # LinuxThreads requires some changes to the way we - # deal with signals. - # - *-linux*) - AC_DEFINE(HAVE_LINUXTHREADS) - ;; - # - # Ensure the right sigwait() semantics on Solaris and make - # sure we call pthread_setconcurrency. - # - *-solaris*) - AC_DEFINE(_POSIX_PTHREAD_SEMANTICS) - AC_CHECK_FUNC(pthread_setconcurrency, - AC_DEFINE(CALL_PTHREAD_SETCONCURRENCY)) - ;; - # - # UnixWare does things its own way. - # - *-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*) - AC_DEFINE(HAVE_UNIXWARE_SIGWAIT) - ;; - esac - - # Look for functions relating to thread naming - AC_CHECK_FUNCS(pthread_setname_np pthread_set_name_np) - AC_CHECK_HEADERS([pthread_np.h], [], [], [#include ]) - + *-bsdi3.*|*-bsdi4.0*) + AC_DEFINE(NEED_PTHREAD_INIT) + ;; # - # Look for sysconf to allow detection of the number of processors. + # LinuxThreads requires some changes to the way we + # deal with signals. # - AC_CHECK_FUNC(sysconf, AC_DEFINE(HAVE_SYSCONF),) + *-linux*) + AC_DEFINE(HAVE_LINUXTHREADS) + ;; + # + # Ensure the right sigwait() semantics on Solaris and make + # sure we call pthread_setconcurrency. + # + *-solaris*) + AC_DEFINE(_POSIX_PTHREAD_SEMANTICS) + AC_CHECK_FUNC(pthread_setconcurrency, + AC_DEFINE(CALL_PTHREAD_SETCONCURRENCY)) + ;; + # + # UnixWare does things its own way. + # + *-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*) + AC_DEFINE(HAVE_UNIXWARE_SIGWAIT) + ;; +esac -else - ISC_PLATFORM_USETHREADS="#undef ISC_PLATFORM_USETHREADS" - thread_dir=nothreads - THREADOPTOBJS="" - THREADOPTSRCS="" - ALWAYS_DEFINES="" -fi +# Look for functions relating to thread naming +AC_CHECK_FUNCS([pthread_setname_np pthread_set_name_np]) +AC_CHECK_HEADERS([pthread_np.h], [], [], [#include ]) + +# +# Look for sysconf to allow detection of the number of processors. +# +AC_CHECK_FUNC(sysconf, AC_DEFINE(HAVE_SYSCONF),) AC_SUBST(ALWAYS_DEFINES) -AC_SUBST(ISC_PLATFORM_USETHREADS) -AC_SUBST(THREADOPTOBJS) -AC_SUBST(THREADOPTSRCS) -ISC_THREAD_DIR=$thread_dir -AC_SUBST(ISC_THREAD_DIR) AC_MSG_CHECKING(for libtool) AC_ARG_WITH(libtool, AS_HELP_STRING([--with-libtool], [use GNU libtool]), @@ -1807,20 +1720,6 @@ AC_CHECK_LIB(scf, smf_enable_instance) AC_CHECK_FUNC(flockfile, AC_DEFINE(HAVE_FLOCKFILE),) AC_CHECK_FUNC(getc_unlocked, AC_DEFINE(HAVE_GETCUNLOCKED),) -# -# Indicate what the final decision was regarding threads. -# -AC_MSG_CHECKING(whether to build with threads) -if $use_threads; then - AC_MSG_RESULT(yes) -else - AC_MSG_RESULT(no) -fi - -# -# End of pthreads stuff. -# - # # Large File # @@ -3304,52 +3203,49 @@ fi # # CPU relax (for spin locks) # -if $use_threads -then - case "$host" in - [i[3456]86-*]) - # x86_32 - AC_MSG_CHECKING([if asm("rep; nop"); works]) - AC_TRY_COMPILE(,[asm("rep; nop");], - [AC_MSG_RESULT(yes) - ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"], - [AC_MSG_RESULT(no)], - [AC_MSG_RESULT([cross compile, assume yes]) - ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"]) - ;; - x86_64-*|amd64-*) - # x86_64 - AC_MSG_CHECKING([if asm("rep; nop"); works]) - AC_TRY_COMPILE(,[asm("rep; nop");], - [AC_MSG_RESULT(yes) - ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"], - [AC_MSG_RESULT(no)], - [AC_MSG_RESULT([cross compile, assume yes]) - ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"]) - ;; - ia64-*) - # ia64 - AC_MSG_CHECKING([if asm("hint @pause"); works]) - AC_TRY_COMPILE(,[asm("hint @pause");], - [AC_MSG_RESULT(yes) - ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"hint @pause\")"], - [AC_MSG_RESULT(no)], - [AC_MSG_RESULT([cross compile, assume yes]) - ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"hint @pause\")"]) - ;; - sparc-*) - # sparc - AC_MSG_CHECKING([if cpu_relax(); or __cpu_relax(); works]) - AC_CHECK_FUNC(cpu_relax, - [AC_MSG_RESULT(yes) - ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP cpu_relax()"], - [AC_CHECK_FUNC(__cpu_relax, - [AC_MSG_RESULT(yes) - ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP __cpu_relax()"], - [AC_MSG_RESULT(no)])]) - ;; - esac -fi +case "$host" in +[i[3456]86-*]) + # x86_32 + AC_MSG_CHECKING([if asm("rep; nop"); works]) + AC_TRY_COMPILE(,[asm("rep; nop");], + [AC_MSG_RESULT(yes) + ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"], + [AC_MSG_RESULT(no)], + [AC_MSG_RESULT([cross compile, assume yes]) + ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"]) + ;; +x86_64-*|amd64-*) + # x86_64 + AC_MSG_CHECKING([if asm("rep; nop"); works]) + AC_TRY_COMPILE(,[asm("rep; nop");], + [AC_MSG_RESULT(yes) + ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"], + [AC_MSG_RESULT(no)], + [AC_MSG_RESULT([cross compile, assume yes]) + ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"]) + ;; +ia64-*) + # ia64 + AC_MSG_CHECKING([if asm("hint @pause"); works]) + AC_TRY_COMPILE(,[asm("hint @pause");], + [AC_MSG_RESULT(yes) + ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"hint @pause\")"], + [AC_MSG_RESULT(no)], + [AC_MSG_RESULT([cross compile, assume yes]) + ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"hint @pause\")"]) + ;; +sparc-*) + # sparc + AC_MSG_CHECKING([if cpu_relax(); or __cpu_relax(); works]) + AC_CHECK_FUNC(cpu_relax, + [AC_MSG_RESULT(yes) + ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP cpu_relax()"], + [AC_CHECK_FUNC(__cpu_relax, + [AC_MSG_RESULT(yes) + ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP __cpu_relax()"], + [AC_MSG_RESULT(no)])]) + ;; +esac AC_SUBST(ISC_PLATFORM_BUSYWAITNOP) @@ -3484,9 +3380,6 @@ DNSTAPOBJS= DNSTAPTARGETS= DNSTAP_PB_C_H= if test "x$use_dnstap" != "xno"; then - if ! $use_threads; then - AC_MSG_ERROR([Dnstap requires threads.]) - fi AC_ARG_WITH([protobuf-c], AS_HELP_STRING([--with-protobuf-c=path], [Path where protobuf-c is installed, for dnstap]), [ @@ -3858,9 +3751,6 @@ AC_ARG_WITH(tuning, case "$use_tuning" in large) - if ! $use_threads; then - AC_MSG_ERROR([Large-system tuning requires threads.]) - fi AC_DEFINE(TUNE_LARGE, 1, [Define to use large-system tuning.]) AC_MSG_RESULT(using large-system tuning) ;; @@ -4412,9 +4302,9 @@ AC_CONFIG_FILES([ lib/isc/$arch/Makefile lib/isc/$arch/include/Makefile lib/isc/$arch/include/isc/Makefile - lib/isc/$thread_dir/Makefile - lib/isc/$thread_dir/include/Makefile - lib/isc/$thread_dir/include/isc/Makefile + lib/isc/pthreads/Makefile + lib/isc/pthreads/include/Makefile + lib/isc/pthreads/include/isc/Makefile lib/isc/Makefile lib/isc/include/Makefile lib/isc/include/isc/Makefile @@ -4480,11 +4370,8 @@ report() { echo "Configuration summary:" echo "-------------------------------------------------------------------------------" echo "Optional features enabled:" - if $use_threads; then - echo " Multiprocessing support (--enable-threads)" - if test "yes" = "$enable_full_report" -o "standard" = "$locktype"; then - echo " Mutex lock type: $locktype" - fi + if test "yes" = "$enable_full_report" -o "standard" = "$locktype"; then + echo " Mutex lock type: $locktype" fi test "large" = "$use_tuning" && echo " Large-system tuning (--with-tuning)" test "no" = "$use_dnstap" || \ @@ -4549,7 +4436,6 @@ report() { echo "-------------------------------------------------------------------------------" echo "Features disabled or unavailable on this platform:" - $use_threads || echo " Multiprocessing support (--enable-threads)" test "no" = "$enable_ipv6" -o "no" = "$found_ipv6" && \ echo " IPv6 support (--enable-ipv6)" test "large" = "$use_tuning" || echo " Large-system tuning (--with-tuning)" diff --git a/contrib/dlz/drivers/dlz_bdb_driver.c b/contrib/dlz/drivers/dlz_bdb_driver.c index 7fd283e4c0..c9c5bd2706 100644 --- a/contrib/dlz/drivers/dlz_bdb_driver.c +++ b/contrib/dlz/drivers/dlz_bdb_driver.c @@ -66,11 +66,7 @@ static dns_sdlzimplementation_t *dlz_bdb = NULL; /* should the bdb driver use threads. */ -#ifdef ISC_PLATFORM_USETHREADS #define bdb_threads DB_THREAD -#else -#define bdb_threads 0 -#endif /* BDB database names */ #define dlz_data "dns_data" diff --git a/contrib/dlz/drivers/dlz_bdbhpt_driver.c b/contrib/dlz/drivers/dlz_bdbhpt_driver.c index 420be63026..09f0082912 100644 --- a/contrib/dlz/drivers/dlz_bdbhpt_driver.c +++ b/contrib/dlz/drivers/dlz_bdbhpt_driver.c @@ -66,11 +66,7 @@ static dns_sdlzimplementation_t *dlz_bdbhpt = NULL; /* should the bdb driver use threads. */ -#ifdef ISC_PLATFORM_USETHREADS #define bdbhpt_threads DB_THREAD -#else -#define bdbhpt_threads 0 -#endif /* bdbhpt database names */ #define dlz_data "dns_data" diff --git a/contrib/dlz/drivers/dlz_ldap_driver.c b/contrib/dlz/drivers/dlz_ldap_driver.c index 311f24abb5..845f012b23 100644 --- a/contrib/dlz/drivers/dlz_ldap_driver.c +++ b/contrib/dlz/drivers/dlz_ldap_driver.c @@ -94,11 +94,7 @@ static dns_sdlzimplementation_t *dlz_ldap = NULL; */ typedef struct { -#ifdef ISC_PLATFORM_USETHREADS db_list_t *db; /*%< handle to a list of DB */ -#else - dbinstance_t *db; /*%< handle to db */ -#endif int method; /*%< security authentication method */ char *user; /*%< who is authenticating */ char *cred; /*%< password for simple authentication method */ @@ -244,9 +240,6 @@ dlz_ldap_connect(ldap_instance_t *dbi, dbinstance_t *dbc) { return (result); } -#ifdef ISC_PLATFORM_USETHREADS - - /*% * Properly cleans up a list of database instances. * This function is only used when the driver is compiled for @@ -316,7 +309,6 @@ ldap_find_avail_conn(db_list_t *dblist) { count); return (NULL); } -#endif /* ISC_PLATFORM_USETHREADS */ static isc_result_t ldap_process_results(LDAP *dbc, LDAPMessage *msg, char ** attrs, @@ -569,22 +561,10 @@ ldap_get_results(const char *zone, const char *record, int entries; /* get db instance / connection */ -#ifdef ISC_PLATFORM_USETHREADS - /* find an available DBI from the list */ dbi = ldap_find_avail_conn((db_list_t *) ((ldap_instance_t *)dbdata)->db); -#else /* ISC_PLATFORM_USETHREADS */ - - /* - * only 1 DBI - no need to lock instance lock either - * only 1 thread in the whole process, no possible contention. - */ - dbi = (dbinstance_t *) ((ldap_instance_t *)dbdata)->db; - -#endif /* ISC_PLATFORM_USETHREADS */ - /* if DBI is null, can't do anything else */ if (dbi == NULL) return (ISC_R_FAILURE); @@ -845,13 +825,9 @@ ldap_get_results(const char *zone, const char *record, if (dbi->client != NULL) isc_mem_free(named_g_mctx, dbi->client); -#ifdef ISC_PLATFORM_USETHREADS - /* release the lock so another thread can use this dbi */ isc_mutex_unlock(&dbi->instance_lock); -#endif /* ISC_PLATFORM_USETHREADS */ - /* release query string */ if (querystring != NULL) isc_mem_free(named_g_mctx, querystring ); @@ -939,30 +915,19 @@ dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[], dbinstance_t *dbi = NULL; int protocol; int method; - -#ifdef ISC_PLATFORM_USETHREADS - /* if multi-threaded, we need a few extra variables. */ int dbcount; char *endp; /* db_list_t *dblist = NULL; */ int i; -#endif /* ISC_PLATFORM_USETHREADS */ UNUSED(dlzname); UNUSED(driverarg); -#ifdef ISC_PLATFORM_USETHREADS /* if debugging, let user know we are multithreaded. */ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1), "LDAP driver running multithreaded"); -#else /* ISC_PLATFORM_USETHREADS */ - /* if debugging, let user know we are single threaded. */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1), - "LDAP driver running single threaded"); -#endif /* ISC_PLATFORM_USETHREADS */ if (argc < 9) { isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, @@ -1010,9 +975,6 @@ dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[], return (ISC_R_FAILURE); } - /* multithreaded build can have multiple DB connections */ -#ifdef ISC_PLATFORM_USETHREADS - /* check how many db connections we should create */ dbcount = strtol(argv[1], &endp, 10); if (*endp != '\0' || dbcount < 0) { @@ -1022,7 +984,6 @@ dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[], "must be positive."); return (ISC_R_FAILURE); } -#endif /* check that LDAP URL parameters make sense */ switch(argc) { @@ -1078,7 +1039,6 @@ dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[], goto cleanup; } -#ifdef ISC_PLATFORM_USETHREADS /* allocate memory for database connection list */ ldap_inst->db = isc_mem_get(named_g_mctx, sizeof(db_list_t)); if (ldap_inst->db == NULL) { @@ -1095,8 +1055,6 @@ dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[], */ for (i = 0; i < dbcount; i++) { -#endif /* ISC_PLATFORM_USETHREADS */ - /* how many queries were passed in from config file? */ switch(argc) { case 9: @@ -1138,18 +1096,9 @@ dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[], goto cleanup; } -#ifdef ISC_PLATFORM_USETHREADS - /* when multithreaded, build a list of DBI's */ ISC_LINK_INIT(dbi, link); ISC_LIST_APPEND(*(ldap_inst->db), dbi, link); -#else - /* - * when single threaded, hold onto the one connection - * instance. - */ - ldap_inst->db = dbi; -#endif /* attempt to connect */ result = dlz_ldap_connect(ldap_inst, dbi); @@ -1166,18 +1115,11 @@ dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[], * allocate memory */ case ISC_R_NOMEMORY: -#ifdef ISC_PLATFORM_USETHREADS isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, "LDAP driver could not allocate memory " "for connection number %u", i+1); -#else - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "LDAP driver could not allocate memory " - "for connection"); -#endif goto cleanup; break; /* @@ -1194,18 +1136,11 @@ dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[], break; /* failure means couldn't connect to ldap server */ case ISC_R_FAILURE: -#ifdef ISC_PLATFORM_USETHREADS isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, "LDAP driver could not " "bind connection number %u to server.", i+1); -#else - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "LDAP driver could not " - "bind connection to server."); -#endif goto cleanup; break; /* @@ -1221,15 +1156,10 @@ dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[], break; } /* end switch(result) */ - -#ifdef ISC_PLATFORM_USETHREADS - /* set DBI = null for next loop through. */ dbi = NULL; } /* end for loop */ -#endif /* ISC_PLATFORM_USETHREADS */ - /* set dbdata to the ldap_instance we created. */ *dbdata = ldap_inst; @@ -1248,20 +1178,10 @@ dlz_ldap_destroy(void *driverarg, void *dbdata) { UNUSED(driverarg); if (dbdata != NULL) { -#ifdef ISC_PLATFORM_USETHREADS /* cleanup the list of DBI's */ ldap_destroy_dblist((db_list_t *) ((ldap_instance_t *)dbdata)->db); -#else /* ISC_PLATFORM_USETHREADS */ - if (((ldap_instance_t *)dbdata)->db->dbconn != NULL) - ldap_unbind_s((LDAP *) - ((ldap_instance_t *)dbdata)->db->dbconn); - - /* destroy single DB instance */ - destroy_sqldbinstance(((ldap_instance_t *)dbdata)->db); -#endif /* ISC_PLATFORM_USETHREADS */ - if (((ldap_instance_t *)dbdata)->hosts != NULL) isc_mem_free(named_g_mctx, ((ldap_instance_t *)dbdata)->hosts); diff --git a/contrib/dlz/drivers/dlz_odbc_driver.c b/contrib/dlz/drivers/dlz_odbc_driver.c index 2f1dba9aa1..2acd4049de 100644 --- a/contrib/dlz/drivers/dlz_odbc_driver.c +++ b/contrib/dlz/drivers/dlz_odbc_driver.c @@ -99,17 +99,7 @@ typedef struct{ */ typedef struct { - -#ifdef ISC_PLATFORM_USETHREADS - db_list_t *db; /* handle to a list of DB */ - -#else - - dbinstance_t *db; /* handle to db */ - -#endif - SQLHENV sql_env; /* handle to SQL environment */ SQLCHAR *dsn; SQLCHAR *user; @@ -136,9 +126,6 @@ safeLen(void *a) { static void destroy_odbc_instance(odbc_instance_t *odbc_inst) { - -#ifdef ISC_PLATFORM_USETHREADS - dbinstance_t *ndbi = NULL; dbinstance_t *dbi = NULL; @@ -180,34 +167,6 @@ destroy_odbc_instance(odbc_instance_t *odbc_inst) { /* release memory for the list structure */ isc_mem_put(named_g_mctx, odbc_inst->db, sizeof(db_list_t)); -#else /* ISC_PLATFORM_USETHREADS */ - - /* free statement handle */ - if (((odbc_db_t *) (odbc_inst->db->dbconn))->stmnt != NULL) { - SQLFreeHandle(SQL_HANDLE_STMT, - ((odbc_db_t *) (odbc_inst->db->dbconn))->stmnt); - ((odbc_db_t *) (odbc_inst->db->dbconn))->stmnt = NULL; - } - - /* disconnect from database, free connection handle */ - if (((odbc_db_t *) (odbc_inst->db->dbconn))->dbc != NULL) { - SQLDisconnect(((odbc_db_t *) (odbc_inst->db->dbconn))->dbc); - SQLFreeHandle(SQL_HANDLE_DBC, - ((odbc_db_t *) (odbc_inst->db->dbconn))->dbc); - ((odbc_db_t *) (odbc_inst->db->dbconn))->dbc = NULL; - } - /* free mem for the odbc_db_t structure held in db */ - if (((odbc_db_t *) odbc_inst->db->dbconn) != NULL) { - isc_mem_free(named_g_mctx, odbc_inst->db->dbconn); - odbc_inst->db->dbconn = NULL; - } - - if (odbc_inst->db != NULL) - destroy_sqldbinstance(odbc_inst->db); - -#endif /* ISC_PLATFORM_USETHREADS */ - - /* free sql environment */ if (odbc_inst->sql_env != NULL) SQLFreeHandle(SQL_HANDLE_ENV, odbc_inst->sql_env); @@ -327,8 +286,6 @@ odbc_connect(odbc_instance_t *dbi, odbc_db_t **dbc) { * multithreaded operation. */ -#ifdef ISC_PLATFORM_USETHREADS - static dbinstance_t * odbc_find_avail_conn(db_list_t *dblist) { @@ -362,8 +319,6 @@ odbc_find_avail_conn(db_list_t *dblist) return NULL; } -#endif /* ISC_PLATFORM_USETHREADS */ - /*% Allocates memory for a new string, and then constructs the new * string by "escaping" the input string. The new string is * safe to be used in queries. This is necessary because we cannot @@ -482,21 +437,10 @@ odbc_get_resultset(const char *zone, const char *record, REQUIRE(*r_dbi == NULL); /* get db instance / connection */ -#ifdef ISC_PLATFORM_USETHREADS /* find an available DBI from the list */ dbi = odbc_find_avail_conn(((odbc_instance_t *) dbdata)->db); -#else /* ISC_PLATFORM_USETHREADS */ - - /* - * only 1 DBI - no need to lock instance lock either - * only 1 thread in the whole process, no possible contention. - */ - dbi = (dbinstance_t *) ((odbc_instance_t *) dbdata)->db; - -#endif /* ISC_PLATFORM_USETHREADS */ - /* if DBI is null, can't do anything else */ if (dbi == NULL) { result = ISC_R_FAILURE; @@ -698,14 +642,10 @@ odbc_get_resultset(const char *zone, const char *record, if (dbi->client != NULL) isc_mem_free(named_g_mctx, dbi->client); -#ifdef ISC_PLATFORM_USETHREADS - /* if we are done using this dbi, release the lock */ if (result != ISC_R_SUCCESS) isc_mutex_unlock(&dbi->instance_lock); -#endif /* ISC_PLATFORM_USETHREADS */ - /* release query string */ if (querystring != NULL) isc_mem_free(named_g_mctx, querystring ); @@ -937,13 +877,9 @@ odbc_process_rs(dns_sdlzlookup_t *lookup, dbinstance_t *dbi) /* close cursor */ SQLCloseCursor(((odbc_db_t *) (dbi->dbconn))->stmnt); -#ifdef ISC_PLATFORM_USETHREADS - /* free lock on dbi so someone else can use it. */ isc_mutex_unlock(&dbi->instance_lock); -#endif - return result; } @@ -980,11 +916,8 @@ odbc_findzone(void *driverarg, void *dbdata, const char *name, /* get rid of result set, we are done with it. */ SQLCloseCursor(((odbc_db_t *) (dbi->dbconn))->stmnt); -#ifdef ISC_PLATFORM_USETHREADS - /* free lock on dbi so someone else can use it. */ isc_mutex_unlock(&dbi->instance_lock); -#endif } return result; @@ -1032,11 +965,8 @@ odbc_allowzonexfr(void *driverarg, void *dbdata, const char *name, /* get rid of result set, we are done with it. */ SQLCloseCursor(((odbc_db_t *) (dbi->dbconn))->stmnt); -#ifdef ISC_PLATFORM_USETHREADS - /* free lock on dbi so someone else can use it. */ isc_mutex_unlock(&dbi->instance_lock); -#endif } @@ -1167,13 +1097,9 @@ odbc_allnodes(const char *zone, void *driverarg, void *dbdata, /* close cursor */ SQLCloseCursor(((odbc_db_t *) (dbi->dbconn))->stmnt); -#ifdef ISC_PLATFORM_USETHREADS - /* free lock on dbi so someone else can use it. */ isc_mutex_unlock(&dbi->instance_lock); -#endif - return result; } @@ -1252,29 +1178,17 @@ odbc_create(const char *dlzname, unsigned int argc, char *argv[], odbc_instance_t *odbc_inst = NULL; dbinstance_t *db = NULL; SQLRETURN sqlRes; - -#ifdef ISC_PLATFORM_USETHREADS - /* if multi-threaded, we need a few extra variables. */ int dbcount; int i; char *endp; -#endif /* ISC_PLATFORM_USETHREADS */ - UNUSED(dlzname); UNUSED(driverarg); -#ifdef ISC_PLATFORM_USETHREADS /* if debugging, let user know we are multithreaded. */ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1), "Odbc driver running multithreaded"); -#else /* ISC_PLATFORM_USETHREADS */ - /* if debugging, let user know we are single threaded. */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1), - "Odbc driver running single threaded"); -#endif /* ISC_PLATFORM_USETHREADS */ /* verify we have at least 5 arg's passed to the driver */ if (argc < 5) { @@ -1295,8 +1209,6 @@ odbc_create(const char *dlzname, unsigned int argc, char *argv[], } /* multithreaded build can have multiple DB connections */ -#ifdef ISC_PLATFORM_USETHREADS - /* check how many db connections we should create */ dbcount = strtol(argv[1], &endp, 10); if (*endp != '\0' || dbcount < 0) { @@ -1307,8 +1219,6 @@ odbc_create(const char *dlzname, unsigned int argc, char *argv[], return (ISC_R_FAILURE); } -#endif /* ISC_PLATFORM_USETHREADS */ - /* allocate memory for odbc instance */ odbc_inst = isc_mem_get(named_g_mctx, sizeof(odbc_instance_t)); if (odbc_inst == NULL) @@ -1361,8 +1271,6 @@ odbc_create(const char *dlzname, unsigned int argc, char *argv[], } } -#ifdef ISC_PLATFORM_USETHREADS - /* allocate memory for database connection list */ odbc_inst->db = isc_mem_get(named_g_mctx, sizeof(db_list_t)); if (odbc_inst->db == NULL) { @@ -1378,8 +1286,6 @@ odbc_create(const char *dlzname, unsigned int argc, char *argv[], /* append each new DBI to the end of the list */ for (i=0; i < dbcount; i++) { -#endif /* ISC_PLATFORM_USETHREADS */ - /* how many queries were passed in from config file? */ switch(argc) { case 5: @@ -1416,20 +1322,14 @@ odbc_create(const char *dlzname, unsigned int argc, char *argv[], goto cleanup; } -#ifdef ISC_PLATFORM_USETHREADS - /* when multithreaded, build a list of DBI's */ ISC_LINK_INIT(db, link); ISC_LIST_APPEND(*odbc_inst->db, db, link); -#endif - result = odbc_connect(odbc_inst, (odbc_db_t **) &(db->dbconn)); if (result != ISC_R_SUCCESS) { -#ifdef ISC_PLATFORM_USETHREADS - /* * if multi threaded, let user know which * connection failed. user could be @@ -1442,28 +1342,14 @@ odbc_create(const char *dlzname, unsigned int argc, char *argv[], "Odbc driver failed to create database " "connection number %u after 3 attempts", i+1); -#else - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Odbc driver failed to create database " - "connection after 3 attempts"); -#endif goto cleanup; } -#ifdef ISC_PLATFORM_USETHREADS - /* set DB = null for next loop through. */ db = NULL; } /* end for loop */ -#else - /* tell odbc_inst about the db connection we just created. */ - odbc_inst->db = db; - -#endif - /* set dbdata to the odbc_instance we created. */ *dbdata = odbc_inst; diff --git a/contrib/dlz/drivers/dlz_postgres_driver.c b/contrib/dlz/drivers/dlz_postgres_driver.c index 349e96c1c1..b50771fd6b 100644 --- a/contrib/dlz/drivers/dlz_postgres_driver.c +++ b/contrib/dlz/drivers/dlz_postgres_driver.c @@ -149,8 +149,6 @@ postgres_makesafe(char *to, const char *from, size_t length) return target - to; } -#ifdef ISC_PLATFORM_USETHREADS - /*% * Properly cleans up a list of database instances. * This function is only used when the driver is compiled for @@ -225,8 +223,6 @@ postgres_find_avail_conn(db_list_t *dblist) return NULL; } -#endif /* ISC_PLATFORM_USETHREADS */ - /*% * Allocates memory for a new string, and then constructs the new * string by "escaping" the input string. The new string is @@ -298,21 +294,10 @@ postgres_get_resultset(const char *zone, const char *record, #endif /* get db instance / connection */ -#ifdef ISC_PLATFORM_USETHREADS /* find an available DBI from the list */ dbi = postgres_find_avail_conn((db_list_t *) dbdata); -#else /* ISC_PLATFORM_USETHREADS */ - - /* - * only 1 DBI - no need to lock instance lock either - * only 1 thread in the whole process, no possible contention. - */ - dbi = (dbinstance_t *) dbdata; - -#endif /* ISC_PLATFORM_USETHREADS */ - #if 0 /* temporary logging message */ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, @@ -599,8 +584,6 @@ postgres_get_resultset(const char *zone, const char *record, if (dbi->client != NULL) isc_mem_free(named_g_mctx, dbi->client); -#ifdef ISC_PLATFORM_USETHREADS - #if 0 /* temporary logging message */ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, @@ -611,8 +594,6 @@ postgres_get_resultset(const char *zone, const char *record, /* release the lock so another thread can use this dbi */ isc_mutex_unlock(&dbi->instance_lock); -#endif /* ISC_PLATFORM_USETHREADS */ - /* release query string */ if (querystring != NULL) isc_mem_free(named_g_mctx, querystring ); @@ -1058,15 +1039,12 @@ postgres_create(const char *dlzname, unsigned int argc, char *argv[], dbinstance_t *dbi = NULL; unsigned int j; -#ifdef ISC_PLATFORM_USETHREADS /* if multi-threaded, we need a few extra variables. */ int dbcount; db_list_t *dblist = NULL; int i; char *endp; -#endif /* ISC_PLATFORM_USETHREADS */ - UNUSED(driverarg); UNUSED(dlzname); @@ -1074,17 +1052,10 @@ postgres_create(const char *dlzname, unsigned int argc, char *argv[], srand( (unsigned)time( NULL ) ); -#ifdef ISC_PLATFORM_USETHREADS /* if debugging, let user know we are multithreaded. */ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1), "Postgres driver running multithreaded"); -#else /* ISC_PLATFORM_USETHREADS */ - /* if debugging, let user know we are single threaded. */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1), - "Postgres driver running single threaded"); -#endif /* ISC_PLATFORM_USETHREADS */ /* verify we have at least 5 arg's passed to the driver */ if (argc < 5) { @@ -1105,7 +1076,6 @@ postgres_create(const char *dlzname, unsigned int argc, char *argv[], } /* multithreaded build can have multiple DB connections */ -#ifdef ISC_PLATFORM_USETHREADS /* check how many db connections we should create */ dbcount = strtol(argv[1], &endp, 10); @@ -1131,8 +1101,6 @@ postgres_create(const char *dlzname, unsigned int argc, char *argv[], */ for (i=0; i < dbcount; i++) { -#endif /* ISC_PLATFORM_USETHREADS */ - /* how many queries were passed in from config file? */ switch(argc) { case 5: @@ -1174,14 +1142,10 @@ postgres_create(const char *dlzname, unsigned int argc, char *argv[], goto cleanup; } -#ifdef ISC_PLATFORM_USETHREADS - /* when multithreaded, build a list of DBI's */ ISC_LINK_INIT(dbi, link); ISC_LIST_APPEND(*dblist, dbi, link); -#endif - /* create and set db connection */ dbi->dbconn = PQconnectdb(argv[2]); /* @@ -1204,8 +1168,6 @@ postgres_create(const char *dlzname, unsigned int argc, char *argv[], PQreset((PGconn *) dbi->dbconn); -#ifdef ISC_PLATFORM_USETHREADS - /* * if multi threaded, let user know which connection * failed. user could be attempting to create 10 db @@ -1229,30 +1191,11 @@ postgres_create(const char *dlzname, unsigned int argc, char *argv[], /* set dbdata to the list we created. */ *dbdata = dblist; -#else /* ISC_PLATFORM_USETHREADS */ - /* if single threaded, just let user know we couldn't connect. */ - if (PQstatus((PGconn *) dbi->dbconn) != CONNECTION_OK) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Postgres driver failed to create database " - "connection after 4 attempts"); - goto cleanup; - } - - /* - * single threaded build can only use 1 db connection, return - * it via dbdata - */ - *dbdata = dbi; - -#endif /* ISC_PLATFORM_USETHREADS */ - /* hey, we got through all of that ok, return success. */ return(ISC_R_SUCCESS); cleanup: -#ifdef ISC_PLATFORM_USETHREADS /* * if multithreaded, we could fail because only 1 connection * couldn't be made. We should cleanup the other successful @@ -1260,11 +1203,6 @@ postgres_create(const char *dlzname, unsigned int argc, char *argv[], */ postgres_destroy_dblist(dblist); -#else /* ISC_PLATFORM_USETHREADS */ - if (dbi != NULL) - destroy_sqldbinstance(dbi); - -#endif /* ISC_PLATFORM_USETHREADS */ return(ISC_R_FAILURE); } @@ -1277,29 +1215,9 @@ postgres_create(const char *dlzname, unsigned int argc, char *argv[], static void postgres_destroy(void *driverarg, void *dbdata) { - -#ifdef ISC_PLATFORM_USETHREADS - UNUSED(driverarg); /* cleanup the list of DBI's */ postgres_destroy_dblist((db_list_t *) dbdata); - -#else /* ISC_PLATFORM_USETHREADS */ - - dbinstance_t *dbi; - - UNUSED(driverarg); - - dbi = (dbinstance_t *) dbdata; - - /* release DB connection */ - if (dbi->dbconn != NULL) - PQfinish((PGconn *) dbi->dbconn); - - /* destroy single DB instance */ - destroy_sqldbinstance(dbi); - -#endif /* ISC_PLATFORM_USETHREADS */ } /* pointers to all our runtime methods. */ diff --git a/contrib/dlz/modules/bdbhpt/dlz_bdbhpt_dynamic.c b/contrib/dlz/modules/bdbhpt/dlz_bdbhpt_dynamic.c index 39112a4703..43e54f9792 100644 --- a/contrib/dlz/modules/bdbhpt/dlz_bdbhpt_dynamic.c +++ b/contrib/dlz/modules/bdbhpt/dlz_bdbhpt_dynamic.c @@ -68,11 +68,7 @@ #include "dlz_minimal.h" /* should the bdb driver use threads. */ -#ifdef ISC_PLATFORM_USETHREADS #define bdbhpt_threads DB_THREAD -#else -#define bdbhpt_threads 0 -#endif /* bdbhpt database names */ #define dlz_data "dns_data" diff --git a/doc/arm/notes.xml b/doc/arm/notes.xml index de2760cbe5..b680339d5c 100644 --- a/doc/arm/notes.xml +++ b/doc/arm/notes.xml @@ -156,6 +156,14 @@
Removed Features + + + Previously, it was possible to build BIND without thread support + for old architectures and systems without threads support. + BIND now requires threading support (either POSIX or Windows) from + the operating system, and it cannot be built without threads. + + named can no longer use the EDNS CLIENT-SUBNET diff --git a/doc/arm/pkcs11.xml b/doc/arm/pkcs11.xml index b64f953c10..28f1ede561 100644 --- a/doc/arm/pkcs11.xml +++ b/doc/arm/pkcs11.xml @@ -230,23 +230,13 @@ $ patch -p1 -d openssl-0.9.8zc \ $ cp pkcs11.GCC4.0.2.so.4.05 /opt/pkcs11/usr/lib/libpkcs11.so - - The Keyper library requires threads, so we - must specify -pthread. - $ cd openssl-0.9.8zc -$ ./Configure linux-x86_64 -pthread \ +$ ./Configure linux-x86_64 \ --pk11-libname=/opt/pkcs11/usr/lib/libpkcs11.so \ --pk11-flavor=sign-only \ --prefix=/opt/pkcs11/usr - - After configuring, run "make" - and "make test". If "make - test" fails with "pthread_atfork() not found", you forgot to - add the -pthread above. -
Building OpenSSL for the SCA 6000 on Solaris @@ -316,7 +306,7 @@ $ /opt/pkcs11/usr/bin/softhsm --init-token 0 --slot 0 --label sofths $ cd openssl-0.9.8zc -$ ./Configure linux-x86_64 -pthread \ +$ ./Configure linux-x86_64 \ --pk11-libname=/opt/pkcs11/usr/lib/libsofthsm.so \ --pk11-flavor=sign-only \ --prefix=/opt/pkcs11/usr @@ -355,13 +345,9 @@ $ ./Configure linux-x86_64 -pthread \
Configuring BIND 9 for Linux with the AEP Keyper - - To link with the PKCS#11 provider, threads must be - enabled in the BIND 9 build. - $ cd ../bind9 -$ ./configure --enable-threads \ +$ ./configure \ --with-openssl=/opt/pkcs11/usr \ --with-pkcs11=/opt/pkcs11/usr/lib/libpkcs11.so @@ -369,13 +355,9 @@ $ ./configure --enable-threads \
Configuring BIND 9 for Solaris with the SCA 6000 - - To link with the PKCS#11 provider, threads must be - enabled in the BIND 9 build. - $ cd ../bind9 -$ ./configure CC="cc -xarch=amd64" --enable-threads \ +$ ./configure CC="cc -xarch=amd64" \ --with-openssl=/opt/pkcs11/usr \ --with-pkcs11=/usr/lib/64/libpkcs11.so @@ -393,7 +375,7 @@ $ ./configure CC="cc -xarch=amd64" --enable-threads \ $ cd ../bind9 -$ ./configure --enable-threads \ +$ ./configure \ --with-openssl=/opt/pkcs11/usr \ --with-pkcs11=/opt/pkcs11/usr/lib/libsofthsm.so diff --git a/doc/dev/dev.md b/doc/dev/dev.md index 83b8ce0233..e7e4b897af 100644 --- a/doc/dev/dev.md +++ b/doc/dev/dev.md @@ -80,7 +80,7 @@ comments; they must be clearly written and consistent with existing style. * Read the diff * Read accompanying notes in the ticket * Apply the diff to the appropriate branch -* Run `configure` (using at least `--enable-developer --enable-threads --with-atf`) +* Run `configure` (using at least `--enable-developer --with-atf`) * Build * Read the documentation, if any * Read the tests diff --git a/lib/dns/dst_api.c b/lib/dns/dst_api.c index aef5e96fb7..583be7aee1 100644 --- a/lib/dns/dst_api.c +++ b/lib/dns/dst_api.c @@ -1562,11 +1562,7 @@ issymmetric(const dst_key_t *key) { static void printtime(const dst_key_t *key, int type, const char *tag, FILE *stream) { isc_result_t result; -#ifdef ISC_PLATFORM_USETHREADS char output[26]; /* Minimum buffer as per ctime_r() specification. */ -#else - const char *output; -#endif isc_stdtime_t when; time_t t; char utc[sizeof("YYYYMMDDHHSSMM")]; @@ -1579,7 +1575,6 @@ printtime(const dst_key_t *key, int type, const char *tag, FILE *stream) { /* time_t and isc_stdtime_t might be different sizes */ t = when; -#ifdef ISC_PLATFORM_USETHREADS #ifdef WIN32 if (ctime_s(output, sizeof(output), &t) != 0) goto error; @@ -1587,9 +1582,6 @@ printtime(const dst_key_t *key, int type, const char *tag, FILE *stream) { if (ctime_r(&t, output) == NULL) goto error; #endif -#else - output = ctime(&t); -#endif isc_buffer_init(&b, utc, sizeof(utc)); result = dns_time32_totext(when, &b); diff --git a/lib/dns/geoip.c b/lib/dns/geoip.c index a425fa380c..2de0ea5abd 100644 --- a/lib/dns/geoip.c +++ b/lib/dns/geoip.c @@ -78,7 +78,6 @@ typedef struct geoip_state { isc_mem_t *mctx; } geoip_state_t; -#ifdef ISC_PLATFORM_USETHREADS static isc_mutex_t key_mutex; static bool state_key_initialized = false; static isc_thread_key_t state_key; @@ -133,9 +132,6 @@ state_key_init(void) { return (result); } -#else -static geoip_state_t saved_state; -#endif static void clean_state(geoip_state_t *state) { @@ -165,7 +161,6 @@ set_state(unsigned int family, uint32_t ipnum, const geoipv6_t *ipnum6, GeoIPRegion *region, char *name, const char *text, int id) { geoip_state_t *state = NULL; -#ifdef ISC_PLATFORM_USETHREADS isc_result_t result; result = state_key_init(); @@ -189,10 +184,6 @@ set_state(unsigned int family, uint32_t ipnum, const geoipv6_t *ipnum6, isc_mem_attach(state_mctx, &state->mctx); } else clean_state(state); -#else - state = &saved_state; - clean_state(state); -#endif if (family == AF_INET) { state->ipnum = ipnum; @@ -218,7 +209,6 @@ get_state_for(unsigned int family, uint32_t ipnum, { geoip_state_t *state; -#ifdef ISC_PLATFORM_USETHREADS isc_result_t result; result = state_key_init(); @@ -228,9 +218,6 @@ get_state_for(unsigned int family, uint32_t ipnum, state = (geoip_state_t *) isc_thread_key_getspecific(state_key); if (state == NULL) return (NULL); -#else - state = &saved_state; -#endif if (state->family == family && ((state->family == AF_INET && state->ipnum == ipnum) || @@ -830,10 +817,8 @@ void dns_geoip_shutdown(void) { #ifdef HAVE_GEOIP GeoIP_cleanup(); -#ifdef ISC_PLATFORM_USETHREADS if (state_mctx != NULL) isc_mem_detach(&state_mctx); -#endif #else return; #endif diff --git a/lib/dns/name.c b/lib/dns/name.c index 09ad5cad56..dc69dbadea 100644 --- a/lib/dns/name.c +++ b/lib/dns/name.c @@ -165,15 +165,11 @@ LIBDNS_EXTERNAL_DATA const dns_name_t *dns_wildcardname = &wild; /* * dns_name_t to text post-conversion procedure. */ -#ifdef ISC_PLATFORM_USETHREADS static int thread_key_initialized = 0; static isc_mutex_t thread_key_mutex; static isc_mem_t *thread_key_mctx = NULL; static isc_thread_key_t totext_filter_proc_key; static isc_once_t once = ISC_ONCE_INIT; -#else -static dns_name_totextfilter_t totext_filter_proc = NULL; -#endif static void set_offsets(const dns_name_t *name, unsigned char *offsets, @@ -1277,7 +1273,6 @@ dns_name_fromtext(dns_name_t *name, isc_buffer_t *source, return (ISC_R_SUCCESS); } -#ifdef ISC_PLATFORM_USETHREADS static void free_specific(void *arg) { dns_name_totextfilter_t *mem = arg; @@ -1324,7 +1319,6 @@ totext_filter_proc_key_init(void) { } return (result); } -#endif isc_result_t dns_name_totext(const dns_name_t *name, bool omit_final_dot, @@ -1354,11 +1348,9 @@ dns_name_totext2(const dns_name_t *name, unsigned int options, unsigned int labels; bool saw_root = false; unsigned int oused = target->used; -#ifdef ISC_PLATFORM_USETHREADS dns_name_totextfilter_t *mem; dns_name_totextfilter_t totext_filter_proc = NULL; isc_result_t result; -#endif bool omit_final_dot = (options & DNS_NAME_OMITFINALDOT); /* @@ -1368,11 +1360,9 @@ dns_name_totext2(const dns_name_t *name, unsigned int options, REQUIRE(VALID_NAME(name)); REQUIRE(ISC_BUFFER_VALID(target)); -#ifdef ISC_PLATFORM_USETHREADS result = totext_filter_proc_key_init(); if (result != ISC_R_SUCCESS) return (result); -#endif ndata = name->ndata; nlen = name->length; labels = name->labels; @@ -1512,11 +1502,9 @@ dns_name_totext2(const dns_name_t *name, unsigned int options, } isc_buffer_add(target, tlen - trem); -#ifdef ISC_PLATFORM_USETHREADS mem = isc_thread_key_getspecific(totext_filter_proc_key); if (mem != NULL) totext_filter_proc = *mem; -#endif if (totext_filter_proc != NULL) return ((*totext_filter_proc)(target, oused)); @@ -2338,7 +2326,6 @@ dns_name_print(const dns_name_t *name, FILE *stream) { isc_result_t dns_name_settotextfilter(dns_name_totextfilter_t proc) { -#ifdef ISC_PLATFORM_USETHREADS isc_result_t result; dns_name_totextfilter_t *mem; int res; @@ -2374,10 +2361,6 @@ dns_name_settotextfilter(dns_name_totextfilter_t proc) { result = ISC_R_UNEXPECTED; } return (result); -#else - totext_filter_proc = proc; - return (ISC_R_SUCCESS); -#endif } void @@ -2527,7 +2510,6 @@ dns_name_copy(const dns_name_t *source, dns_name_t *dest, isc_buffer_t *target) void dns_name_destroy(void) { -#ifdef ISC_PLATFORM_USETHREADS RUNTIME_CHECK(isc_once_do(&once, thread_key_mutex_init) == ISC_R_SUCCESS); @@ -2539,7 +2521,6 @@ dns_name_destroy(void) { } UNLOCK(&thread_key_mutex); -#endif } /* diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index 0aca23253e..a71ece6301 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -9856,7 +9856,6 @@ dns_resolver_create(dns_view_t *view, } res->buckets[i].mctx = NULL; snprintf(name, sizeof(name), "res%u", i); -#ifdef ISC_PLATFORM_USETHREADS /* * Use a separate memory context for each bucket to reduce * contention among multiple threads. Do this only when @@ -9869,9 +9868,6 @@ dns_resolver_create(dns_view_t *view, goto cleanup_buckets; } isc_mem_setname(res->buckets[i].mctx, name, NULL); -#else - isc_mem_attach(view->mctx, &res->buckets[i].mctx); -#endif isc_task_setname(res->buckets[i].task, name, res); ISC_LIST_INIT(res->buckets[i].fctxs); res->buckets[i].exiting = false; diff --git a/lib/dns/tests/dnstest.c b/lib/dns/tests/dnstest.c index 9aad5209fa..11f344838a 100644 --- a/lib/dns/tests/dnstest.c +++ b/lib/dns/tests/dnstest.c @@ -92,11 +92,7 @@ cleanup_managers(void) { static isc_result_t create_managers(void) { isc_result_t result; -#ifdef ISC_PLATFORM_USETHREADS ncpus = isc_os_ncpus(); -#else - ncpus = 1; -#endif CHECK(isc_taskmgr_create(mctx, ncpus, 0, &taskmgr)); CHECK(isc_timermgr_create(mctx, &timermgr)); diff --git a/lib/dns/tests/name_test.c b/lib/dns/tests/name_test.c index 1953b41040..68d1acc1ad 100644 --- a/lib/dns/tests/name_test.c +++ b/lib/dns/tests/name_test.c @@ -648,7 +648,6 @@ ATF_TC_BODY(getlabelsequence, tc) { } } -#ifdef ISC_PLATFORM_USETHREADS #ifdef DNS_BENCHMARK_TESTS /* @@ -744,7 +743,6 @@ ATF_TC_BODY(benchmark, tc) { } #endif /* DNS_BENCHMARK_TESTS */ -#endif /* ISC_PLATFORM_USETHREADS */ /* * Main @@ -762,11 +760,9 @@ ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, countlabels); ATF_TP_ADD_TC(tp, getlabel); ATF_TP_ADD_TC(tp, getlabelsequence); -#ifdef ISC_PLATFORM_USETHREADS #ifdef DNS_BENCHMARK_TESTS ATF_TP_ADD_TC(tp, benchmark); #endif /* DNS_BENCHMARK_TESTS */ -#endif /* ISC_PLATFORM_USETHREADS */ return (atf_no_error()); } diff --git a/lib/dns/tests/rbt_test.c b/lib/dns/tests/rbt_test.c index 319354edd5..5881c40976 100644 --- a/lib/dns/tests/rbt_test.c +++ b/lib/dns/tests/rbt_test.c @@ -1276,7 +1276,6 @@ ATF_TC_BODY(rbt_nodechain, tc) { dns_test_end(); } -#ifdef ISC_PLATFORM_USETHREADS #ifdef DNS_BENCHMARK_TESTS /* @@ -1404,7 +1403,6 @@ ATF_TC_BODY(benchmark, tc) { } #endif /* DNS_BENCHMARK_TESTS */ -#endif /* ISC_PLATFORM_USETHREADS */ /* * Main @@ -1422,11 +1420,9 @@ ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, rbt_addname); ATF_TP_ADD_TC(tp, rbt_deletename); ATF_TP_ADD_TC(tp, rbt_nodechain); -#ifdef ISC_PLATFORM_USETHREADS #ifdef DNS_BENCHMARK_TESTS ATF_TP_ADD_TC(tp, benchmark); #endif /* DNS_BENCHMARK_TESTS */ -#endif /* ISC_PLATFORM_USETHREADS */ return (atf_no_error()); } diff --git a/lib/dns/update.c b/lib/dns/update.c index 2ce687ae13..da7494c760 100644 --- a/lib/dns/update.c +++ b/lib/dns/update.c @@ -2055,7 +2055,7 @@ static isc_stdtime_t epoch_to_yyyymmdd(time_t when) { struct tm *tm; -#if defined(ISC_PLATFORM_USETHREADS) && !defined(WIN32) +#if !defined(WIN32) struct tm tm0; tm = localtime_r(&when, &tm0); #else diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 488108b13e..22af7c87bf 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -10166,9 +10166,7 @@ dns_zone_markdirty(dns_zone_t *zone) { if (result != ISC_R_SUCCESS) { UNLOCK_ZONE(zone); secure = NULL; -#ifdef ISC_PLATFORM_USETHREADS isc_thread_yield(); -#endif goto again; } @@ -10434,9 +10432,7 @@ dump_done(void *arg, isc_result_t result) { if (result != ISC_R_SUCCESS) { UNLOCK_ZONE(zone); secure = NULL; -#if ISC_PLATFORM_USETHREADS isc_thread_yield(); -#endif goto again; } } @@ -14967,9 +14963,7 @@ dns_zone_replacedb(dns_zone_t *zone, dns_db_t *db, bool dump) { if (result != ISC_R_SUCCESS) { UNLOCK_ZONE(zone); secure = NULL; -#if ISC_PLATFORM_USETHREADS isc_thread_yield(); -#endif goto again; } } @@ -15203,9 +15197,7 @@ zone_xfrdone(dns_zone_t *zone, isc_result_t result) { if (result != ISC_R_SUCCESS) { UNLOCK_ZONE(zone); secure = NULL; -#if ISC_PLATFORM_USETHREADS isc_thread_yield(); -#endif goto again; } } @@ -15468,9 +15460,7 @@ zone_loaddone(void *arg, isc_result_t result) { if (result != ISC_R_SUCCESS) { UNLOCK_ZONE(zone); secure = NULL; -#if ISC_PLATFORM_USETHREADS isc_thread_yield(); -#endif goto again; } } @@ -18513,9 +18503,7 @@ dns_zone_dlzpostload(dns_zone_t *zone, dns_db_t *db) if (result != ISC_R_SUCCESS) { UNLOCK_ZONE(zone); secure = NULL; -#if ISC_PLATFORM_USETHREADS isc_thread_yield(); -#endif goto again; } } diff --git a/lib/irs/context.c b/lib/irs/context.c index cc245c3d57..05450067a5 100644 --- a/lib/irs/context.c +++ b/lib/irs/context.c @@ -45,14 +45,10 @@ #define DNS_CONF "/etc/dns.conf" #endif -#ifndef ISC_PLATFORM_USETHREADS -irs_context_t *irs_g_context = NULL; -#else static bool thread_key_initialized = false; static isc_mutex_t thread_key_mutex; static isc_thread_key_t irs_context_key; static isc_once_t once = ISC_ONCE_INIT; -#endif struct irs_context { @@ -128,7 +124,6 @@ ctxs_init(isc_mem_t **mctxp, isc_appctx_t **actxp, return (result); } -#ifdef ISC_PLATFORM_USETHREADS static void free_specific_context(void *arg) { irs_context_t *context = arg; @@ -166,7 +161,6 @@ thread_key_init(void) { return (result); } -#endif /* ISC_PLATFORM_USETHREADS */ isc_result_t irs_context_get(irs_context_t **contextp) { @@ -175,15 +169,6 @@ irs_context_get(irs_context_t **contextp) { REQUIRE(contextp != NULL && *contextp == NULL); -#ifndef ISC_PLATFORM_USETHREADS - if (irs_g_context == NULL) { - result = irs_context_create(&irs_g_context); - if (result != ISC_R_SUCCESS) - return (result); - } - - context = irs_g_context; -#else result = thread_key_init(); if (result != ISC_R_SUCCESS) return (result); @@ -199,7 +184,6 @@ irs_context_get(irs_context_t **contextp) { return (result); } } -#endif /* ISC_PLATFORM_USETHREADS */ *contextp = context; @@ -328,11 +312,7 @@ irs_context_destroy(irs_context_t **contextp) { *contextp = NULL; -#ifndef ISC_PLATFORM_USETHREADS - irs_g_context = NULL; -#else (void)isc_thread_key_setspecific(irs_context_key, NULL); -#endif } isc_mem_t * diff --git a/lib/isc/Makefile.in b/lib/isc/Makefile.in index 785ac6892b..010fc65b5e 100644 --- a/lib/isc/Makefile.in +++ b/lib/isc/Makefile.in @@ -18,7 +18,7 @@ VERSION=@BIND9_VERSION@ @BIND9_MAKE_INCLUDES@ CINCLUDES = -I${srcdir}/unix/include \ - -I${srcdir}/@ISC_THREAD_DIR@/include \ + -I${srcdir}/pthreads/include \ -I${srcdir}/@ISC_ARCH_DIR@/include \ -I./include \ -I${srcdir}/include ${DNS_INCLUDES} @OPENSSL_INCLUDES@ @@ -36,9 +36,7 @@ UNIXOBJS = @ISC_ISCIPV6_O@ unix/pk11_api.@O@ \ NLSOBJS = nls/msgcat.@O@ -THREADOPTOBJS = @ISC_THREAD_DIR@/condition.@O@ @ISC_THREAD_DIR@/mutex.@O@ - -THREADOBJS = @THREADOPTOBJS@ @ISC_THREAD_DIR@/thread.@O@ +THREADOBJS = pthreads/condition.@O@ pthreads/mutex.@O@ pthreads/thread.@O@ WIN32OBJS = win32/condition.@O@ win32/dir.@O@ win32/errno.@O@ \ win32/file.@O@ win32/fsaccess.@O@ \ @@ -85,7 +83,7 @@ LIBS = @OPENSSL_LIBS@ @LIBS@ # Attempt to disable parallel processing. .NOTPARALLEL: .NO_PARALLEL: -SUBDIRS = include unix nls @ISC_THREAD_DIR@ @ISC_ARCH_DIR@ +SUBDIRS = include unix nls pthreads @ISC_ARCH_DIR@ TARGETS = timestamp TESTDIRS = @UNITTESTS@ diff --git a/lib/isc/include/isc/platform.h.in b/lib/isc/include/isc/platform.h.in index 79c5bf6106..dfc06e48bb 100644 --- a/lib/isc/include/isc/platform.h.in +++ b/lib/isc/include/isc/platform.h.in @@ -194,11 +194,6 @@ *** Miscellaneous. ***/ -/* - * Defined if we are using threads. - */ -@ISC_PLATFORM_USETHREADS@ - /* * Defined if unistd.h does not cause fd_set to be delared. */ diff --git a/lib/isc/include/isc/refcount.h b/lib/isc/include/isc/refcount.h index 6894291276..39ff3189a2 100644 --- a/lib/isc/include/isc/refcount.h +++ b/lib/isc/include/isc/refcount.h @@ -94,7 +94,6 @@ ISC_LANG_BEGINDECLS /* * Sample implementations */ -#ifdef ISC_PLATFORM_USETHREADS #if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) || defined(ISC_PLATFORM_HAVEXADD) #define ISC_REFCOUNT_HAVEATOMIC 1 #if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) @@ -253,44 +252,6 @@ typedef struct isc_refcount { } while (0) #endif /* (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) || defined(ISC_PLATFORM_HAVEXADD) */ -#else /* ISC_PLATFORM_USETHREADS */ - -typedef struct isc_refcount { - int refs; -} isc_refcount_t; - -#define isc_refcount_destroy(rp) ISC_REQUIRE((rp)->refs == 0) -#define isc_refcount_current(rp) ((unsigned int)((rp)->refs)) - -#define isc_refcount_increment0(rp, tp) \ - do { \ - unsigned int *_tmp = (unsigned int *)(tp); \ - int _n = ++(rp)->refs; \ - if (_tmp != NULL) \ - *_tmp = _n; \ - } while (0) - -#define isc_refcount_increment(rp, tp) \ - do { \ - unsigned int *_tmp = (unsigned int *)(tp); \ - int _n; \ - ISC_REQUIRE((rp)->refs > 0); \ - _n = ++(rp)->refs; \ - if (_tmp != NULL) \ - *_tmp = _n; \ - } while (0) - -#define isc_refcount_decrement(rp, tp) \ - do { \ - unsigned int *_tmp = (unsigned int *)(tp); \ - int _n; \ - ISC_REQUIRE((rp)->refs > 0); \ - _n = --(rp)->refs; \ - if (_tmp != NULL) \ - *_tmp = _n; \ - } while (0) - -#endif /* ISC_PLATFORM_USETHREADS */ isc_result_t isc_refcount_init(isc_refcount_t *ref, unsigned int n); diff --git a/lib/isc/include/isc/rwlock.h b/lib/isc/include/isc/rwlock.h index fcd72cab2f..4312feb84b 100644 --- a/lib/isc/include/isc/rwlock.h +++ b/lib/isc/include/isc/rwlock.h @@ -34,7 +34,6 @@ typedef enum { isc_rwlocktype_write } isc_rwlocktype_t; -#ifdef ISC_PLATFORM_USETHREADS #if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) || (defined(ISC_PLATFORM_HAVEXADD) && defined(ISC_PLATFORM_HAVECMPXCHG)) #define ISC_RWLOCK_USEATOMIC 1 #if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) @@ -108,14 +107,6 @@ struct isc_rwlock { isc_rwlocktype_t original; #endif /* ISC_RWLOCK_USEATOMIC */ }; -#else /* ISC_PLATFORM_USETHREADS */ -struct isc_rwlock { - unsigned int magic; - isc_rwlocktype_t type; - unsigned int active; -}; -#endif /* ISC_PLATFORM_USETHREADS */ - isc_result_t isc_rwlock_init(isc_rwlock_t *rwl, unsigned int read_quota, diff --git a/lib/isc/include/isc/task.h b/lib/isc/include/isc/task.h index 77a18f05b6..72be4bf14b 100644 --- a/lib/isc/include/isc/task.h +++ b/lib/isc/include/isc/task.h @@ -826,19 +826,11 @@ isc__task_register(void); * These functions allow unit tests to manipulate the processing * of the task queue. They are not intended as part of the public API. */ -#if defined(ISC_PLATFORM_USETHREADS) void isc__taskmgr_pause(isc_taskmgr_t *taskmgr); void isc__taskmgr_resume(isc_taskmgr_t *taskmgr); -#else -bool -isc__taskmgr_ready(isc_taskmgr_t *taskmgr); - -isc_result_t -isc__taskmgr_dispatch(isc_taskmgr_t *taskmgr); -#endif /* !ISC_PLATFORM_USETHREADS */ ISC_LANG_ENDDECLS diff --git a/lib/isc/nothreads/Makefile.in b/lib/isc/nothreads/Makefile.in deleted file mode 100644 index c79477363e..0000000000 --- a/lib/isc/nothreads/Makefile.in +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright (C) Internet Systems Consortium, Inc. ("ISC") -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -# See the COPYRIGHT file distributed with this work for additional -# information regarding copyright ownership. - -top_srcdir = @top_srcdir@ -srcdir = @srcdir@ -VPATH = @srcdir@ - -CINCLUDES = -I${srcdir}/include \ - -I${srcdir}/../unix/include \ - -I../include \ - -I${srcdir}/../include \ - -I${srcdir}/.. - -CDEFINES = -CWARNINGS = - -THREADOPTOBJS = condition.@O@ mutex.@O@ -OBJS = @THREADOPTOBJS@ thread.@O@ - -THREADOPTSRCS = condition.c mutex.c -SRCS = @THREADOPTSRCS@ thread.c - -SUBDIRS = include -TARGETS = ${OBJS} - -@BIND9_MAKE_RULES@ diff --git a/lib/isc/nothreads/condition.c b/lib/isc/nothreads/condition.c deleted file mode 100644 index a549c30938..0000000000 --- a/lib/isc/nothreads/condition.c +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (C) Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * See the COPYRIGHT file distributed with this work for additional - * information regarding copyright ownership. - */ - - -#include - -#include - -EMPTY_TRANSLATION_UNIT diff --git a/lib/isc/nothreads/include/Makefile.in b/lib/isc/nothreads/include/Makefile.in deleted file mode 100644 index d33c0fcb2c..0000000000 --- a/lib/isc/nothreads/include/Makefile.in +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright (C) Internet Systems Consortium, Inc. ("ISC") -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -# See the COPYRIGHT file distributed with this work for additional -# information regarding copyright ownership. - -srcdir = @srcdir@ -VPATH = @srcdir@ -top_srcdir = @top_srcdir@ - -SUBDIRS = isc -TARGETS = - -@BIND9_MAKE_RULES@ diff --git a/lib/isc/nothreads/include/isc/Makefile.in b/lib/isc/nothreads/include/isc/Makefile.in deleted file mode 100644 index e50c70944a..0000000000 --- a/lib/isc/nothreads/include/isc/Makefile.in +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (C) Internet Systems Consortium, Inc. ("ISC") -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -# See the COPYRIGHT file distributed with this work for additional -# information regarding copyright ownership. - -srcdir = @srcdir@ -VPATH = @srcdir@ -top_srcdir = @top_srcdir@ - -VERSION=@BIND9_VERSION@ - -HEADERS = condition.h mutex.h once.h thread.h - -SUBDIRS = -TARGETS = - -@BIND9_MAKE_RULES@ - -installdirs: - $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${includedir}/isc - -install:: installdirs - for i in ${HEADERS}; do \ - ${INSTALL_DATA} $(srcdir)/$$i ${DESTDIR}${includedir}/isc ; \ - done - -uninstall:: - for i in ${HEADERS}; do \ - rm -f ${DESTDIR}${includedir}/isc/$$i ; \ - done diff --git a/lib/isc/nothreads/include/isc/condition.h b/lib/isc/nothreads/include/isc/condition.h deleted file mode 100644 index 0bea23d2c9..0000000000 --- a/lib/isc/nothreads/include/isc/condition.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * See the COPYRIGHT file distributed with this work for additional - * information regarding copyright ownership. - */ - - -/* - * This provides a limited subset of the isc_condition_t - * functionality for use by single-threaded programs that - * need to block waiting for events. Only a single - * call to isc_condition_wait() may be blocked at any given - * time, and the _waituntil and _broadcast functions are not - * supported. This is intended primarily for use by the omapi - * library, and may go away once omapi goes away. Use for - * other purposes is strongly discouraged. - */ - -#ifndef ISC_CONDITION_H -#define ISC_CONDITION_H 1 - -#include - -typedef int isc_condition_t; - -isc_result_t isc__nothread_wait_hack(isc_condition_t *cp, isc_mutex_t *mp); -isc_result_t isc__nothread_signal_hack(isc_condition_t *cp); - -#define isc_condition_init(cp) \ - (*(cp) = 0, ISC_R_SUCCESS) - -#define isc_condition_wait(cp, mp) \ - isc__nothread_wait_hack(cp, mp) - -#define isc_condition_waituntil(cp, mp, tp) \ - ((void)(cp), (void)(mp), (void)(tp), ISC_R_NOTIMPLEMENTED) - -#define isc_condition_signal(cp) \ - isc__nothread_signal_hack(cp) - -#define isc_condition_broadcast(cp) \ - ((void)(cp), ISC_R_NOTIMPLEMENTED) - -#define isc_condition_destroy(cp) \ - (*(cp) == 0 ? (*(cp) = -1, ISC_R_SUCCESS) : ISC_R_UNEXPECTED) - -#endif /* ISC_CONDITION_H */ diff --git a/lib/isc/nothreads/include/isc/mutex.h b/lib/isc/nothreads/include/isc/mutex.h deleted file mode 100644 index a9c55f6f7d..0000000000 --- a/lib/isc/nothreads/include/isc/mutex.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * See the COPYRIGHT file distributed with this work for additional - * information regarding copyright ownership. - */ - -#ifndef ISC_MUTEX_H -#define ISC_MUTEX_H 1 - -#include /* for ISC_R_ codes */ - -typedef int isc_mutex_t; - -#define isc_mutex_init(mp) \ - (*(mp) = 0, ISC_R_SUCCESS) -#define isc_mutex_lock(mp) \ - ((*(mp))++ == 0 ? ISC_R_SUCCESS : ISC_R_UNEXPECTED) -#define isc_mutex_unlock(mp) \ - (--(*(mp)) == 0 ? ISC_R_SUCCESS : ISC_R_UNEXPECTED) -#define isc_mutex_trylock(mp) \ - (*(mp) == 0 ? ((*(mp))++, ISC_R_SUCCESS) : ISC_R_LOCKBUSY) -#define isc_mutex_destroy(mp) \ - (*(mp) == 0 ? (*(mp) = -1, ISC_R_SUCCESS) : ISC_R_UNEXPECTED) -#define isc_mutex_stats(fp) - -#endif /* ISC_MUTEX_H */ diff --git a/lib/isc/nothreads/include/isc/once.h b/lib/isc/nothreads/include/isc/once.h deleted file mode 100644 index c29181416d..0000000000 --- a/lib/isc/nothreads/include/isc/once.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * See the COPYRIGHT file distributed with this work for additional - * information regarding copyright ownership. - */ - - -#ifndef ISC_ONCE_H -#define ISC_ONCE_H 1 - -#include - -#include - -typedef bool isc_once_t; - -#define ISC_ONCE_INIT false - -#define isc_once_do(op, f) \ - (!*(op) ? (f(), *(op) = true, ISC_R_SUCCESS) : ISC_R_SUCCESS) - -#endif /* ISC_ONCE_H */ diff --git a/lib/isc/nothreads/include/isc/thread.h b/lib/isc/nothreads/include/isc/thread.h deleted file mode 100644 index 8486c3f9ab..0000000000 --- a/lib/isc/nothreads/include/isc/thread.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * See the COPYRIGHT file distributed with this work for additional - * information regarding copyright ownership. - */ - - -#ifndef ISC_THREAD_H -#define ISC_THREAD_H 1 - -#include -#include - -ISC_LANG_BEGINDECLS - -/* Placeholder types (they are not accessed) */ - -typedef void * isc_thread_t; -typedef void * isc_threadresult_t; -typedef void * isc_threadarg_t; -typedef void * isc_threadfunc_t; -typedef void * isc_thread_key_t; - -void -isc_thread_setconcurrency(unsigned int level); - -void -isc_thread_setname(isc_thread_t thread, const char *name); - -#define isc_thread_self() ((unsigned long)0) -#define isc_thread_yield() ((void)0) - -ISC_LANG_ENDDECLS - -#endif /* ISC_THREAD_H */ diff --git a/lib/isc/nothreads/mutex.c b/lib/isc/nothreads/mutex.c deleted file mode 100644 index e092ac9b73..0000000000 --- a/lib/isc/nothreads/mutex.c +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (C) Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * See the COPYRIGHT file distributed with this work for additional - * information regarding copyright ownership. - */ - - -#include - -#include - -EMPTY_TRANSLATION_UNIT - diff --git a/lib/isc/nothreads/thread.c b/lib/isc/nothreads/thread.c deleted file mode 100644 index 671261f7a3..0000000000 --- a/lib/isc/nothreads/thread.c +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * See the COPYRIGHT file distributed with this work for additional - * information regarding copyright ownership. - */ - - -#include - -#include -#include - -void -isc_thread_setconcurrency(unsigned int level) { - UNUSED(level); -} - -void isc_thread_setname(isc_thread_t thread, const char *name) { - UNUSED(thread); - UNUSED(name); -} diff --git a/lib/isc/refcount.c b/lib/isc/refcount.c index 033af7b4cd..0f9fc041e0 100644 --- a/lib/isc/refcount.c +++ b/lib/isc/refcount.c @@ -24,7 +24,7 @@ isc_refcount_init(isc_refcount_t *ref, unsigned int n) { REQUIRE(ref != NULL); ref->refs = n; -#if defined(ISC_PLATFORM_USETHREADS) && !defined(ISC_REFCOUNT_HAVEATOMIC) +#if !defined(ISC_REFCOUNT_HAVEATOMIC) return (isc_mutex_init(&ref->lock)); #else return (ISC_R_SUCCESS); diff --git a/lib/isc/rwlock.c b/lib/isc/rwlock.c index 9eeb04787c..6c7907a65a 100644 --- a/lib/isc/rwlock.c +++ b/lib/isc/rwlock.c @@ -29,8 +29,6 @@ #define RWLOCK_MAGIC ISC_MAGIC('R', 'W', 'L', 'k') #define VALID_RWLOCK(rwl) ISC_MAGIC_VALID(rwl, RWLOCK_MAGIC) -#ifdef ISC_PLATFORM_USETHREADS - #ifndef RWLOCK_DEFAULT_READ_QUOTA #define RWLOCK_DEFAULT_READ_QUOTA 4 #endif @@ -892,91 +890,3 @@ isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { } #endif /* ISC_RWLOCK_USEATOMIC */ -#else /* ISC_PLATFORM_USETHREADS */ - -isc_result_t -isc_rwlock_init(isc_rwlock_t *rwl, unsigned int read_quota, - unsigned int write_quota) -{ - REQUIRE(rwl != NULL); - - UNUSED(read_quota); - UNUSED(write_quota); - - rwl->type = isc_rwlocktype_read; - rwl->active = 0; - rwl->magic = RWLOCK_MAGIC; - - return (ISC_R_SUCCESS); -} - -isc_result_t -isc_rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { - REQUIRE(VALID_RWLOCK(rwl)); - - if (type == isc_rwlocktype_read) { - if (rwl->type != isc_rwlocktype_read && rwl->active != 0) - return (ISC_R_LOCKBUSY); - rwl->type = isc_rwlocktype_read; - rwl->active++; - } else { - if (rwl->active != 0) - return (ISC_R_LOCKBUSY); - rwl->type = isc_rwlocktype_write; - rwl->active = 1; - } - return (ISC_R_SUCCESS); -} - -isc_result_t -isc_rwlock_trylock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { - return (isc_rwlock_lock(rwl, type)); -} - -isc_result_t -isc_rwlock_tryupgrade(isc_rwlock_t *rwl) { - isc_result_t result = ISC_R_SUCCESS; - - REQUIRE(VALID_RWLOCK(rwl)); - REQUIRE(rwl->type == isc_rwlocktype_read); - REQUIRE(rwl->active != 0); - - /* If we are the only reader then succeed. */ - if (rwl->active == 1) - rwl->type = isc_rwlocktype_write; - else - result = ISC_R_LOCKBUSY; - return (result); -} - -void -isc_rwlock_downgrade(isc_rwlock_t *rwl) { - - REQUIRE(VALID_RWLOCK(rwl)); - REQUIRE(rwl->type == isc_rwlocktype_write); - REQUIRE(rwl->active == 1); - - rwl->type = isc_rwlocktype_read; -} - -isc_result_t -isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { - REQUIRE(VALID_RWLOCK(rwl)); - REQUIRE(rwl->type == type); - - UNUSED(type); - - INSIST(rwl->active > 0); - rwl->active--; - - return (ISC_R_SUCCESS); -} - -void -isc_rwlock_destroy(isc_rwlock_t *rwl) { - REQUIRE(rwl != NULL); - REQUIRE(rwl->active == 0); - rwl->magic = 0; -} - -#endif /* ISC_PLATFORM_USETHREADS */ diff --git a/lib/isc/task.c b/lib/isc/task.c index db3eb97801..dfd1840fe8 100644 --- a/lib/isc/task.c +++ b/lib/isc/task.c @@ -53,12 +53,6 @@ * is expected to have a separate manager; no "worker threads" are shared by * the application threads. */ -#ifdef ISC_PLATFORM_USETHREADS -#define USE_WORKER_THREADS -#else -#define USE_SHARED_MANAGER -#endif /* ISC_PLATFORM_USETHREADS */ - #ifdef ISC_TASK_TRACE #define XTRACE(m) fprintf(stderr, "task %p thread %lu: %s\n", \ task, isc_thread_self(), (m)) @@ -132,21 +126,17 @@ struct isc__taskmgr { isc_taskmgr_t common; isc_mem_t * mctx; isc_mutex_t lock; -#ifdef ISC_PLATFORM_USETHREADS unsigned int workers; isc_thread_t * threads; -#endif /* ISC_PLATFORM_USETHREADS */ /* Locked by task manager lock. */ unsigned int default_quantum; LIST(isc__task_t) tasks; isc__tasklist_t ready_tasks; isc__tasklist_t ready_priority_tasks; isc_taskmgrmode_t mode; -#ifdef ISC_PLATFORM_USETHREADS isc_condition_t work_available; isc_condition_t exclusive_granted; isc_condition_t paused; -#endif /* ISC_PLATFORM_USETHREADS */ unsigned int tasks_running; unsigned int tasks_ready; bool pause_requested; @@ -160,19 +150,12 @@ struct isc__taskmgr { */ isc_mutex_t excl_lock; isc__task_t *excl; -#ifdef USE_SHARED_MANAGER - unsigned int refs; -#endif /* ISC_PLATFORM_USETHREADS */ }; #define DEFAULT_TASKMGR_QUANTUM 10 #define DEFAULT_DEFAULT_QUANTUM 5 #define FINISHED(m) ((m)->exiting && EMPTY((m)->tasks)) -#ifdef USE_SHARED_MANAGER -static isc__taskmgr_t *taskmgr = NULL; -#endif /* USE_SHARED_MANAGER */ - /*% * The following are intended for internal use (indicated by "isc__" * prefix) but are not declared as static, allowing direct access from @@ -314,7 +297,6 @@ task_finished(isc__task_t *task) { LOCK(&manager->lock); UNLINK(manager->tasks, task, link); -#ifdef USE_WORKER_THREADS if (FINISHED(manager)) { /* * All tasks have completed and the @@ -324,7 +306,6 @@ task_finished(isc__task_t *task) { */ BROADCAST(&manager->work_available); } -#endif /* USE_WORKER_THREADS */ UNLOCK(&manager->lock); DESTROYLOCK(&task->lock); @@ -461,9 +442,7 @@ task_shutdown(isc__task_t *task) { static inline void task_ready(isc__task_t *task) { isc__taskmgr_t *manager = task->manager; -#ifdef USE_WORKER_THREADS bool has_privilege = isc__task_privilege((isc_task_t *) task); -#endif /* USE_WORKER_THREADS */ REQUIRE(VALID_MANAGER(manager)); REQUIRE(task->state == task_state_ready); @@ -472,10 +451,8 @@ task_ready(isc__task_t *task) { LOCK(&manager->lock); push_readyq(manager, task); -#ifdef USE_WORKER_THREADS if (manager->mode == isc_taskmgrmode_normal || has_privilege) SIGNAL(&manager->work_available); -#endif /* USE_WORKER_THREADS */ UNLOCK(&manager->lock); } @@ -1001,12 +978,6 @@ push_readyq(isc__taskmgr_t *manager, isc__task_t *task) { static void dispatch(isc__taskmgr_t *manager) { isc__task_t *task; -#ifndef USE_WORKER_THREADS - unsigned int total_dispatch_count = 0; - isc__tasklist_t new_ready_tasks; - isc__tasklist_t new_priority_tasks; - unsigned int tasks_ready = 0; -#endif /* USE_WORKER_THREADS */ REQUIRE(VALID_MANAGER(manager)); @@ -1060,14 +1031,9 @@ dispatch(isc__taskmgr_t *manager) { * unlocks. The while expression is always protected by the lock. */ -#ifndef USE_WORKER_THREADS - ISC_LIST_INIT(new_ready_tasks); - ISC_LIST_INIT(new_priority_tasks); -#endif LOCK(&manager->lock); while (!FINISHED(manager)) { -#ifdef USE_WORKER_THREADS /* * For reasons similar to those given in the comment in * isc_task_send() above, it is safe for us to dequeue @@ -1089,11 +1055,6 @@ dispatch(isc__taskmgr_t *manager) { ISC_MSGSET_TASK, ISC_MSG_AWAKE, "awake")); } -#else /* USE_WORKER_THREADS */ - if (total_dispatch_count >= DEFAULT_TASKMGR_QUANTUM || - empty_readyq(manager)) - break; -#endif /* USE_WORKER_THREADS */ XTHREADTRACE(isc_msgcat_get(isc_msgcat, ISC_MSGSET_TASK, ISC_MSG_WORKING, "working")); @@ -1144,9 +1105,6 @@ dispatch(isc__taskmgr_t *manager) { LOCK(&task->lock); } dispatch_count++; -#ifndef USE_WORKER_THREADS - total_dispatch_count++; -#endif /* USE_WORKER_THREADS */ } if (task->references == 0 && @@ -1231,7 +1189,6 @@ dispatch(isc__taskmgr_t *manager) { LOCK(&manager->lock); manager->tasks_running--; -#ifdef USE_WORKER_THREADS if (manager->exclusive_requested && manager->tasks_running == 1) { SIGNAL(&manager->exclusive_granted); @@ -1239,7 +1196,6 @@ dispatch(isc__taskmgr_t *manager) { manager->tasks_running == 0) { SIGNAL(&manager->paused); } -#endif /* USE_WORKER_THREADS */ if (requeue) { /* * We know we're awake, so we don't have @@ -1260,19 +1216,10 @@ dispatch(isc__taskmgr_t *manager) { * were usually nonempty, the 'optimization' * might even hurt rather than help. */ -#ifdef USE_WORKER_THREADS push_readyq(manager, task); -#else - ENQUEUE(new_ready_tasks, task, ready_link); - if ((task->flags & TASK_F_PRIVILEGED) != 0) - ENQUEUE(new_priority_tasks, task, - ready_priority_link); - tasks_ready++; -#endif } } -#ifdef USE_WORKER_THREADS /* * If we are in privileged execution mode and there are no * tasks remaining on the current ready queue, then @@ -1284,22 +1231,11 @@ dispatch(isc__taskmgr_t *manager) { if (!empty_readyq(manager)) BROADCAST(&manager->work_available); } -#endif } -#ifndef USE_WORKER_THREADS - ISC_LIST_APPENDLIST(manager->ready_tasks, new_ready_tasks, ready_link); - ISC_LIST_APPENDLIST(manager->ready_priority_tasks, new_priority_tasks, - ready_priority_link); - manager->tasks_ready += tasks_ready; - if (empty_readyq(manager)) - manager->mode = isc_taskmgrmode_normal; -#endif - UNLOCK(&manager->lock); } -#ifdef USE_WORKER_THREADS static isc_threadresult_t #ifdef _WIN32 WINAPI @@ -1321,18 +1257,15 @@ run(void *uap) { return ((isc_threadresult_t)0); } -#endif /* USE_WORKER_THREADS */ static void manager_free(isc__taskmgr_t *manager) { isc_mem_t *mctx; -#ifdef USE_WORKER_THREADS (void)isc_condition_destroy(&manager->exclusive_granted); (void)isc_condition_destroy(&manager->work_available); (void)isc_condition_destroy(&manager->paused); isc_mem_free(manager->mctx, manager->threads); -#endif /* USE_WORKER_THREADS */ DESTROYLOCK(&manager->lock); DESTROYLOCK(&manager->excl_lock); manager->common.impmagic = 0; @@ -1340,10 +1273,6 @@ manager_free(isc__taskmgr_t *manager) { mctx = manager->mctx; isc_mem_put(mctx, manager, sizeof(*manager)); isc_mem_detach(&mctx); - -#ifdef USE_SHARED_MANAGER - taskmgr = NULL; -#endif /* USE_SHARED_MANAGER */ } isc_result_t @@ -1361,21 +1290,6 @@ isc__taskmgr_create(isc_mem_t *mctx, unsigned int workers, REQUIRE(workers > 0); REQUIRE(managerp != NULL && *managerp == NULL); -#ifndef USE_WORKER_THREADS - UNUSED(i); - UNUSED(started); -#endif - -#ifdef USE_SHARED_MANAGER - if (taskmgr != NULL) { - if (taskmgr->refs == 0) - return (ISC_R_SHUTTINGDOWN); - taskmgr->refs++; - *managerp = (isc_taskmgr_t *)taskmgr; - return (ISC_R_SUCCESS); - } -#endif /* USE_SHARED_MANAGER */ - manager = isc_mem_get(mctx, sizeof(*manager)); if (manager == NULL) return (ISC_R_NOMEMORY); @@ -1393,7 +1307,6 @@ isc__taskmgr_create(isc_mem_t *mctx, unsigned int workers, goto cleanup_mgr; } -#ifdef USE_WORKER_THREADS manager->workers = 0; manager->threads = isc_mem_allocate(mctx, workers * sizeof(isc_thread_t)); @@ -1425,7 +1338,6 @@ isc__taskmgr_create(isc_mem_t *mctx, unsigned int workers, result = ISC_R_UNEXPECTED; goto cleanup_exclusivegranted; } -#endif /* USE_WORKER_THREADS */ if (default_quantum == 0) default_quantum = DEFAULT_DEFAULT_QUANTUM; manager->default_quantum = default_quantum; @@ -1441,7 +1353,6 @@ isc__taskmgr_create(isc_mem_t *mctx, unsigned int workers, isc_mem_attach(mctx, &manager->mctx); -#ifdef USE_WORKER_THREADS LOCK(&manager->lock); /* * Start workers. @@ -1465,17 +1376,11 @@ isc__taskmgr_create(isc_mem_t *mctx, unsigned int workers, return (ISC_R_NOTHREADS); } isc_thread_setconcurrency(workers); -#endif /* USE_WORKER_THREADS */ -#ifdef USE_SHARED_MANAGER - manager->refs = 1; - taskmgr = manager; -#endif /* USE_SHARED_MANAGER */ *managerp = (isc_taskmgr_t *)manager; return (ISC_R_SUCCESS); -#ifdef USE_WORKER_THREADS cleanup_exclusivegranted: (void)isc_condition_destroy(&manager->exclusive_granted); cleanup_workavailable: @@ -1484,7 +1389,6 @@ isc__taskmgr_create(isc_mem_t *mctx, unsigned int workers, isc_mem_free(mctx, manager->threads); cleanup_lock: DESTROYLOCK(&manager->lock); -#endif cleanup_mgr: isc_mem_put(mctx, manager, sizeof(*manager)); return (result); @@ -1504,18 +1408,6 @@ isc__taskmgr_destroy(isc_taskmgr_t **managerp) { manager = (isc__taskmgr_t *)*managerp; REQUIRE(VALID_MANAGER(manager)); -#ifndef USE_WORKER_THREADS - UNUSED(i); -#endif /* USE_WORKER_THREADS */ - -#ifdef USE_SHARED_MANAGER - manager->refs--; - if (manager->refs > 0) { - *managerp = NULL; - return; - } -#endif - XTHREADTRACE("isc_taskmgr_destroy"); /* * Only one non-worker thread may ever call this routine. @@ -1567,7 +1459,6 @@ isc__taskmgr_destroy(isc_taskmgr_t **managerp) { push_readyq(manager, task); UNLOCK(&task->lock); } -#ifdef USE_WORKER_THREADS /* * Wake up any sleeping workers. This ensures we get work done if * there's work left to do, and if there are already no tasks left @@ -1581,28 +1472,6 @@ isc__taskmgr_destroy(isc_taskmgr_t **managerp) { */ for (i = 0; i < manager->workers; i++) (void)isc_thread_join(manager->threads[i], NULL); -#else /* USE_WORKER_THREADS */ - /* - * Dispatch the shutdown events. - */ - UNLOCK(&manager->lock); - while (isc__taskmgr_ready((isc_taskmgr_t *)manager)) - (void)isc__taskmgr_dispatch((isc_taskmgr_t *)manager); - if (!ISC_LIST_EMPTY(manager->tasks)) { - isc__task_t *t; - isc_mem_printallactive(stderr); - for (t = ISC_LIST_HEAD(manager->tasks); - t != NULL; - t = ISC_LIST_NEXT(t, link)) - { - fprintf(stderr, "task: %p (%s)\n", t, t->name); - } - } - INSIST(ISC_LIST_EMPTY(manager->tasks)); -#ifdef USE_SHARED_MANAGER - taskmgr = NULL; -#endif -#endif /* USE_WORKER_THREADS */ manager_free(manager); @@ -1628,43 +1497,6 @@ isc__taskmgr_mode(isc_taskmgr_t *manager0) { return (mode); } -#ifndef USE_WORKER_THREADS -bool -isc__taskmgr_ready(isc_taskmgr_t *manager0) { - isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0; - bool is_ready; - -#ifdef USE_SHARED_MANAGER - if (manager == NULL) - manager = taskmgr; -#endif - if (manager == NULL) - return (false); - - LOCK(&manager->lock); - is_ready = !empty_readyq(manager); - UNLOCK(&manager->lock); - - return (is_ready); -} - -isc_result_t -isc__taskmgr_dispatch(isc_taskmgr_t *manager0) { - isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0; - -#ifdef USE_SHARED_MANAGER - if (manager == NULL) - manager = taskmgr; -#endif - if (manager == NULL) - return (ISC_R_NOTFOUND); - - dispatch(manager); - - return (ISC_R_SUCCESS); -} - -#else void isc__taskmgr_pause(isc_taskmgr_t *manager0) { isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0; @@ -1687,7 +1519,6 @@ isc__taskmgr_resume(isc_taskmgr_t *manager0) { } UNLOCK(&manager->lock); } -#endif /* USE_WORKER_THREADS */ void isc_taskmgr_setexcltask(isc_taskmgr_t *mgr0, isc_task_t *task0) { @@ -1723,7 +1554,6 @@ isc_taskmgr_excltask(isc_taskmgr_t *mgr0, isc_task_t **taskp) { isc_result_t isc__task_beginexclusive(isc_task_t *task0) { -#ifdef USE_WORKER_THREADS isc__task_t *task = (isc__task_t *)task0; isc__taskmgr_t *manager = task->manager; @@ -1743,15 +1573,11 @@ isc__task_beginexclusive(isc_task_t *task0) { WAIT(&manager->exclusive_granted, &manager->lock); } UNLOCK(&manager->lock); -#else - UNUSED(task0); -#endif return (ISC_R_SUCCESS); } void isc__task_endexclusive(isc_task_t *task0) { -#ifdef USE_WORKER_THREADS isc__task_t *task = (isc__task_t *)task0; isc__taskmgr_t *manager = task->manager; @@ -1761,9 +1587,6 @@ isc__task_endexclusive(isc_task_t *task0) { manager->exclusive_requested = false; BROADCAST(&manager->work_available); UNLOCK(&manager->lock); -#else - UNUSED(task0); -#endif } void @@ -1833,7 +1656,6 @@ isc_taskmgr_renderxml(isc_taskmgr_t *mgr0, xmlTextWriterPtr writer) { * on which type is enabled. */ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "thread-model")); -#ifdef ISC_PLATFORM_USETHREADS TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "type")); TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR "threaded")); TRY0(xmlTextWriterEndElement(writer)); /* type */ @@ -1841,15 +1663,6 @@ isc_taskmgr_renderxml(isc_taskmgr_t *mgr0, xmlTextWriterPtr writer) { TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "worker-threads")); TRY0(xmlTextWriterWriteFormatString(writer, "%d", mgr->workers)); TRY0(xmlTextWriterEndElement(writer)); /* worker-threads */ -#else /* ISC_PLATFORM_USETHREADS */ - TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "type")); - TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR "non-threaded")); - TRY0(xmlTextWriterEndElement(writer)); /* type */ - - TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "references")); - TRY0(xmlTextWriterWriteFormatString(writer, "%d", mgr->refs)); - TRY0(xmlTextWriterEndElement(writer)); /* references */ -#endif /* ISC_PLATFORM_USETHREADS */ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "default-quantum")); TRY0(xmlTextWriterWriteFormatString(writer, "%d", @@ -1942,7 +1755,6 @@ isc_taskmgr_renderjson(isc_taskmgr_t *mgr0, json_object *tasks) { * Write out the thread-model, and some details about each depending * on which type is enabled. */ -#ifdef ISC_PLATFORM_USETHREADS obj = json_object_new_string("threaded"); CHECKMEM(obj); json_object_object_add(tasks, "thread-model", obj); @@ -1950,15 +1762,6 @@ isc_taskmgr_renderjson(isc_taskmgr_t *mgr0, json_object *tasks) { obj = json_object_new_int(mgr->workers); CHECKMEM(obj); json_object_object_add(tasks, "worker-threads", obj); -#else /* ISC_PLATFORM_USETHREADS */ - obj = json_object_new_string("non-threaded"); - CHECKMEM(obj); - json_object_object_add(tasks, "thread-model", obj); - - obj = json_object_new_int(mgr->refs); - CHECKMEM(obj); - json_object_object_add(tasks, "references", obj); -#endif /* ISC_PLATFORM_USETHREADS */ obj = json_object_new_int(mgr->default_quantum); CHECKMEM(obj); diff --git a/lib/isc/tests/isctest.c b/lib/isc/tests/isctest.c index 474fa9887f..fae6995bde 100644 --- a/lib/isc/tests/isctest.c +++ b/lib/isc/tests/isctest.c @@ -72,11 +72,7 @@ create_managers(unsigned int workers) { char *p; if (workers == 0) { -#ifdef ISC_PLATFORM_USETHREADS workers = isc_os_ncpus(); -#else - workers = 1; -#endif } p = getenv("ISC_TASK_WORKERS"); @@ -125,11 +121,7 @@ isc_test_begin(FILE *logfile, bool start_managers, CHECK(isc_log_usechannel(logconfig, "stderr", NULL, NULL)); } -#ifdef ISC_PLATFORM_USETHREADS ncpus = isc_os_ncpus(); -#else - ncpus = 1; -#endif if (start_managers) { CHECK(create_managers(workers)); diff --git a/lib/isc/tests/socket_test.c b/lib/isc/tests/socket_test.c index 9ccacbf6e7..84627a143e 100644 --- a/lib/isc/tests/socket_test.c +++ b/lib/isc/tests/socket_test.c @@ -86,10 +86,6 @@ static isc_result_t waitfor(completion_t *completion) { int i = 0; while (!completion->done && i++ < 5000) { -#ifndef ISC_PLATFORM_USETHREADS - while (isc__taskmgr_ready(taskmgr)) - isc__taskmgr_dispatch(taskmgr); -#endif isc_test_nap(1000); } if (completion->done) @@ -112,19 +108,6 @@ waitfor(completion_t *completion) { static void waitbody(void) { -#ifndef ISC_PLATFORM_USETHREADS - struct timeval tv; - isc_socketwait_t *swait = NULL; - - while (isc__taskmgr_ready(taskmgr)) - isc__taskmgr_dispatch(taskmgr); - if (socketmgr != NULL) { - tv.tv_sec = 0; - tv.tv_usec = 1000 ; - if (isc__socketmgr_waitevents(socketmgr, &tv, &swait) > 0) - isc__socketmgr_dispatch(socketmgr, swait); - } else -#endif isc_test_nap(1000); } diff --git a/lib/isc/tests/task_test.c b/lib/isc/tests/task_test.c index 63fad3a2b2..58916e4621 100644 --- a/lib/isc/tests/task_test.c +++ b/lib/isc/tests/task_test.c @@ -40,9 +40,7 @@ int counter = 0; static int active[10]; static bool done = false; -#ifdef ISC_PLATFORM_USETHREADS static isc_condition_t cv; -#endif static void set(isc_task_t *task, isc_event_t *event) { @@ -138,10 +136,6 @@ ATF_TC_BODY(all_events, tc) { isc_task_send(task, &event); while ((a == 0 || b == 0) && i++ < 5000) { -#ifndef ISC_PLATFORM_USETHREADS - while (isc__taskmgr_ready(taskmgr)) - isc__taskmgr_dispatch(taskmgr); -#endif isc_test_nap(1000); } @@ -175,13 +169,11 @@ ATF_TC_BODY(privileged_events, tc) { result = isc_test_begin(NULL, true, 0); ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); -#ifdef ISC_PLATFORM_USETHREADS /* * Pause the task manager so we can fill up the work queue * without things happening while we do it. */ isc__taskmgr_pause(taskmgr); -#endif result = isc_task_create(taskmgr, 0, &task1); ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); @@ -239,16 +231,10 @@ ATF_TC_BODY(privileged_events, tc) { isc_taskmgr_setmode(taskmgr, isc_taskmgrmode_privileged); ATF_CHECK_EQ(isc_taskmgr_mode(taskmgr), isc_taskmgrmode_privileged); -#ifdef ISC_PLATFORM_USETHREADS isc__taskmgr_resume(taskmgr); -#endif /* We're waiting for *all* variables to be set */ while ((a == 0 || b == 0 || c == 0 || d == 0 || e == 0) && i++ < 5000) { -#ifndef ISC_PLATFORM_USETHREADS - while (isc__taskmgr_ready(taskmgr)) - isc__taskmgr_dispatch(taskmgr); -#endif isc_test_nap(1000); } @@ -304,13 +290,11 @@ ATF_TC_BODY(privilege_drop, tc) { result = isc_test_begin(NULL, true, 0); ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); -#ifdef ISC_PLATFORM_USETHREADS /* * Pause the task manager so we can fill up the work queue * without things happening while we do it. */ isc__taskmgr_pause(taskmgr); -#endif result = isc_task_create(taskmgr, 0, &task1); ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); @@ -368,17 +352,11 @@ ATF_TC_BODY(privilege_drop, tc) { isc_taskmgr_setmode(taskmgr, isc_taskmgrmode_privileged); ATF_CHECK_EQ(isc_taskmgr_mode(taskmgr), isc_taskmgrmode_privileged); -#ifdef ISC_PLATFORM_USETHREADS isc__taskmgr_resume(taskmgr); -#endif /* We're waiting for all variables to be set. */ while ((a == -1 || b == -1 || c == -1 || d == -1 || e == -1) && i++ < 5000) { -#ifndef ISC_PLATFORM_USETHREADS - while (isc__taskmgr_ready(taskmgr)) - isc__taskmgr_dispatch(taskmgr); -#endif isc_test_nap(1000); } @@ -645,10 +623,6 @@ ATF_TC_BODY(task_exclusive, tc) { isc_test_end(); } -/* - * The remainder of these tests require threads - */ -#ifdef ISC_PLATFORM_USETHREADS /* * Max tasks test: * The task system can create and execute many tasks. Tests with 10000. @@ -1446,7 +1420,6 @@ ATF_TC_HEAD(purgeevent_notpurge, tc) { ATF_TC_BODY(purgeevent_notpurge, tc) { try_purgeevent(false); } -#endif /* * Main @@ -1458,8 +1431,6 @@ ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, privilege_drop); ATF_TP_ADD_TC(tp, basic); ATF_TP_ADD_TC(tp, task_exclusive); - -#ifdef ISC_PLATFORM_USETHREADS ATF_TP_ADD_TC(tp, manytasks); ATF_TP_ADD_TC(tp, shutdown); ATF_TP_ADD_TC(tp, post_shutdown); @@ -1467,8 +1438,6 @@ ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, purgerange); ATF_TP_ADD_TC(tp, purgeevent); ATF_TP_ADD_TC(tp, purgeevent_notpurge); -#endif - return (atf_no_error()); } diff --git a/lib/isc/tests/timer_test.c b/lib/isc/tests/timer_test.c index 7a32f1dd0d..473cb7fc50 100644 --- a/lib/isc/tests/timer_test.c +++ b/lib/isc/tests/timer_test.c @@ -29,11 +29,6 @@ #include "isctest.h" -/* - * This entire test requires threads. - */ -#ifdef ISC_PLATFORM_USETHREADS - /* * Helper functions */ @@ -564,30 +559,15 @@ ATF_TC_BODY(purge, tc) { isc_test_end(); } -#else -ATF_TC(untested); -ATF_TC_HEAD(untested, tc) { - atf_tc_set_md_var(tc, "descr", "skipping nsec3 test"); -} -ATF_TC_BODY(untested, tc) { - UNUSED(tc); - atf_tc_skip("DNSSEC not available"); -} -#endif /* * Main */ ATF_TP_ADD_TCS(tp) { -#ifdef ISC_PLATFORM_USETHREADS ATF_TP_ADD_TC(tp, ticker); ATF_TP_ADD_TC(tp, once_life); ATF_TP_ADD_TC(tp, once_idle); ATF_TP_ADD_TC(tp, reset); ATF_TP_ADD_TC(tp, purge); -#else - ATF_TP_ADD_TC(tp, untested); -#endif - return (atf_no_error()); } diff --git a/lib/isc/timer.c b/lib/isc/timer.c index 714ae591ac..d85fe97069 100644 --- a/lib/isc/timer.c +++ b/lib/isc/timer.c @@ -36,17 +36,6 @@ #include #endif -/* See task.c about the following definition: */ -#ifdef ISC_PLATFORM_USETHREADS -#define USE_TIMER_THREAD -#else -#define USE_SHARED_MANAGER -#endif /* ISC_PLATFORM_USETHREADS */ - -#ifndef USE_TIMER_THREAD -#include "timer_p.h" -#endif /* USE_TIMER_THREAD */ - #ifdef ISC_TIMER_TRACE #define XTRACE(s) fprintf(stderr, "%s\n", (s)) #define XTRACEID(s, t) fprintf(stderr, "%s %p\n", (s), (t)) @@ -103,13 +92,8 @@ struct isc__timermgr { LIST(isc__timer_t) timers; unsigned int nscheduled; isc_time_t due; -#ifdef USE_TIMER_THREAD isc_condition_t wakeup; isc_thread_t thread; -#endif /* USE_TIMER_THREAD */ -#ifdef USE_SHARED_MANAGER - unsigned int refs; -#endif /* USE_SHARED_MANAGER */ isc_heap_t * heap; }; @@ -171,22 +155,13 @@ static struct isc__timermgrmethods { (void *)isc_timermgr_poke }; -#ifdef USE_SHARED_MANAGER -/*! - * If the manager is supposed to be shared, there can be only one. - */ -static isc__timermgr_t *timermgr = NULL; -#endif /* USE_SHARED_MANAGER */ - static inline isc_result_t schedule(isc__timer_t *timer, isc_time_t *now, bool signal_ok) { isc_result_t result; isc__timermgr_t *manager; isc_time_t due; int cmp; -#ifdef USE_TIMER_THREAD bool timedwait; -#endif /*! * Note: the caller must ensure locking. @@ -194,20 +169,14 @@ schedule(isc__timer_t *timer, isc_time_t *now, bool signal_ok) { REQUIRE(timer->type != isc_timertype_inactive); -#ifndef USE_TIMER_THREAD - UNUSED(signal_ok); -#endif /* USE_TIMER_THREAD */ - manager = timer->manager; -#ifdef USE_TIMER_THREAD /*! * If the manager was timed wait, we may need to signal the * manager to force a wakeup. */ timedwait = (manager->nscheduled > 0 && isc_time_seconds(&manager->due) != 0); -#endif /* * Compute the new due time. @@ -270,7 +239,6 @@ schedule(isc__timer_t *timer, isc_time_t *now, bool signal_ok) { * the current "next" timer. We do this either by waking up the * run thread, or explicitly setting the value in the manager. */ -#ifdef USE_TIMER_THREAD /* * This is a temporary (probably) hack to fix a bug on tru64 5.1 @@ -303,20 +271,13 @@ schedule(isc__timer_t *timer, isc_time_t *now, bool signal_ok) { "signal (schedule)")); SIGNAL(&manager->wakeup); } -#else /* USE_TIMER_THREAD */ - if (timer->index == 1 && - isc_time_compare(&timer->due, &manager->due) < 0) - manager->due = timer->due; -#endif /* USE_TIMER_THREAD */ return (ISC_R_SUCCESS); } static inline void deschedule(isc__timer_t *timer) { -#ifdef USE_TIMER_THREAD bool need_wakeup = false; -#endif isc__timermgr_t *manager; /* @@ -325,22 +286,18 @@ deschedule(isc__timer_t *timer) { manager = timer->manager; if (timer->index > 0) { -#ifdef USE_TIMER_THREAD if (timer->index == 1) need_wakeup = true; -#endif isc_heap_delete(manager->heap, timer->index); timer->index = 0; INSIST(manager->nscheduled > 0); manager->nscheduled--; -#ifdef USE_TIMER_THREAD if (need_wakeup) { XTRACE(isc_msgcat_get(isc_msgcat, ISC_MSGSET_TIMER, ISC_MSG_SIGNALDESCHED, "signal (deschedule)")); SIGNAL(&manager->wakeup); } -#endif /* USE_TIMER_THREAD */ } } @@ -777,7 +734,6 @@ dispatch(isc__timermgr_t *manager, isc_time_t *now) { } } -#ifdef USE_TIMER_THREAD static isc_threadresult_t #ifdef _WIN32 /* XXXDCL */ WINAPI @@ -822,7 +778,6 @@ run(void *uap) { return ((isc_threadresult_t)0); } -#endif /* USE_TIMER_THREAD */ static bool sooner(void *v1, void *v2) { @@ -859,14 +814,6 @@ isc__timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) { REQUIRE(managerp != NULL && *managerp == NULL); -#ifdef USE_SHARED_MANAGER - if (timermgr != NULL) { - timermgr->refs++; - *managerp = (isc_timermgr_t *)timermgr; - return (ISC_R_SUCCESS); - } -#endif /* USE_SHARED_MANAGER */ - manager = isc_mem_get(mctx, sizeof(*manager)); if (manager == NULL) return (ISC_R_NOMEMORY); @@ -893,7 +840,6 @@ isc__timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) { return (result); } isc_mem_attach(mctx, &manager->mctx); -#ifdef USE_TIMER_THREAD if (isc_condition_init(&manager->wakeup) != ISC_R_SUCCESS) { isc_mem_detach(&manager->mctx); DESTROYLOCK(&manager->lock); @@ -919,11 +865,6 @@ isc__timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) { return (ISC_R_UNEXPECTED); } isc_thread_setname(manager->thread, "isc-timer"); -#endif -#ifdef USE_SHARED_MANAGER - manager->refs = 1; - timermgr = manager; -#endif /* USE_SHARED_MANAGER */ *managerp = (isc_timermgr_t *)manager; @@ -932,15 +873,11 @@ isc__timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) { void isc_timermgr_poke(isc_timermgr_t *manager0) { -#ifdef USE_TIMER_THREAD isc__timermgr_t *manager = (isc__timermgr_t *)manager0; REQUIRE(VALID_MANAGER(manager)); SIGNAL(&manager->wakeup); -#else - UNUSED(manager0); -#endif } void @@ -958,32 +895,15 @@ isc__timermgr_destroy(isc_timermgr_t **managerp) { LOCK(&manager->lock); -#ifdef USE_SHARED_MANAGER - manager->refs--; - if (manager->refs > 0) { - UNLOCK(&manager->lock); - *managerp = NULL; - return; - } - timermgr = NULL; -#endif /* USE_SHARED_MANAGER */ - -#ifndef USE_TIMER_THREAD - isc__timermgr_dispatch((isc_timermgr_t *)manager); -#endif - REQUIRE(EMPTY(manager->timers)); manager->done = true; -#ifdef USE_TIMER_THREAD XTRACE(isc_msgcat_get(isc_msgcat, ISC_MSGSET_TIMER, ISC_MSG_SIGNALDESTROY, "signal (destroy)")); SIGNAL(&manager->wakeup); -#endif /* USE_TIMER_THREAD */ UNLOCK(&manager->lock); -#ifdef USE_TIMER_THREAD /* * Wait for thread to exit. */ @@ -992,14 +912,11 @@ isc__timermgr_destroy(isc_timermgr_t **managerp) { "isc_thread_join() %s", isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL, ISC_MSG_FAILED, "failed")); -#endif /* USE_TIMER_THREAD */ /* * Clean up. */ -#ifdef USE_TIMER_THREAD (void)isc_condition_destroy(&manager->wakeup); -#endif /* USE_TIMER_THREAD */ DESTROYLOCK(&manager->lock); isc_heap_destroy(&manager->heap); manager->common.impmagic = 0; @@ -1010,42 +927,8 @@ isc__timermgr_destroy(isc_timermgr_t **managerp) { *managerp = NULL; -#ifdef USE_SHARED_MANAGER - timermgr = NULL; -#endif } -#ifndef USE_TIMER_THREAD -isc_result_t -isc__timermgr_nextevent(isc_timermgr_t *manager0, isc_time_t *when) { - isc__timermgr_t *manager = (isc__timermgr_t *)manager0; - -#ifdef USE_SHARED_MANAGER - if (manager == NULL) - manager = timermgr; -#endif - if (manager == NULL || manager->nscheduled == 0) - return (ISC_R_NOTFOUND); - *when = manager->due; - return (ISC_R_SUCCESS); -} - -void -isc__timermgr_dispatch(isc_timermgr_t *manager0) { - isc__timermgr_t *manager = (isc__timermgr_t *)manager0; - isc_time_t now; - -#ifdef USE_SHARED_MANAGER - if (manager == NULL) - manager = timermgr; -#endif - if (manager == NULL) - return; - TIME_NOW(&now); - dispatch(manager, &now); -} -#endif /* USE_TIMER_THREAD */ - isc_result_t isc__timer_register(void) { return (isc_timer_register(isc__timermgr_create)); diff --git a/lib/isc/unix/Makefile.in b/lib/isc/unix/Makefile.in index badc028dfd..c558494825 100644 --- a/lib/isc/unix/Makefile.in +++ b/lib/isc/unix/Makefile.in @@ -12,7 +12,7 @@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ CINCLUDES = -I${srcdir}/include \ - -I${srcdir}/../@ISC_THREAD_DIR@/include \ + -I${srcdir}/../pthreads/include \ -I../include \ -I${srcdir}/../include \ -I${srcdir}/.. @OPENSSL_INCLUDES@ diff --git a/lib/isc/unix/app.c b/lib/isc/unix/app.c index 2875671fe3..3c6662632d 100644 --- a/lib/isc/unix/app.c +++ b/lib/isc/unix/app.c @@ -41,9 +41,7 @@ #include #include -#ifdef ISC_PLATFORM_USETHREADS #include -#endif /*% * For BIND9 internal applications built with threads, we use a single app @@ -51,14 +49,7 @@ * For other cases (including BIND9 built without threads) an app context acts * as an event loop dispatching various events. */ -#ifndef ISC_PLATFORM_USETHREADS -#include "../timer_p.h" -#include "socket_p.h" -#endif /* ISC_PLATFORM_USETHREADS */ - -#ifdef ISC_PLATFORM_USETHREADS static pthread_t blockedthread; -#endif /* ISC_PLATFORM_USETHREADS */ /*% * The following are intended for internal use (indicated by "isc__" @@ -117,10 +108,8 @@ typedef struct isc__appctx { isc_taskmgr_t *taskmgr; isc_socketmgr_t *socketmgr; isc_timermgr_t *timermgr; -#ifdef ISC_PLATFORM_USETHREADS isc_mutex_t readylock; isc_condition_t ready; -#endif /* ISC_PLATFORM_USETHREADS */ } isc__appctx_t; static isc__appctx_t isc_g_appctx; @@ -231,7 +220,6 @@ isc__app_ctxstart(isc_appctx_t *ctx0) { } #endif -#ifdef ISC_PLATFORM_USETHREADS #ifdef HAVE_LINUXTHREADS main_thread = pthread_self(); #endif /* HAVE_LINUXTHREADS */ @@ -244,14 +232,9 @@ isc__app_ctxstart(isc_appctx_t *ctx0) { if (result != ISC_R_SUCCESS) goto cleanup_rlock; - result = isc_mutex_init(&ctx->lock); - if (result != ISC_R_SUCCESS) - goto cleanup_rcond; -#else /* ISC_PLATFORM_USETHREADS */ result = isc_mutex_init(&ctx->lock); if (result != ISC_R_SUCCESS) goto cleanup; -#endif /* ISC_PLATFORM_USETHREADS */ ISC_LIST_INIT(ctx->on_run); @@ -306,7 +289,6 @@ isc__app_ctxstart(isc_appctx_t *ctx0) { goto cleanup; #endif -#ifdef ISC_PLATFORM_USETHREADS /* * Block SIGHUP, SIGINT, SIGTERM. * @@ -335,44 +317,14 @@ isc__app_ctxstart(isc_appctx_t *ctx0) { result = ISC_R_UNEXPECTED; goto cleanup; } -#else /* ISC_PLATFORM_USETHREADS */ - /* - * Unblock SIGHUP, SIGINT, SIGTERM. - * - * If we're not using threads, we need to make sure that SIGHUP, - * SIGINT and SIGTERM are not inherited as blocked from the parent - * process. - */ - if (sigemptyset(&sset) != 0 || - sigaddset(&sset, SIGHUP) != 0 || - sigaddset(&sset, SIGINT) != 0 || - sigaddset(&sset, SIGTERM) != 0) { - isc__strerror(errno, strbuf, sizeof(strbuf)); - UNEXPECTED_ERROR(__FILE__, __LINE__, - "isc_app_start() sigsetops: %s", strbuf); - result = ISC_R_UNEXPECTED; - goto cleanup; - } - presult = sigprocmask(SIG_UNBLOCK, &sset, NULL); - if (presult != 0) { - isc__strerror(errno, strbuf, sizeof(strbuf)); - UNEXPECTED_ERROR(__FILE__, __LINE__, - "isc_app_start() sigprocmask: %s", strbuf); - result = ISC_R_UNEXPECTED; - goto cleanup; - } -#endif /* ISC_PLATFORM_USETHREADS */ return (ISC_R_SUCCESS); cleanup: -#ifdef ISC_PLATFORM_USETHREADS - cleanup_rcond: (void)isc_condition_destroy(&ctx->ready); cleanup_rlock: (void)isc_mutex_destroy(&ctx->readylock); -#endif /* ISC_PLATFORM_USETHREADS */ return (result); } @@ -434,159 +386,17 @@ isc__app_ctxonrun(isc_appctx_t *ctx0, isc_mem_t *mctx, isc_task_t *task, return (result); } -#ifndef ISC_PLATFORM_USETHREADS -/*! - * Event loop for nonthreaded programs. - */ -static isc_result_t -evloop(isc__appctx_t *ctx) { - isc_result_t result; - - while (!ctx->want_shutdown) { - int n; - isc_time_t when, now; - struct timeval tv, *tvp; - isc_socketwait_t *swait; - bool readytasks; - bool call_timer_dispatch = false; - - /* - * Check the reload (or suspend) case first for exiting the - * loop as fast as possible in case: - * - the direct call to isc__taskmgr_dispatch() in - * isc__app_ctxrun() completes all the tasks so far, - * - there is thus currently no active task, and - * - there is a timer event - */ - if (ctx->want_reload) { - ctx->want_reload = false; - return (ISC_R_RELOAD); - } - - readytasks = isc__taskmgr_ready(ctx->taskmgr); - if (readytasks) { - tv.tv_sec = 0; - tv.tv_usec = 0; - tvp = &tv; - call_timer_dispatch = true; - } else { - result = isc__timermgr_nextevent(ctx->timermgr, &when); - if (result != ISC_R_SUCCESS) - tvp = NULL; - else { - uint64_t us; - - TIME_NOW(&now); - us = isc_time_microdiff(&when, &now); - if (us == 0) - call_timer_dispatch = true; - tv.tv_sec = us / 1000000; - tv.tv_usec = us % 1000000; - tvp = &tv; - } - } - - swait = NULL; - n = isc__socketmgr_waitevents(ctx->socketmgr, tvp, &swait); - - if (n == 0 || call_timer_dispatch) { - /* - * We call isc__timermgr_dispatch() only when - * necessary, in order to reduce overhead. If the - * select() call indicates a timeout, we need the - * dispatch. Even if not, if we set the 0-timeout - * for the select() call, we need to check the timer - * events. In the 'readytasks' case, there may be no - * timeout event actually, but there is no other way - * to reduce the overhead. - * Note that we do not have to worry about the case - * where a new timer is inserted during the select() - * call, since this loop only runs in the non-thread - * mode. - */ - isc__timermgr_dispatch(ctx->timermgr); - } - if (n > 0) - (void)isc__socketmgr_dispatch(ctx->socketmgr, swait); - (void)isc__taskmgr_dispatch(ctx->taskmgr); - } - return (ISC_R_SUCCESS); -} - -/* - * This is a gross hack to support waiting for condition - * variables in nonthreaded programs in a limited way; - * see lib/isc/nothreads/include/isc/condition.h. - * We implement isc_condition_wait() by entering the - * event loop recursively until the want_shutdown flag - * is set by isc_condition_signal(). - */ - -/*! - * \brief True if we are currently executing in the recursive - * event loop. - */ -static bool in_recursive_evloop = false; - -/*! - * \brief True if we are exiting the event loop as the result of - * a call to isc_condition_signal() rather than a shutdown - * or reload. - */ -static bool signalled = false; - -isc_result_t -isc__nothread_wait_hack(isc_condition_t *cp, isc_mutex_t *mp) { - isc_result_t result; - - UNUSED(cp); - UNUSED(mp); - - INSIST(!in_recursive_evloop); - in_recursive_evloop = true; - - INSIST(*mp == 1); /* Mutex must be locked on entry. */ - --*mp; - - result = evloop(&isc_g_appctx); - if (result == ISC_R_RELOAD) - isc_g_appctx.want_reload = true; - if (signalled) { - isc_g_appctx.want_shutdown = false; - signalled = false; - } - - ++*mp; - in_recursive_evloop = false; - return (ISC_R_SUCCESS); -} - -isc_result_t -isc__nothread_signal_hack(isc_condition_t *cp) { - - UNUSED(cp); - - INSIST(in_recursive_evloop); - - isc_g_appctx.want_shutdown = true; - signalled = true; - return (ISC_R_SUCCESS); -} -#endif /* ISC_PLATFORM_USETHREADS */ - isc_result_t isc__app_ctxrun(isc_appctx_t *ctx0) { isc__appctx_t *ctx = (isc__appctx_t *)ctx0; int result; isc_event_t *event, *next_event; isc_task_t *task; -#ifdef ISC_PLATFORM_USETHREADS sigset_t sset; char strbuf[ISC_STRERRORSIZE]; #ifdef HAVE_SIGWAIT int sig; #endif /* HAVE_SIGWAIT */ -#endif /* ISC_PLATFORM_USETHREADS */ REQUIRE(VALID_APPCTX(ctx)); @@ -616,17 +426,6 @@ isc__app_ctxrun(isc_appctx_t *ctx0) { UNLOCK(&ctx->lock); -#ifndef ISC_PLATFORM_USETHREADS - if (isc_bind9 && ctx == &isc_g_appctx) { - result = handle_signal(SIGHUP, reload_action); - if (result != ISC_R_SUCCESS) - return (ISC_R_SUCCESS); - } - - (void) isc__taskmgr_dispatch(ctx->taskmgr); - result = evloop(ctx); - return (result); -#else /* ISC_PLATFORM_USETHREADS */ /* * BIND9 internal tools using multiple contexts do not * rely on signal. @@ -746,7 +545,6 @@ isc__app_ctxrun(isc_appctx_t *ctx0) { } return (ISC_R_SUCCESS); -#endif /* ISC_PLATFORM_USETHREADS */ } isc_result_t @@ -758,9 +556,7 @@ isc_result_t isc__app_ctxshutdown(isc_appctx_t *ctx0) { isc__appctx_t *ctx = (isc__appctx_t *)ctx0; bool want_kill = true; -#ifdef ISC_PLATFORM_USETHREADS char strbuf[ISC_STRERRORSIZE]; -#endif /* ISC_PLATFORM_USETHREADS */ REQUIRE(VALID_APPCTX(ctx)); @@ -780,9 +576,6 @@ isc__app_ctxshutdown(isc_appctx_t *ctx0) { /* BIND9 internal, but using multiple contexts */ ctx->want_shutdown = true; else { -#ifndef ISC_PLATFORM_USETHREADS - ctx->want_shutdown = true; -#else /* ISC_PLATFORM_USETHREADS */ #ifdef HAVE_LINUXTHREADS if (isc_bind9) { /* BIND9 internal, single context */ @@ -819,7 +612,6 @@ isc__app_ctxshutdown(isc_appctx_t *ctx0) { UNLOCK(&ctx->readylock); SIGNAL(&ctx->ready); } -#endif /* ISC_PLATFORM_USETHREADS */ } } @@ -835,9 +627,7 @@ isc_result_t isc__app_ctxsuspend(isc_appctx_t *ctx0) { isc__appctx_t *ctx = (isc__appctx_t *)ctx0; bool want_kill = true; -#ifdef ISC_PLATFORM_USETHREADS char strbuf[ISC_STRERRORSIZE]; -#endif REQUIRE(VALID_APPCTX(ctx)); @@ -858,9 +648,7 @@ isc__app_ctxsuspend(isc_appctx_t *ctx0) { /* BIND9 internal, but using multiple contexts */ ctx->want_reload = true; else { -#ifndef ISC_PLATFORM_USETHREADS ctx->want_reload = true; -#else /* ISC_PLATFORM_USETHREADS */ #ifdef HAVE_LINUXTHREADS if (isc_bind9) { /* BIND9 internal, single context */ @@ -897,7 +685,6 @@ isc__app_ctxsuspend(isc_appctx_t *ctx0) { UNLOCK(&ctx->readylock); SIGNAL(&ctx->ready); } -#endif /* ISC_PLATFORM_USETHREADS */ } } @@ -925,41 +712,33 @@ isc__app_finish(void) { void isc__app_block(void) { -#ifdef ISC_PLATFORM_USETHREADS sigset_t sset; -#endif /* ISC_PLATFORM_USETHREADS */ REQUIRE(isc_g_appctx.running); REQUIRE(!isc_g_appctx.blocked); isc_g_appctx.blocked = true; -#ifdef ISC_PLATFORM_USETHREADS blockedthread = pthread_self(); RUNTIME_CHECK(sigemptyset(&sset) == 0 && sigaddset(&sset, SIGINT) == 0 && sigaddset(&sset, SIGTERM) == 0); RUNTIME_CHECK(pthread_sigmask(SIG_UNBLOCK, &sset, NULL) == 0); -#endif /* ISC_PLATFORM_USETHREADS */ } void isc__app_unblock(void) { -#ifdef ISC_PLATFORM_USETHREADS sigset_t sset; -#endif /* ISC_PLATFORM_USETHREADS */ REQUIRE(isc_g_appctx.running); REQUIRE(isc_g_appctx.blocked); isc_g_appctx.blocked = false; -#ifdef ISC_PLATFORM_USETHREADS REQUIRE(blockedthread == pthread_self()); RUNTIME_CHECK(sigemptyset(&sset) == 0 && sigaddset(&sset, SIGINT) == 0 && sigaddset(&sset, SIGTERM) == 0); RUNTIME_CHECK(pthread_sigmask(SIG_BLOCK, &sset, NULL) == 0); -#endif /* ISC_PLATFORM_USETHREADS */ } isc_result_t diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index 5e12edb686..efb4c13c0c 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -84,17 +84,6 @@ #include "errno2result.h" -/* See task.c about the following definition: */ -#ifdef ISC_PLATFORM_USETHREADS -#define USE_WATCHER_THREAD -#else -#define USE_SHARED_MANAGER -#endif /* ISC_PLATFORM_USETHREADS */ - -#ifndef USE_WATCHER_THREAD -#include "socket_p.h" -#endif /* USE_WATCHER_THREAD */ - #if defined(SO_BSDCOMPAT) && defined(__linux__) #include #endif @@ -120,21 +109,6 @@ typedef struct { #define USE_SELECT #endif /* ISC_PLATFORM_HAVEKQUEUE */ -#ifndef USE_WATCHER_THREAD -#if defined(USE_KQUEUE) || defined(USE_EPOLL) || defined(USE_DEVPOLL) -struct isc_socketwait { - int nevents; -}; -#elif defined (USE_SELECT) -struct isc_socketwait { - fd_set *readset; - fd_set *writeset; - int nfds; - int maxfd; -}; -#endif /* USE_KQUEUE */ -#endif /* !USE_WATCHER_THREAD */ - /* * Set by the -T dscp option on the command line. If set to a value * other than -1, we check to make sure DSCP values match it, and @@ -215,13 +189,8 @@ typedef enum { poll_idle, poll_active, poll_checking } pollstate_t; /*% * Size of per-FD lock buckets. */ -#ifdef ISC_PLATFORM_USETHREADS #define FDLOCK_COUNT 1024 #define FDLOCK_ID(fd) ((fd) % FDLOCK_COUNT) -#else -#define FDLOCK_COUNT 1 -#define FDLOCK_ID(fd) 0 -#endif /* ISC_PLATFORM_USETHREADS */ /*% * Maximum number of events communicated with the kernel. There should normally @@ -443,9 +412,7 @@ struct isc__socketmgr { int fd_bufsize; #endif /* USE_SELECT */ unsigned int maxsocks; -#ifdef ISC_PLATFORM_USETHREADS int pipe_fds[2]; -#endif /* Locked by fdlock. */ isc__socket_t **fds; @@ -467,19 +434,11 @@ struct isc__socketmgr { int maxfd; #endif /* USE_SELECT */ int reserved; /* unlocked */ -#ifdef USE_WATCHER_THREAD isc_thread_t watcher; isc_condition_t shutdown_ok; -#else /* USE_WATCHER_THREAD */ - unsigned int refs; -#endif /* USE_WATCHER_THREAD */ int maxudp; }; -#ifdef USE_SHARED_MANAGER -static isc__socketmgr_t *socketmgr = NULL; -#endif /* USE_SHARED_MANAGER */ - #define CLOSED 0 /* this one must be zero */ #define MANAGED 1 #define CLOSE_PENDING 2 @@ -516,9 +475,7 @@ static void build_msghdr_send(isc__socket_t *, char *, isc_socketevent_t *, struct msghdr *, struct iovec *, size_t *); static void build_msghdr_recv(isc__socket_t *, char *, isc_socketevent_t *, struct msghdr *, struct iovec *, size_t *); -#ifdef USE_WATCHER_THREAD static bool process_ctlfd(isc__socketmgr_t *manager); -#endif static void setdscp(isc__socket_t *sock, isc_dscp_t dscp); /*% @@ -809,8 +766,6 @@ static const isc_statscounter_t rawstatsindex[] = { isc_sockstatscounter_rawactive }; -#if defined(USE_KQUEUE) || defined(USE_EPOLL) || defined(USE_DEVPOLL) || \ - defined(USE_WATCHER_THREAD) static void manager_log(isc__socketmgr_t *sockmgr, isc_logcategory_t *category, isc_logmodule_t *module, int level, @@ -833,7 +788,6 @@ manager_log(isc__socketmgr_t *sockmgr, isc_log_write(isc_lctx, category, module, level, "sockmgr %p: %s", sockmgr, msgbuf); } -#endif static void socket_log(isc__socket_t *sock, const isc_sockaddr_t *address, @@ -1159,7 +1113,6 @@ wakeup_socket(isc__socketmgr_t *manager, int fd, int msg) { } } -#ifdef USE_WATCHER_THREAD /* * Poke the select loop when there is something for us to do. * The write is required (by POSIX) to complete. That is, we @@ -1230,19 +1183,6 @@ select_readmsg(isc__socketmgr_t *mgr, int *fd, int *msg) { *fd = buf[0]; *msg = buf[1]; } -#else /* USE_WATCHER_THREAD */ -/* - * Update the state of the socketmgr when something changes. - */ -static void -select_poke(isc__socketmgr_t *manager, int fd, int msg) { - if (msg == SELECT_POKE_SHUTDOWN) - return; - else if (fd >= 0) - wakeup_socket(manager, fd, msg); - return; -} -#endif /* USE_WATCHER_THREAD */ /* * Make a fd non-blocking. @@ -2263,10 +2203,8 @@ socketclose(isc__socketmgr_t *manager, isc__socket_t *sock, int fd) { } UNLOCK(&manager->fdlock[lockid]); } -#ifdef ISC_PLATFORM_USETHREADS if (manager->maxfd < manager->pipe_fds[0]) manager->maxfd = manager->pipe_fds[0]; -#endif } UNLOCK(&manager->lock); @@ -2298,10 +2236,8 @@ destroy(isc__socket_t **sockp) { ISC_LIST_UNLINK(manager->socklist, sock, link); -#ifdef USE_WATCHER_THREAD if (ISC_LIST_EMPTY(manager->socklist)) SIGNAL(&manager->shutdown_ok); -#endif /* USE_WATCHER_THREAD */ /* can't unlock manager as its memory context is still used */ free_socket(sockp); @@ -4028,9 +3964,7 @@ process_fds(isc__socketmgr_t *manager, struct kevent *events, int nevents) { int i; bool readable, writable; bool done = false; -#ifdef USE_WATCHER_THREAD bool have_ctlevent = false; -#endif if (nevents == manager->nevents) { /* @@ -4046,21 +3980,17 @@ process_fds(isc__socketmgr_t *manager, struct kevent *events, int nevents) { for (i = 0; i < nevents; i++) { REQUIRE(events[i].ident < manager->maxsocks); -#ifdef USE_WATCHER_THREAD if (events[i].ident == (uintptr_t)manager->pipe_fds[0]) { have_ctlevent = true; continue; } -#endif readable = (events[i].filter == EVFILT_READ); writable = (events[i].filter == EVFILT_WRITE); process_fd(manager, events[i].ident, readable, writable); } -#ifdef USE_WATCHER_THREAD if (have_ctlevent) done = process_ctlfd(manager); -#endif return (done); } @@ -4070,9 +4000,7 @@ process_fds(isc__socketmgr_t *manager, struct epoll_event *events, int nevents) { int i; bool done = false; -#ifdef USE_WATCHER_THREAD bool have_ctlevent = false; -#endif if (nevents == manager->nevents) { manager_log(manager, ISC_LOGCATEGORY_GENERAL, @@ -4083,12 +4011,10 @@ process_fds(isc__socketmgr_t *manager, struct epoll_event *events, int nevents) for (i = 0; i < nevents; i++) { REQUIRE(events[i].data.fd < (int)manager->maxsocks); -#ifdef USE_WATCHER_THREAD if (events[i].data.fd == manager->pipe_fds[0]) { have_ctlevent = true; continue; } -#endif if ((events[i].events & EPOLLERR) != 0 || (events[i].events & EPOLLHUP) != 0) { /* @@ -4106,10 +4032,8 @@ process_fds(isc__socketmgr_t *manager, struct epoll_event *events, int nevents) (events[i].events & EPOLLOUT) != 0); } -#ifdef USE_WATCHER_THREAD if (have_ctlevent) done = process_ctlfd(manager); -#endif return (done); } @@ -4118,9 +4042,7 @@ static bool process_fds(isc__socketmgr_t *manager, struct pollfd *events, int nevents) { int i; bool done = false; -#ifdef USE_WATCHER_THREAD bool have_ctlevent = false; -#endif if (nevents == manager->nevents) { manager_log(manager, ISC_LOGCATEGORY_GENERAL, @@ -4131,21 +4053,17 @@ process_fds(isc__socketmgr_t *manager, struct pollfd *events, int nevents) { for (i = 0; i < nevents; i++) { REQUIRE(events[i].fd < (int)manager->maxsocks); -#ifdef USE_WATCHER_THREAD if (events[i].fd == manager->pipe_fds[0]) { have_ctlevent = true; continue; } -#endif process_fd(manager, events[i].fd, (events[i].events & POLLIN) != 0, (events[i].events & POLLOUT) != 0); } -#ifdef USE_WATCHER_THREAD if (have_ctlevent) done = process_ctlfd(manager); -#endif return (done); } @@ -4159,17 +4077,14 @@ process_fds(isc__socketmgr_t *manager, int maxfd, fd_set *readfds, REQUIRE(maxfd <= (int)manager->maxsocks); for (i = 0; i < maxfd; i++) { -#ifdef USE_WATCHER_THREAD if (i == manager->pipe_fds[0] || i == manager->pipe_fds[1]) continue; -#endif /* USE_WATCHER_THREAD */ process_fd(manager, i, FD_ISSET(i, readfds), FD_ISSET(i, writefds)); } } #endif -#ifdef USE_WATCHER_THREAD static bool process_ctlfd(isc__socketmgr_t *manager) { int msg, fd; @@ -4366,7 +4281,6 @@ watcher(void *uap) { return ((isc_threadresult_t)0); } -#endif /* USE_WATCHER_THREAD */ void isc__socketmgr_setreserved(isc_socketmgr_t *manager0, uint32_t reserved) { @@ -4417,7 +4331,6 @@ setup_watcher(isc_mem_t *mctx, isc__socketmgr_t *manager) { return (result); } -#ifdef USE_WATCHER_THREAD result = watch_fd(manager, manager->pipe_fds[0], SELECT_POKE_READ); if (result != ISC_R_SUCCESS) { close(manager->kqueue_fd); @@ -4425,7 +4338,6 @@ setup_watcher(isc_mem_t *mctx, isc__socketmgr_t *manager) { sizeof(struct kevent) * manager->nevents); return (result); } -#endif /* USE_WATCHER_THREAD */ #elif defined(USE_EPOLL) manager->nevents = ISC_SOCKET_MAXEVENTS; manager->events = isc_mem_get(mctx, sizeof(struct epoll_event) * @@ -4445,7 +4357,6 @@ setup_watcher(isc_mem_t *mctx, isc__socketmgr_t *manager) { sizeof(struct epoll_event) * manager->nevents); return (result); } -#ifdef USE_WATCHER_THREAD result = watch_fd(manager, manager->pipe_fds[0], SELECT_POKE_READ); if (result != ISC_R_SUCCESS) { close(manager->epoll_fd); @@ -4453,7 +4364,6 @@ setup_watcher(isc_mem_t *mctx, isc__socketmgr_t *manager) { sizeof(struct epoll_event) * manager->nevents); return (result); } -#endif /* USE_WATCHER_THREAD */ #elif defined(USE_DEVPOLL) manager->nevents = ISC_SOCKET_MAXEVENTS; result = isc_resource_getcurlimit(isc_resource_openfiles, @@ -4492,7 +4402,6 @@ setup_watcher(isc_mem_t *mctx, isc__socketmgr_t *manager) { sizeof(pollinfo_t) * manager->maxsocks); return (result); } -#ifdef USE_WATCHER_THREAD result = watch_fd(manager, manager->pipe_fds[0], SELECT_POKE_READ); if (result != ISC_R_SUCCESS) { close(manager->devpoll_fd); @@ -4502,7 +4411,6 @@ setup_watcher(isc_mem_t *mctx, isc__socketmgr_t *manager) { sizeof(pollinfo_t) * manager->maxsocks); return (result); } -#endif /* USE_WATCHER_THREAD */ #elif defined(USE_SELECT) UNUSED(result); @@ -4550,12 +4458,8 @@ setup_watcher(isc_mem_t *mctx, isc__socketmgr_t *manager) { memset(manager->read_fds, 0, manager->fd_bufsize); memset(manager->write_fds, 0, manager->fd_bufsize); -#ifdef USE_WATCHER_THREAD (void)watch_fd(manager, manager->pipe_fds[0], SELECT_POKE_READ); manager->maxfd = manager->pipe_fds[0]; -#else /* USE_WATCHER_THREAD */ - manager->maxfd = 0; -#endif /* USE_WATCHER_THREAD */ #endif /* USE_KQUEUE */ return (ISC_R_SUCCESS); @@ -4563,7 +4467,6 @@ setup_watcher(isc_mem_t *mctx, isc__socketmgr_t *manager) { static void cleanup_watcher(isc_mem_t *mctx, isc__socketmgr_t *manager) { -#ifdef USE_WATCHER_THREAD isc_result_t result; result = unwatch_fd(manager, manager->pipe_fds[0], SELECT_POKE_READ); @@ -4573,7 +4476,6 @@ cleanup_watcher(isc_mem_t *mctx, isc__socketmgr_t *manager) { isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL, ISC_MSG_FAILED, "failed")); } -#endif /* USE_WATCHER_THREAD */ #ifdef USE_KQUEUE close(manager->kqueue_fd); @@ -4612,25 +4514,11 @@ isc__socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp, { int i; isc__socketmgr_t *manager; -#ifdef USE_WATCHER_THREAD char strbuf[ISC_STRERRORSIZE]; -#endif isc_result_t result; REQUIRE(managerp != NULL && *managerp == NULL); -#ifdef USE_SHARED_MANAGER - if (socketmgr != NULL) { - /* Don't allow maxsocks to be updated */ - if (maxsocks > 0 && socketmgr->maxsocks != maxsocks) - return (ISC_R_EXISTS); - - socketmgr->refs++; - *managerp = (isc_socketmgr_t *)socketmgr; - return (ISC_R_SUCCESS); - } -#endif /* USE_SHARED_MANAGER */ - if (maxsocks == 0) maxsocks = ISC_SOCKET_MAXSOCKETS; @@ -4691,7 +4579,6 @@ isc__socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp, } } -#ifdef USE_WATCHER_THREAD if (isc_condition_init(&manager->shutdown_ok) != ISC_R_SUCCESS) { UNEXPECTED_ERROR(__FILE__, __LINE__, "isc_condition_init() %s", @@ -4717,14 +4604,6 @@ isc__socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp, } RUNTIME_CHECK(make_nonblock(manager->pipe_fds[0]) == ISC_R_SUCCESS); -#if 0 - RUNTIME_CHECK(make_nonblock(manager->pipe_fds[1]) == ISC_R_SUCCESS); -#endif -#endif /* USE_WATCHER_THREAD */ - -#ifdef USE_SHARED_MANAGER - manager->refs = 1; -#endif /* USE_SHARED_MANAGER */ /* * Set up initial state for the select loop @@ -4735,7 +4614,6 @@ isc__socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp, memset(manager->fdstate, 0, manager->maxsocks * sizeof(int)); -#ifdef USE_WATCHER_THREAD /* * Start up the select/poll thread. */ @@ -4750,26 +4628,18 @@ isc__socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp, goto cleanup; } isc_thread_setname(manager->watcher, "isc-socket"); -#endif /* USE_WATCHER_THREAD */ isc_mem_attach(mctx, &manager->mctx); -#ifdef USE_SHARED_MANAGER - socketmgr = manager; -#endif /* USE_SHARED_MANAGER */ *managerp = (isc_socketmgr_t *)manager; return (ISC_R_SUCCESS); cleanup: -#ifdef USE_WATCHER_THREAD (void)close(manager->pipe_fds[0]); (void)close(manager->pipe_fds[1]); -#endif /* USE_WATCHER_THREAD */ -#ifdef USE_WATCHER_THREAD cleanup_condition: (void)isc_condition_destroy(&manager->shutdown_ok); -#endif /* USE_WATCHER_THREAD */ cleanup_lock: @@ -4840,32 +4710,17 @@ isc__socketmgr_destroy(isc_socketmgr_t **managerp) { manager = (isc__socketmgr_t *)*managerp; REQUIRE(VALID_MANAGER(manager)); -#ifdef USE_SHARED_MANAGER - manager->refs--; - if (manager->refs > 0) { - *managerp = NULL; - return; - } - socketmgr = NULL; -#endif /* USE_SHARED_MANAGER */ - LOCK(&manager->lock); /* * Wait for all sockets to be destroyed. */ while (!ISC_LIST_EMPTY(manager->socklist)) { -#ifdef USE_WATCHER_THREAD manager_log(manager, CREATION, "%s", isc_msgcat_get(isc_msgcat, ISC_MSGSET_SOCKET, ISC_MSG_SOCKETSREMAIN, "sockets exist")); WAIT(&manager->shutdown_ok, &manager->lock); -#else /* USE_WATCHER_THREAD */ - UNLOCK(&manager->lock); - isc__taskmgr_dispatch(NULL); - LOCK(&manager->lock); -#endif /* USE_WATCHER_THREAD */ } UNLOCK(&manager->lock); @@ -4877,7 +4732,6 @@ isc__socketmgr_destroy(isc_socketmgr_t **managerp) { */ select_poke(manager, 0, SELECT_POKE_SHUTDOWN); -#ifdef USE_WATCHER_THREAD /* * Wait for thread to exit. */ @@ -4886,18 +4740,15 @@ isc__socketmgr_destroy(isc_socketmgr_t **managerp) { "isc_thread_join() %s", isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL, ISC_MSG_FAILED, "failed")); -#endif /* USE_WATCHER_THREAD */ /* * Clean up. */ cleanup_watcher(manager->mctx, manager); -#ifdef USE_WATCHER_THREAD (void)close(manager->pipe_fds[0]); (void)close(manager->pipe_fds[1]); (void)isc_condition_destroy(&manager->shutdown_ok); -#endif /* USE_WATCHER_THREAD */ for (i = 0; i < (int)manager->maxsocks; i++) if (manager->fdstate[i] == CLOSE_PENDING) /* no need to lock */ @@ -4931,9 +4782,6 @@ isc__socketmgr_destroy(isc_socketmgr_t **managerp) { *managerp = NULL; -#ifdef USE_SHARED_MANAGER - socketmgr = NULL; -#endif } static isc_result_t @@ -6402,137 +6250,6 @@ isc_socket_socketevent(isc_mem_t *mctx, void *sender, return (allocate_socketevent(mctx, sender, eventtype, action, arg)); } -#ifndef USE_WATCHER_THREAD -/* - * In our assumed scenario, we can simply use a single static object. - * XXX: this is not true if the application uses multiple threads with - * 'multi-context' mode. Fixing this is a future TODO item. - */ -static isc_socketwait_t swait_private; - -int -isc__socketmgr_waitevents(isc_socketmgr_t *manager0, struct timeval *tvp, - isc_socketwait_t **swaitp) -{ - isc__socketmgr_t *manager = (isc__socketmgr_t *)manager0; - int n; -#ifdef USE_KQUEUE - struct timespec ts, *tsp; -#endif -#ifdef USE_EPOLL - int timeout; -#endif -#ifdef USE_DEVPOLL - isc_result_t result; - int pass; - struct dvpoll dvp; -#endif - - REQUIRE(swaitp != NULL && *swaitp == NULL); - -#ifdef USE_SHARED_MANAGER - if (manager == NULL) - manager = socketmgr; -#endif - if (manager == NULL) - return (0); - -#ifdef USE_KQUEUE - if (tvp != NULL) { - ts.tv_sec = tvp->tv_sec; - ts.tv_nsec = tvp->tv_usec * 1000; - tsp = &ts; - } else - tsp = NULL; - swait_private.nevents = kevent(manager->kqueue_fd, NULL, 0, - manager->events, manager->nevents, - tsp); - n = swait_private.nevents; -#elif defined(USE_EPOLL) - if (tvp != NULL) - timeout = tvp->tv_sec * 1000 + (tvp->tv_usec + 999) / 1000; - else - timeout = -1; - swait_private.nevents = epoll_wait(manager->epoll_fd, - manager->events, - manager->nevents, timeout); - n = swait_private.nevents; -#elif defined(USE_DEVPOLL) - /* - * Re-probe every thousand calls. - */ - if (manager->calls++ > 1000U) { - result = isc_resource_getcurlimit(isc_resource_openfiles, - &manager->open_max); - if (result != ISC_R_SUCCESS) - manager->open_max = 64; - manager->calls = 0; - } - for (pass = 0; pass < 2; pass++) { - dvp.dp_fds = manager->events; - dvp.dp_nfds = manager->nevents; - if (dvp.dp_nfds >= manager->open_max) - dvp.dp_nfds = manager->open_max - 1; - if (tvp != NULL) { - dvp.dp_timeout = tvp->tv_sec * 1000 + - (tvp->tv_usec + 999) / 1000; - } else - dvp.dp_timeout = -1; - n = ioctl(manager->devpoll_fd, DP_POLL, &dvp); - if (n == -1 && errno == EINVAL) { - /* - * {OPEN_MAX} may have dropped. Look - * up the current value and try again. - */ - result = isc_resource_getcurlimit( - isc_resource_openfiles, - &manager->open_max); - if (result != ISC_R_SUCCESS) - manager->open_max = 64; - } else - break; - } - swait_private.nevents = n; -#elif defined(USE_SELECT) - memmove(manager->read_fds_copy, manager->read_fds, manager->fd_bufsize); - memmove(manager->write_fds_copy, manager->write_fds, - manager->fd_bufsize); - - swait_private.readset = manager->read_fds_copy; - swait_private.writeset = manager->write_fds_copy; - swait_private.maxfd = manager->maxfd + 1; - - n = select(swait_private.maxfd, swait_private.readset, - swait_private.writeset, NULL, tvp); -#endif - - *swaitp = &swait_private; - return (n); -} - -isc_result_t -isc__socketmgr_dispatch(isc_socketmgr_t *manager0, isc_socketwait_t *swait) { - isc__socketmgr_t *manager = (isc__socketmgr_t *)manager0; - - REQUIRE(swait == &swait_private); - -#ifdef USE_SHARED_MANAGER - if (manager == NULL) - manager = socketmgr; -#endif - if (manager == NULL) - return (ISC_R_NOTFOUND); - -#if defined(USE_KQUEUE) || defined(USE_EPOLL) || defined(USE_DEVPOLL) - (void)process_fds(manager, manager->events, swait->nevents); - return (ISC_R_SUCCESS); -#elif defined(USE_SELECT) - process_fds(manager, swait->maxfd, swait->readset, swait->writeset); - return (ISC_R_SUCCESS); -#endif -} -#endif /* USE_WATCHER_THREAD */ - void isc__socket_setname(isc_socket_t *socket0, const char *name, void *tag) { isc__socket_t *sock = (isc__socket_t *)socket0; @@ -6605,12 +6322,6 @@ isc_socketmgr_renderxml(isc_socketmgr_t *mgr0, xmlTextWriterPtr writer) { LOCK(&mgr->lock); -#ifdef USE_SHARED_MANAGER - TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "references")); - TRY0(xmlTextWriterWriteFormatString(writer, "%d", mgr->refs)); - TRY0(xmlTextWriterEndElement(writer)); -#endif /* USE_SHARED_MANAGER */ - TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "sockets")); sock = ISC_LIST_HEAD(mgr->socklist); while (sock != NULL) { @@ -6725,12 +6436,6 @@ isc_socketmgr_renderjson(isc_socketmgr_t *mgr0, json_object *stats) { LOCK(&mgr->lock); -#ifdef USE_SHARED_MANAGER - obj = json_object_new_int(mgr->refs); - CHECKMEM(obj); - json_object_object_add(stats, "references", obj); -#endif /* USE_SHARED_MANAGER */ - sock = ISC_LIST_HEAD(mgr->socklist); while (sock != NULL) { json_object *states, *entry = json_object_new_object(); diff --git a/lib/isc/unix/time.c b/lib/isc/unix/time.c index 36bf988861..7957e11f92 100644 --- a/lib/isc/unix/time.c +++ b/lib/isc/unix/time.c @@ -381,9 +381,7 @@ void isc_time_formattimestamp(const isc_time_t *t, char *buf, unsigned int len) { time_t now; unsigned int flen; -#ifdef ISC_PLATFORM_USETHREADS struct tm tm; -#endif REQUIRE(t != NULL); INSIST(t->nanoseconds < NS_PER_S); @@ -391,11 +389,7 @@ isc_time_formattimestamp(const isc_time_t *t, char *buf, unsigned int len) { REQUIRE(len > 0); now = (time_t) t->seconds; -#ifdef ISC_PLATFORM_USETHREADS flen = strftime(buf, len, "%d-%b-%Y %X", localtime_r(&now, &tm)); -#else - flen = strftime(buf, len, "%d-%b-%Y %X", localtime(&now)); -#endif INSIST(flen < len); if (flen != 0) snprintf(buf + flen, len - flen, @@ -409,9 +403,7 @@ void isc_time_formathttptimestamp(const isc_time_t *t, char *buf, unsigned int len) { time_t now; unsigned int flen; -#ifdef ISC_PLATFORM_USETHREADS struct tm tm; -#endif REQUIRE(t != NULL); INSIST(t->nanoseconds < NS_PER_S); @@ -422,12 +414,8 @@ isc_time_formathttptimestamp(const isc_time_t *t, char *buf, unsigned int len) { * 5 spaces, 1 comma, 3 GMT, 2 %d, 4 %Y, 8 %H:%M:%S, 3+ %a, 3+ %b (29+) */ now = (time_t)t->seconds; -#ifdef ISC_PLATFORM_USETHREADS flen = strftime(buf, len, "%a, %d %b %Y %H:%M:%S GMT", gmtime_r(&now, &tm)); -#else - flen = strftime(buf, len, "%a, %d %b %Y %H:%M:%S GMT", gmtime(&now)); -#endif INSIST(flen < len); } @@ -454,9 +442,7 @@ void isc_time_formatISO8601L(const isc_time_t *t, char *buf, unsigned int len) { time_t now; unsigned int flen; -#ifdef ISC_PLATFORM_USETHREADS struct tm tm; -#endif REQUIRE(t != NULL); INSIST(t->nanoseconds < NS_PER_S); @@ -464,11 +450,7 @@ isc_time_formatISO8601L(const isc_time_t *t, char *buf, unsigned int len) { REQUIRE(len > 0); now = (time_t)t->seconds; -#ifdef ISC_PLATFORM_USETHREADS flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%S", localtime_r(&now, &tm)); -#else - flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%S", localtime(&now)); -#endif INSIST(flen < len); } @@ -476,9 +458,7 @@ void isc_time_formatISO8601Lms(const isc_time_t *t, char *buf, unsigned int len) { time_t now; unsigned int flen; -#ifdef ISC_PLATFORM_USETHREADS struct tm tm; -#endif REQUIRE(t != NULL); INSIST(t->nanoseconds < NS_PER_S); @@ -486,11 +466,7 @@ isc_time_formatISO8601Lms(const isc_time_t *t, char *buf, unsigned int len) { REQUIRE(len > 0); now = (time_t)t->seconds; -#ifdef ISC_PLATFORM_USETHREADS flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%S", localtime_r(&now, &tm)); -#else - flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%S", localtime(&now)); -#endif INSIST(flen < len); if (flen > 0U && len - flen >= 6) { snprintf(buf + flen, len - flen, ".%03u", @@ -502,9 +478,7 @@ void isc_time_formatISO8601(const isc_time_t *t, char *buf, unsigned int len) { time_t now; unsigned int flen; -#ifdef ISC_PLATFORM_USETHREADS struct tm tm; -#endif REQUIRE(t != NULL); INSIST(t->nanoseconds < NS_PER_S); @@ -512,11 +486,7 @@ isc_time_formatISO8601(const isc_time_t *t, char *buf, unsigned int len) { REQUIRE(len > 0); now = (time_t)t->seconds; -#ifdef ISC_PLATFORM_USETHREADS flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%SZ", gmtime_r(&now, &tm)); -#else - flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%SZ", gmtime(&now)); -#endif INSIST(flen < len); } @@ -524,9 +494,7 @@ void isc_time_formatISO8601ms(const isc_time_t *t, char *buf, unsigned int len) { time_t now; unsigned int flen; -#ifdef ISC_PLATFORM_USETHREADS struct tm tm; -#endif REQUIRE(t != NULL); INSIST(t->nanoseconds < NS_PER_S); @@ -534,11 +502,7 @@ isc_time_formatISO8601ms(const isc_time_t *t, char *buf, unsigned int len) { REQUIRE(len > 0); now = (time_t)t->seconds; -#ifdef ISC_PLATFORM_USETHREADS flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%SZ", gmtime_r(&now, &tm)); -#else - flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%SZ", gmtime(&now)); -#endif INSIST(flen < len); if (flen > 0U && len - flen >= 5) { flen -= 1; /* rewind one character (Z) */ @@ -552,9 +516,7 @@ isc_time_formatshorttimestamp(const isc_time_t *t, char *buf, unsigned int len) { time_t now; unsigned int flen; -#ifdef ISC_PLATFORM_USETHREADS struct tm tm; -#endif REQUIRE(t != NULL); INSIST(t->nanoseconds < NS_PER_S); @@ -562,11 +524,7 @@ isc_time_formatshorttimestamp(const isc_time_t *t, char *buf, unsigned int len) REQUIRE(len > 0); now = (time_t)t->seconds; -#ifdef ISC_PLATFORM_USETHREADS flen = strftime(buf, len, "%Y%m%d%H%M%S", gmtime_r(&now, &tm)); -#else - flen = strftime(buf, len, "%Y%m%d%H%M%S", gmtime(&now)); -#endif INSIST(flen < len); if (flen > 0U && len - flen >= 5) { snprintf(buf + flen, len - flen, "%03u", diff --git a/lib/isc/win32/include/isc/platform.h.in b/lib/isc/win32/include/isc/platform.h.in index 87542f3926..7f2bdbfb6b 100644 --- a/lib/isc/win32/include/isc/platform.h.in +++ b/lib/isc/win32/include/isc/platform.h.in @@ -16,8 +16,6 @@ ***** Platform-dependent defines. *****/ -#define ISC_PLATFORM_USETHREADS 1 - /* * Some compatibility cludges */ diff --git a/lib/isc/win32/socket.c b/lib/isc/win32/socket.c index 8d60458599..1209292dfb 100644 --- a/lib/isc/win32/socket.c +++ b/lib/isc/win32/socket.c @@ -4016,12 +4016,6 @@ isc_socketmgr_renderxml(isc_socketmgr_t *mgr, xmlTextWriterPtr writer) LOCK(&mgr->lock); -#ifndef ISC_PLATFORM_USETHREADS - TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "references")); - TRY0(xmlTextWriterWriteFormatString(writer, "%d", mgr->refs)); - TRY0(xmlTextWriterEndElement(writer)); -#endif - TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "sockets")); sock = ISC_LIST_HEAD(mgr->socklist); while (sock != NULL) { diff --git a/lib/isc/x86_32/include/isc/atomic.h b/lib/isc/x86_32/include/isc/atomic.h index 8bcc8b08e6..6c570307e0 100644 --- a/lib/isc/x86_32/include/isc/atomic.h +++ b/lib/isc/x86_32/include/isc/atomic.h @@ -28,9 +28,7 @@ isc_atomic_xadd(int32_t *p, int32_t val) { int32_t prev = val; __asm__ volatile( -#ifdef ISC_PLATFORM_USETHREADS "lock;" -#endif "xadd %0, %1" :"=q"(prev) :"m"(*p), "0"(prev) @@ -45,9 +43,7 @@ isc_atomic_xaddq(int64_t *p, int64_t val) { int64_t prev = val; __asm__ volatile( -#ifdef ISC_PLATFORM_USETHREADS "lock;" -#endif "xaddq %0, %1" :"=q"(prev) :"m"(*p), "0"(prev) @@ -63,13 +59,11 @@ isc_atomic_xaddq(int64_t *p, int64_t val) { static __inline__ void isc_atomic_store(int32_t *p, int32_t val) { __asm__ volatile( -#ifdef ISC_PLATFORM_USETHREADS /* * xchg should automatically lock memory, but we add it * explicitly just in case (it at least doesn't harm) */ "lock;" -#endif "xchgl %1, %0" : @@ -84,13 +78,11 @@ isc_atomic_store(int32_t *p, int32_t val) { static __inline__ void isc_atomic_storeq(int64_t *p, int64_t val) { __asm__ volatile( -#ifdef ISC_PLATFORM_USETHREADS /* * xchg should automatically lock memory, but we add it * explicitly just in case (it at least doesn't harm) */ "lock;" -#endif "xchgq %1, %0" : @@ -107,9 +99,7 @@ isc_atomic_storeq(int64_t *p, int64_t val) { static __inline__ int32_t isc_atomic_cmpxchg(int32_t *p, int32_t cmpval, int32_t val) { __asm__ volatile( -#ifdef ISC_PLATFORM_USETHREADS "lock;" -#endif "cmpxchgl %1, %2" : "=a"(cmpval) : "r"(val), "m"(*p), "a"(cmpval) @@ -134,9 +124,7 @@ isc_atomic_xadd(int32_t *p, int32_t val) { __asm ( "movl 8(%ebp), %ecx\n" "movl 12(%ebp), %edx\n" -#ifdef ISC_PLATFORM_USETHREADS "lock;" -#endif "xadd %edx, (%ecx)\n" /* @@ -156,9 +144,7 @@ isc_atomic_store(int32_t *p, int32_t val) { __asm ( "movl 8(%ebp), %ecx\n" "movl 12(%ebp), %edx\n" -#ifdef ISC_PLATFORM_USETHREADS "lock;" -#endif "xchgl (%ecx), %edx\n" ); } @@ -173,9 +159,7 @@ isc_atomic_cmpxchg(int32_t *p, int32_t cmpval, int32_t val) { "movl 8(%ebp), %ecx\n" "movl 12(%ebp), %eax\n" /* must be %eax for cmpxchgl */ "movl 16(%ebp), %edx\n" -#ifdef ISC_PLATFORM_USETHREADS "lock;" -#endif /* * If (%ecx) == %eax then (%ecx) := %edx. diff --git a/lib/isc/x86_64/include/isc/atomic.h b/lib/isc/x86_64/include/isc/atomic.h index b2d7880f6f..a94d52cd89 100644 --- a/lib/isc/x86_64/include/isc/atomic.h +++ b/lib/isc/x86_64/include/isc/atomic.h @@ -40,9 +40,7 @@ isc_atomic_xadd(int32_t *p, int32_t val) { __asm ( "movq %rdi, %rdx\n" "movl %esi, %eax\n" -#ifdef ISC_PLATFORM_USETHREADS "lock;" -#endif "xadd %eax, (%rdx)\n" /* * XXX: assume %eax will be used as the return value. @@ -59,9 +57,7 @@ isc_atomic_xaddq(int64_t *p, int64_t val) { __asm ( "movq %rdi, %rdx\n" "movq %rsi, %rax\n" -#ifdef ISC_PLATFORM_USETHREADS "lock;" -#endif "xaddq %rax, (%rdx)\n" /* * XXX: assume %rax will be used as the return value. @@ -78,9 +74,7 @@ isc_atomic_store(int32_t *p, int32_t val) { __asm ( "movq %rdi, %rax\n" "movl %esi, %edx\n" -#ifdef ISC_PLATFORM_USETHREADS "lock;" -#endif "xchgl (%rax), %edx\n" ); } @@ -94,9 +88,7 @@ isc_atomic_storeq(int64_t *p, int64_t val) { __asm ( "movq %rdi, %rax\n" "movq %rsi, %rdx\n" -#ifdef ISC_PLATFORM_USETHREADS "lock;" -#endif "xchgq (%rax), %rdx\n" ); } @@ -116,9 +108,7 @@ isc_atomic_cmpxchg(int32_t *p, int32_t cmpval, int32_t val) { "movl %esi, %eax\n" "movq %rdi, %rdx\n" -#ifdef ISC_PLATFORM_USETHREADS "lock;" -#endif /* * If [%rdi] == %eax then [%rdi] := %ecx (equal to %edx * from above), and %eax is untouched (equal to %esi) diff --git a/lib/isc/xoshiro128starstar.c b/lib/isc/xoshiro128starstar.c index 7b47f95665..bff2e3ad38 100644 --- a/lib/isc/xoshiro128starstar.c +++ b/lib/isc/xoshiro128starstar.c @@ -34,7 +34,6 @@ * * The state must be seeded so that it is not everywhere zero. */ -#if defined(ISC_PLATFORM_USETHREADS) #if defined(_WIN32) || defined(_WIN64) #include static volatile HANDLE _mutex = NULL; @@ -65,10 +64,6 @@ static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER; #define _LOCK() pthread_mutex_lock(&_mutex) #define _UNLOCK() pthread_mutex_unlock(&_mutex) #endif /* defined(_WIN32) || defined(_WIN64) */ -#else /* defined(ISC_PLATFORM_USETHREADS) */ -#define _LOCK() -#define _UNLOCK() -#endif static inline uint32_t rotl(const uint32_t x, int k) { return (x << k) | (x >> (32 - k)); diff --git a/lib/ns/client.c b/lib/ns/client.c index ec641c1b12..03975f6640 100644 --- a/lib/ns/client.c +++ b/lib/ns/client.c @@ -102,7 +102,6 @@ #define SEND_BUFFER_SIZE 4096 #define RECV_BUFFER_SIZE 4096 -#ifdef ISC_PLATFORM_USETHREADS #define NMCTXS 100 /*%< * Number of 'mctx pools' for clients. (Should this be configurable?) @@ -112,13 +111,6 @@ * completely avoiding contentions among threads for an authoritative-only * server. */ -#else -#define NMCTXS 0 -/*%< - * If named with built without thread, simply share manager's context. Using - * a separate context in this case would simply waste memory. - */ -#endif #define COOKIE_SIZE 24U /* 8 + 4 + 4 + 8 */ #define ECS_SIZE 20U /* 2 + 1 + 1 + [0..16] */ diff --git a/lib/ns/tests/nstest.c b/lib/ns/tests/nstest.c index 5ec7869f01..ccbe1f65a6 100644 --- a/lib/ns/tests/nstest.c +++ b/lib/ns/tests/nstest.c @@ -142,17 +142,12 @@ cleanup_managers(void) { } while (run_managers && !shutdown_done) { -#ifndef ISC_PLATFORM_USETHREADS - while (isc__taskmgr_ready(taskmgr)) - isc__taskmgr_dispatch(taskmgr); -#else /* * There's no straightforward way to determine * whether all the clients have shut down, so * we'll just sleep for a bit and hope. */ ns_test_nap(500000); -#endif } if (sctx != NULL) @@ -178,11 +173,7 @@ create_managers(void) { isc_result_t result; ns_listenlist_t *listenon = NULL; isc_event_t *event = NULL; -#ifdef ISC_PLATFORM_USETHREADS ncpus = isc_os_ncpus(); -#else - ncpus = 1; -#endif CHECK(isc_taskmgr_create(mctx, ncpus, 0, &taskmgr)); CHECK(isc_task_create(taskmgr, 0, &maintask)); @@ -212,17 +203,12 @@ create_managers(void) { scan_interfaces, NULL, sizeof (isc_event_t)); isc_task_send(maintask, &event); -#ifndef ISC_PLATFORM_USETHREADS - while (isc__taskmgr_ready(taskmgr)) - isc__taskmgr_dispatch(taskmgr); -#else /* * There's no straightforward way to determine * whether the interfaces have been scanned, * we'll just sleep for a bit and hope. */ ns_test_nap(500000); -#endif run_managers = true; diff --git a/m4/ax_pthread.m4 b/m4/ax_pthread.m4 new file mode 100644 index 0000000000..5fbf9fe0d6 --- /dev/null +++ b/m4/ax_pthread.m4 @@ -0,0 +1,485 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_pthread.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro figures out how to build C programs using POSIX threads. It +# sets the PTHREAD_LIBS output variable to the threads library and linker +# flags, and the PTHREAD_CFLAGS output variable to any special C compiler +# flags that are needed. (The user can also force certain compiler +# flags/libs to be tested by setting these environment variables.) +# +# Also sets PTHREAD_CC to any special C compiler that is needed for +# multi-threaded programs (defaults to the value of CC otherwise). (This +# is necessary on AIX to use the special cc_r compiler alias.) +# +# NOTE: You are assumed to not only compile your program with these flags, +# but also to link with them as well. For example, you might link with +# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS +# +# If you are only building threaded programs, you may wish to use these +# variables in your default LIBS, CFLAGS, and CC: +# +# LIBS="$PTHREAD_LIBS $LIBS" +# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +# CC="$PTHREAD_CC" +# +# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant +# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to +# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# +# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the +# PTHREAD_PRIO_INHERIT symbol is defined when compiling with +# PTHREAD_CFLAGS. +# +# ACTION-IF-FOUND is a list of shell commands to run if a threads library +# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it +# is not found. If ACTION-IF-FOUND is not specified, the default action +# will define HAVE_PTHREAD. +# +# Please let the authors know if this macro fails on any platform, or if +# you have any other suggestions or comments. This macro was based on work +# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help +# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by +# Alejandro Forero Cuervo to the autoconf macro repository. We are also +# grateful for the helpful feedback of numerous users. +# +# Updated for Autoconf 2.68 by Daniel Richard G. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2011 Daniel Richard G. +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 24 + +AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) +AC_DEFUN([AX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_PROG_SED]) +AC_LANG_PUSH([C]) +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on Tru64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then + ax_pthread_save_CC="$CC" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"]) + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS]) + AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes]) + AC_MSG_RESULT([$ax_pthread_ok]) + if test "x$ax_pthread_ok" = "xno"; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + CC="$ax_pthread_save_CC" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 +# (Note: HP C rejects this with "bad form for `-t' option") +# -pthreads: Solaris/gcc (Note: HP C also rejects) +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads and +# -D_REENTRANT too), HP C (must be checked before -lpthread, which +# is present but should not be used directly; and before -mthreads, +# because the compiler interprets this as "-mt" + "-hreads") +# -mthreads: Mingw32/gcc, Lynx/gcc +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case $host_os in + + freebsd*) + + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) + # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) + + ax_pthread_flags="-kthread lthread $ax_pthread_flags" + ;; + + hpux*) + + # From the cc(1) man page: "[-mt] Sets various -D flags to enable + # multi-threading and also sets -lpthread." + + ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" + ;; + + openedition*) + + # IBM z/OS requires a feature-test macro to be defined in order to + # enable POSIX threads at all, so give the user a hint if this is + # not set. (We don't define these ourselves, as they can affect + # other portions of the system API in unpredictable ways.) + + AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING], + [ +# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) + AX_PTHREAD_ZOS_MISSING +# endif + ], + [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])]) + ;; + + solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (N.B.: The stubs are missing + # pthread_cleanup_push, or rather a function called by this macro, + # so we could check for that, but who knows whether they'll stub + # that too in a future libc.) So we'll check first for the + # standard Solaris way of linking pthreads (-mt -lpthread). + + ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags" + ;; +esac + +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) + +AS_IF([test "x$GCC" = "xyes"], + [ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"]) + +# The presence of a feature test macro requesting re-entrant function +# definitions is, on some systems, a strong hint that pthreads support is +# correctly enabled + +case $host_os in + darwin* | hpux* | linux* | osf* | solaris*) + ax_pthread_check_macro="_REENTRANT" + ;; + + aix*) + ax_pthread_check_macro="_THREAD_SAFE" + ;; + + *) + ax_pthread_check_macro="--" + ;; +esac +AS_IF([test "x$ax_pthread_check_macro" = "x--"], + [ax_pthread_check_cond=0], + [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) + +# Are we compiling with Clang? + +AC_CACHE_CHECK([whether $CC is Clang], + [ax_cv_PTHREAD_CLANG], + [ax_cv_PTHREAD_CLANG=no + # Note that Autoconf sets GCC=yes for Clang as well as GCC + if test "x$GCC" = "xyes"; then + AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG], + [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ +# if defined(__clang__) && defined(__llvm__) + AX_PTHREAD_CC_IS_CLANG +# endif + ], + [ax_cv_PTHREAD_CLANG=yes]) + fi + ]) +ax_pthread_clang="$ax_cv_PTHREAD_CLANG" + +ax_pthread_clang_warning=no + +# Clang needs special handling, because older versions handle the -pthread +# option in a rather... idiosyncratic way + +if test "x$ax_pthread_clang" = "xyes"; then + + # Clang takes -pthread; it has never supported any other flag + + # (Note 1: This will need to be revisited if a system that Clang + # supports has POSIX threads in a separate library. This tends not + # to be the way of modern systems, but it's conceivable.) + + # (Note 2: On some systems, notably Darwin, -pthread is not needed + # to get POSIX threads support; the API is always present and + # active. We could reasonably leave PTHREAD_CFLAGS empty. But + # -pthread does define _REENTRANT, and while the Darwin headers + # ignore this macro, third-party headers might not.) + + PTHREAD_CFLAGS="-pthread" + PTHREAD_LIBS= + + ax_pthread_ok=yes + + # However, older versions of Clang make a point of warning the user + # that, in an invocation where only linking and no compilation is + # taking place, the -pthread option has no effect ("argument unused + # during compilation"). They expect -pthread to be passed in only + # when source code is being compiled. + # + # Problem is, this is at odds with the way Automake and most other + # C build frameworks function, which is that the same flags used in + # compilation (CFLAGS) are also used in linking. Many systems + # supported by AX_PTHREAD require exactly this for POSIX threads + # support, and in fact it is often not straightforward to specify a + # flag that is used only in the compilation phase and not in + # linking. Such a scenario is extremely rare in practice. + # + # Even though use of the -pthread flag in linking would only print + # a warning, this can be a nuisance for well-run software projects + # that build with -Werror. So if the active version of Clang has + # this misfeature, we search for an option to squash it. + + AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread], + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG], + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown + # Create an alternate version of $ac_link that compiles and + # links in two steps (.c -> .o, .o -> exe) instead of one + # (.c -> exe), because the warning occurs only in the second + # step + ax_pthread_save_ac_link="$ac_link" + ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' + ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` + ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" + ax_pthread_save_CFLAGS="$CFLAGS" + for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do + AS_IF([test "x$ax_pthread_try" = "xunknown"], [break]) + CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" + ac_link="$ax_pthread_save_ac_link" + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], + [ac_link="$ax_pthread_2step_ac_link" + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], + [break]) + ]) + done + ac_link="$ax_pthread_save_ac_link" + CFLAGS="$ax_pthread_save_CFLAGS" + AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no]) + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" + ]) + + case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in + no | unknown) ;; + *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; + esac + +fi # $ax_pthread_clang = yes + +if test "x$ax_pthread_ok" = "xno"; then +for ax_pthread_try_flag in $ax_pthread_flags; do + + case $ax_pthread_try_flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -mt,pthread) + AC_MSG_CHECKING([whether pthreads work with -mt -lpthread]) + PTHREAD_CFLAGS="-mt" + PTHREAD_LIBS="-lpthread" + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag]) + PTHREAD_CFLAGS="$ax_pthread_try_flag" + ;; + + pthread-config) + AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) + AS_IF([test "x$ax_pthread_config" = "xno"], [continue]) + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) + PTHREAD_LIBS="-l$ax_pthread_try_flag" + ;; + esac + + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include +# if $ax_pthread_check_cond +# error "$ax_pthread_check_macro must be defined" +# endif + static void routine(void *a) { a = 0; } + static void *start_routine(void *a) { return a; }], + [pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */])], + [ax_pthread_ok=yes], + []) + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + AC_MSG_RESULT([$ax_pthread_ok]) + AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$ax_pthread_ok" = "xyes"; then + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_CACHE_CHECK([for joinable pthread attribute], + [ax_cv_PTHREAD_JOINABLE_ATTR], + [ax_cv_PTHREAD_JOINABLE_ATTR=unknown + for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [int attr = $ax_pthread_attr; return attr /* ; */])], + [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break], + []) + done + ]) + AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ + test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ + test "x$ax_pthread_joinable_attr_defined" != "xyes"], + [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], + [$ax_cv_PTHREAD_JOINABLE_ATTR], + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + ax_pthread_joinable_attr_defined=yes + ]) + + AC_CACHE_CHECK([whether more special flags are required for pthreads], + [ax_cv_PTHREAD_SPECIAL_FLAGS], + [ax_cv_PTHREAD_SPECIAL_FLAGS=no + case $host_os in + solaris*) + ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" + ;; + esac + ]) + AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ + test "x$ax_pthread_special_flags_added" != "xyes"], + [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" + ax_pthread_special_flags_added=yes]) + + AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], + [ax_cv_PTHREAD_PRIO_INHERIT], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[int i = PTHREAD_PRIO_INHERIT;]])], + [ax_cv_PTHREAD_PRIO_INHERIT=yes], + [ax_cv_PTHREAD_PRIO_INHERIT=no]) + ]) + AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ + test "x$ax_pthread_prio_inherit_defined" != "xyes"], + [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.]) + ax_pthread_prio_inherit_defined=yes + ]) + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + # More AIX lossage: compile with *_r variant + if test "x$GCC" != "xyes"; then + case $host_os in + aix*) + AS_CASE(["x/$CC"], + [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], + [#handle absolute path differently from PATH based program lookup + AS_CASE(["x$CC"], + [x/*], + [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], + [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])]) + ;; + esac + fi +fi + +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" + +AC_SUBST([PTHREAD_LIBS]) +AC_SUBST([PTHREAD_CFLAGS]) +AC_SUBST([PTHREAD_CC]) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test "x$ax_pthread_ok" = "xyes"; then + ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) + : +else + ax_pthread_ok=no + $2 +fi +AC_LANG_POP +])dnl AX_PTHREAD diff --git a/make/includes.in b/make/includes.in index 51a00f4d9e..2530bff71e 100644 --- a/make/includes.in +++ b/make/includes.in @@ -17,7 +17,7 @@ ISC_INCLUDES = @BIND9_ISC_BUILDINCLUDE@ \ -I${top_srcdir}/lib/isc \ -I${top_srcdir}/lib/isc/include \ -I${top_srcdir}/lib/isc/unix/include \ - -I${top_srcdir}/lib/isc/@ISC_THREAD_DIR@/include \ + -I${top_srcdir}/lib/isc/pthreads/include \ -I${top_srcdir}/lib/isc/@ISC_ARCH_DIR@/include ISCCC_INCLUDES = @BIND9_ISCCC_BUILDINCLUDE@ \ diff --git a/util/copyrights b/util/copyrights index 149114649e..29a22faac5 100644 --- a/util/copyrights +++ b/util/copyrights @@ -3558,16 +3558,6 @@ ./lib/isc/noatomic/include/isc/Makefile.in MAKE 2007,2012,2015,2016,2018 ./lib/isc/noatomic/include/isc/atomic.h C 2005,2007,2016,2018 ./lib/isc/nonce.c C 2018 -./lib/isc/nothreads/Makefile.in MAKE 2000,2001,2004,2007,2009,2010,2012,2013,2016,2018 -./lib/isc/nothreads/condition.c C 2000,2001,2004,2006,2007,2016,2018 -./lib/isc/nothreads/include/Makefile.in MAKE 2000,2001,2004,2007,2012,2016,2018 -./lib/isc/nothreads/include/isc/Makefile.in MAKE 2000,2001,2004,2007,2012,2015,2016,2018 -./lib/isc/nothreads/include/isc/condition.h C 2000,2001,2004,2007,2016,2018 -./lib/isc/nothreads/include/isc/mutex.h C 2000,2001,2004,2007,2015,2016,2018 -./lib/isc/nothreads/include/isc/once.h C 2000,2001,2004,2007,2016,2018 -./lib/isc/nothreads/include/isc/thread.h C 2000,2001,2004,2007,2013,2016,2017,2018 -./lib/isc/nothreads/mutex.c C 2000,2001,2004,2006,2007,2016,2018 -./lib/isc/nothreads/thread.c C 2000,2001,2004,2007,2016,2017,2018 ./lib/isc/openssl_shim.c C 2018 ./lib/isc/openssl_shim.h C 2018 ./lib/isc/parseint.c C 2001,2002,2003,2004,2005,2007,2012,2016,2018 @@ -3914,6 +3904,7 @@ ./lib/win32/bindevt/bindevt.vcxproj.user X 2013,2018 ./ltmain.sh X 1999,2000,2001,2003,2004,2006,2009,2012,2018 ./m4/ax_check_openssl.m4 X 2018 +./m4/ax_pthread.m4 X 2018 ./m4/libtool.m4 X 2012,2018 ./m4/ltoptions.m4 X 2012,2018 ./m4/ltsugar.m4 X 2012,2018