From 02a1c40051e4d4ad081c38a368fd87da89ede5ac Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 25 Feb 2000 19:26:31 +0000 Subject: [PATCH] Pat Knight: Solaris 2 has stub implementations of the POSIX thread functions such as pthread_detach in libc. This means that configure tries to use them without -lpthread, then the test of pthread_create fails and the configuration falls back to the Solaris thread library. This patch moves the test for pthread_create in -lpthread ahead of the test for pthread_detach in libc. The patch also ensures that -lpthread is at the start of the library list when linking, to pick up POSIX thread semantics for fork (see below). Justification. Use of POSIX threads on Solaris ensures that the fork() call only runs the thread that called fork() in the child. This is desirable to prevent (for example) parent server or database threads running in the child. Sun's -lthread library uses a traditional fork() which replicates all the parent's threads in the child. I find this undesirable. Digression. The configure.in seems to always test for -lthread even if a POSIX library is found. I'm not enough of a configure.in wizard to decide whether this is desirable or how to fix it. It is also irrelevant to this patch - I just spotted it while testing. End of Digression. --- configure | 114 +++++++++++++++++++++++++-------------------------- configure.in | 8 ++-- 2 files changed, 61 insertions(+), 61 deletions(-) diff --git a/configure b/configure index c6ad7a5a7dc..28cf1a2b097 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh -# From configure.in Revision: 1.115 +# From configure.in Revision: 1.116 # Guess values for system-dependent variables and create Makefiles. # Generated automatically using autoconf version 2.13 @@ -2728,17 +2728,65 @@ cat >> confdefs.h <<\EOF #define C_THREADS 1 EOF +LIBOBJS="$LIBOBJS thread.o" +else + echo "$ac_t""no" 1>&6 + +echo $ac_n "checking for pthread_create in -lpthread""... $ac_c" 1>&6 +echo "configure:2737: checking for pthread_create in -lpthread" >&5 +ac_lib_var=`echo pthread'_'pthread_create | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lpthread $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define WITH_THREAD 1 +EOF + +cat >> confdefs.h <<\EOF +#define _POSIX_THREADS 1 +EOF + +LIBS="-lpthread $LIBS" LIBOBJS="$LIBOBJS thread.o" else echo "$ac_t""no" 1>&6 echo $ac_n "checking for pthread_detach""... $ac_c" 1>&6 -echo "configure:2737: checking for pthread_detach" >&5 +echo "configure:2785: checking for pthread_detach" >&5 if eval "test \"`echo '$''{'ac_cv_func_pthread_detach'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2813: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_pthread_detach=yes" else @@ -2789,17 +2837,17 @@ else ac_safe=`echo "kernel/OS.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for kernel/OS.h""... $ac_c" 1>&6 -echo "configure:2793: checking for kernel/OS.h" >&5 +echo "configure:2841: checking for kernel/OS.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2803: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2851: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -2828,7 +2876,7 @@ else echo "$ac_t""no" 1>&6 echo $ac_n "checking for pthread_create in -lpthreads""... $ac_c" 1>&6 -echo "configure:2832: checking for pthread_create in -lpthreads" >&5 +echo "configure:2880: checking for pthread_create in -lpthreads" >&5 ac_lib_var=`echo pthreads'_'pthread_create | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2836,54 +2884,6 @@ else ac_save_LIBS="$LIBS" LIBS="-lpthreads $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define WITH_THREAD 1 -EOF - -cat >> confdefs.h <<\EOF -#define _POSIX_THREADS 1 -EOF - -LIBS="$LIBS -lpthreads" -LIBOBJS="$LIBOBJS thread.o" -else - echo "$ac_t""no" 1>&6 - -echo $ac_n "checking for pthread_create in -lpthread""... $ac_c" 1>&6 -echo "configure:2880: checking for pthread_create in -lpthread" >&5 -ac_lib_var=`echo pthread'_'pthread_create | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lpthread $LIBS" -cat > conftest.$ac_ext <> confdefs.h <<\EOF #define _POSIX_THREADS 1 EOF -LIBS="$LIBS -lpthread" +LIBS="$LIBS -lpthreads" LIBOBJS="$LIBOBJS thread.o" else echo "$ac_t""no" 1>&6 diff --git a/configure.in b/configure.in index 789eaace661..8fa23958129 100644 --- a/configure.in +++ b/configure.in @@ -647,6 +647,10 @@ AC_DEFINE(_REENTRANT) AC_CHECK_HEADER(mach/cthreads.h, [AC_DEFINE(WITH_THREAD) AC_DEFINE(C_THREADS) LIBOBJS="$LIBOBJS thread.o"],[ +AC_CHECK_LIB(pthread, pthread_create, [AC_DEFINE(WITH_THREAD) +AC_DEFINE(_POSIX_THREADS) +LIBS="-lpthread $LIBS" +LIBOBJS="$LIBOBJS thread.o"],[ AC_CHECK_FUNC(pthread_detach, [AC_DEFINE(WITH_THREAD) AC_DEFINE(_POSIX_THREADS) LIBOBJS="$LIBOBJS thread.o"],[ @@ -657,10 +661,6 @@ AC_CHECK_LIB(pthreads, pthread_create, [AC_DEFINE(WITH_THREAD) AC_DEFINE(_POSIX_THREADS) LIBS="$LIBS -lpthreads" LIBOBJS="$LIBOBJS thread.o"], [ -AC_CHECK_LIB(pthread, pthread_create, [AC_DEFINE(WITH_THREAD) -AC_DEFINE(_POSIX_THREADS) -LIBS="$LIBS -lpthread" -LIBOBJS="$LIBOBJS thread.o"], [ AC_CHECK_LIB(c_r, pthread_create, [AC_DEFINE(WITH_THREAD) AC_DEFINE(_POSIX_THREADS) LIBS="$LIBS -lc_r"