s3: fix detection and flags for using pthread
authorBjörn Jacke <bj@sernet.de>
Mon, 25 Jan 2010 23:17:10 +0000 (00:17 +0100)
committerKarolin Seeger <kseeger@samba.org>
Mon, 15 Feb 2010 15:38:19 +0000 (16:38 +0100)
I hope this fixes the build on Tru64, IRIX and maybe bug #6983
(cherry picked from commit 5439e1a03f66ff9722987f908babfd71ebd698f1)

source3/Makefile.in
source3/configure.in
source3/libsmb/libsmb_thread_posix.c

index 6474231a9d56c2908fcde5a83ae4be9a5cc8ffde..ec9c5283356b04b4c25d2cbe2618fad586e19466 100644 (file)
@@ -72,7 +72,7 @@ NSCD_LIBS=@NSCD_LIBS@
 UUID_LIBS=@UUID_LIBS@
 LIBWBCLIENT=@LIBWBCLIENT_STATIC@ @LIBWBCLIENT_SHARED@
 LIBWBCLIENT_LIBS=@LIBWBCLIENT_LIBS@
-WINBIND_NSS_PTHREAD=@WINBIND_NSS_PTHREAD@
+WINBIND_NSS_PTHREAD_LDFLAGS=@PTHREAD_LDFLAGS@
 DNSSD_LIBS=@DNSSD_LIBS@
 AVAHI_LIBS=@AVAHI_LIBS@
 POPT_LIBS=@POPTLIBS@
@@ -2526,7 +2526,7 @@ bin/vlp@EXEEXT@: $(BINARY_PREREQS) $(VLP_OBJ) $(LIBTDB)
 @WINBIND_NSS@: $(BINARY_PREREQS) $(WINBIND_NSS_OBJ)
        @echo "Linking $@"
        @$(SHLD) $(WINBIND_NSS_LDSHFLAGS) -o $@ $(WINBIND_NSS_OBJ) \
-               $(LIBREPLACE_LIBS) $(WINBIND_NSS_PTHREAD) \
+               $(LIBREPLACE_LIBS) $(WINBIND_NSS_PTHREAD_LDFLAGS) \
                @SONAMEFLAG@`basename $@`@NSSSONAMEVERSIONSUFFIX@
 
 @WINBIND_WINS_NSS@: $(BINARY_PREREQS) $(WINBIND_WINS_NSS_OBJ) $(LIBTALLOC) $(LIBTDB) $(LIBWBCLIENT)
index 449645faa9c5fd6321467162ee7cd262ac8ca204..fa03260a02a48447ed99901fa2fc190c5e93fe20 100644 (file)
@@ -657,7 +657,7 @@ AUTH_LIBS="${AUTH_LIBS} ${CRYPT_LIBS}"
 
 AC_CHECK_HEADERS(aio.h sys/fcntl.h sys/select.h fcntl.h sys/time.h sys/unistd.h rpc/nettype.h)
 AC_CHECK_HEADERS(unistd.h grp.h sys/id.h memory.h alloca.h)
-AC_CHECK_HEADERS(limits.h float.h pthread.h libintl.h)
+AC_CHECK_HEADERS(limits.h float.h libintl.h)
 AC_CHECK_HEADERS(rpc/rpc.h rpcsvc/nis.h rpcsvc/ypclnt.h)
 AC_CHECK_HEADERS(sys/param.h ctype.h sys/wait.h sys/resource.h sys/ioctl.h sys/ipc.h sys/prctl.h sys/sysctl.h)
 AC_CHECK_HEADERS(sys/mman.h sys/filio.h sys/priv.h sys/shm.h string.h strings.h stdlib.h)
@@ -5985,7 +5985,6 @@ WINBIND_NSS="../nsswitch/libnss_winbind.$SHLIBEXT"
 WINBIND_WINS_NSS="../nsswitch/libnss_wins.$SHLIBEXT"
 WINBIND_NSS_LDSHFLAGS=$LDSHFLAGS
 NSSSONAMEVERSIONSUFFIX=""
-WINBIND_NSS_PTHREAD=""
 
 case "$host_os" in
        *linux* | gnu* | k*bsd*-gnu | kopensolaris*-gnu)
@@ -6127,12 +6126,6 @@ else
         AC_MSG_RESULT(no$winbind_no_reason)
 fi
 
-AC_CHECK_LIB(pthread, pthread_mutex_lock, [WINBIND_NSS_PTHREAD="-lpthread"
-                       AC_DEFINE(HAVE_PTHREAD, 1, [whether pthread exists])
-                       samba_cv_HAVE_PTHREAD=yes],
-                       samba_cv_HAVE_PTHREAD=no)
-
-AC_SUBST(WINBIND_NSS_PTHREAD)
 AC_SUBST(WINBIND_NSS)
 AC_SUBST(WINBIND_WINS_NSS)
 AC_SUBST(WINBIND_NSS_LDSHFLAGS)
@@ -6288,16 +6281,65 @@ if test x"$enable_avahi" != x"no"; then
     fi
 fi
 
+
+#################################################
+# Set pthread stuff
+
+PTHREAD_CFLAGS=error
+PTHREAD_LDFLAGS=error
+
+# If it's error, then the user didn't 
+# define it.
+if test "x$PTHREAD_LDFLAGS" = xerror; then
+  AC_CHECK_LIB(pthread, pthread_attr_init, [
+            PTHREAD_CFLAGS="-D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS"
+            PTHREAD_LDFLAGS="-lpthread" ])
+fi
+
+if test "x$PTHREAD_LDFLAGS" = xerror; then
+  AC_CHECK_LIB(pthreads, pthread_attr_init, [
+            PTHREAD_CFLAGS="-D_THREAD_SAFE"
+            PTHREAD_LDFLAGS="-lpthreads" ])
+fi
+
+if test "x$PTHREAD_LDFLAGS" = xerror; then
+   AC_CHECK_LIB(c_r, pthread_attr_init, [
+               PTHREAD_CFLAGS="-D_THREAD_SAFE -pthread"
+               PTHREAD_LDFLAGS="-pthread" ])
+fi
+
+if test "x$PTHREAD_LDFLAGS" = xerror; then
+   AC_CHECK_FUNC(pthread_attr_init, [
+                PTHREAD_CFLAGS="-D_REENTRANT"
+                PTHREAD_LDFLAGS="-lpthread" ])
+fi
+
+AC_SUBST(PTHREAD_CFLAGS)
+AC_SUBST(PTHREAD_LDFLAGS)
+
+samba_cv_HAVE_PTHREAD=no
+if test x"$PTHREAD_CFLAGS" != xerror -a x"$PTHREAD_LDFLAGS" != xerror; then
+       samba_cv_HAVE_PTHREAD=yes
+       # now check for pthread.h with pthread-correct CFLAGS:
+       ac_save_CFLAGS=$CFLAGS
+       CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+       AC_CHECK_HEADERS(pthread.h)
+       CFLAGS=$ac_save_CFLAGS
+fi
+
 #################################################
 # Check if user wants pthreadpool support
 
+if test x"$enable_pthreadpool" = xyes -a x"$samba_cv_HAVE_PTHREAD" != x"yes"; then
+       AC_MSG_ERROR([pthread support cannot be enabled when pthread header file not found])
+fi
+
 AC_ARG_ENABLE(pthreadpool,
 [AS_HELP_STRING([--enable-pthreadpool], [Enable pthreads pool helper support (default=auto)])])
 
 if test x"$enable_pthreadpool" != x"no" -a x"$samba_cv_HAVE_PTHREAD" = x"yes"; then
-    AC_TRY_LINK([#include "pthread.h"],
-    [pthread_create(NULL, NULL, NULL, NULL)],
-                   ,LIBS="$LIBS -lpthread")
+    LIBS="$LIBS $PTHREAD_LDFLAGS"
+    CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
     AC_DEFINE(WITH_PTHREADPOOL, 1, [Whether to include pthreadpool helpers])
     AC_SUBST(PTHREADPOOL_OBJ, "lib/pthreadpool.o")
 fi
index 6519659c25cca16233bc5308693b2d7d785522d7..8c8299dd7f0d54b18e23a008dd6fa90cdfdfe833 100644 (file)
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+
 #include "includes.h"
+#ifdef HAVE_PTHREAD_H
 #include <pthread.h>
+#endif
 #include "libsmbclient.h"
 #include "libsmb_internal.h"
 
@@ -47,3 +50,4 @@ smbc_thread_posix(void)
 {
         smb_thread_set_functions(&tf);
 }
+