changeset 16969:b284d21804b8

pthread: check for both pthread_create and pthread_join * m4/pthread.m4 (gl_PTHREAD_CHECK): Revert previous change, but alter the check so that it tests for both pthread_create and pthread_join. This should be more portable to hosts like OSF/1 5.1. Suggested by Bruno Haible and Richard Yao in <http://lists.gnu.org/archive/html/bug-gnulib/2012-07/msg00048.html>.
author Paul Eggert <eggert@cs.ucla.edu>
date Thu, 05 Jul 2012 18:42:11 -0700
parents 20011163d6c7
children 536d27654da7
files ChangeLog m4/pthread.m4
diffstat 2 files changed, 39 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2012-07-05  Paul Eggert  <eggert@cs.ucla.edu>
 
+	pthread: check for both pthread_create and pthread_join
+	* m4/pthread.m4 (gl_PTHREAD_CHECK): Revert previous change, but
+	alter the check so that it tests for both pthread_create and
+	pthread_join.  This should be more portable to hosts like OSF/1 5.1.
+	Suggested by Bruno Haible and Richard Yao in
+	<http://lists.gnu.org/archive/html/bug-gnulib/2012-07/msg00048.html>.
+
 	parse-datetime: doc tuneup
 	* doc/parse-datetime.texi: Index "leap seconds" and fix minor
 	spacing issues.
--- a/m4/pthread.m4
+++ b/m4/pthread.m4
@@ -1,4 +1,4 @@
-# pthread.m4 serial 4
+# pthread.m4 serial 5
 dnl Copyright (C) 2009-2012 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -38,12 +38,37 @@
 
    LIB_PTHREAD=
    if test $ac_cv_header_pthread_h = yes; then
-     gl_saved_libs=$LIBS
-     AC_SEARCH_LIBS([pthread_create], [pthread],
-       [if test "$ac_cv_search_pthread_create" != "none required"; then
-          LIB_PTHREAD="$ac_cv_search_pthread_create"
-        fi])
-     LIBS="$gl_saved_libs"
+     dnl We cannot use AC_SEARCH_LIBS here, because on OSF/1 5.1 pthread_join
+     dnl is defined as a macro which expands to __phread_join, and libpthread
+     dnl contains a definition for __phread_join but none for pthread_join.
+     dnl Also, FreeBSD 9 puts pthread_create in libpthread and pthread_join
+     dnl in libc, whereas on IRIX 6.5 the reverse is true; so check for both.
+     AC_CACHE_CHECK([for library containing pthread_create and pthread_join],
+       [gl_cv_lib_pthread],
+       [gl_saved_libs=$LIBS
+        gl_cv_lib_pthread=
+        for gl_lib_prefix in '' '-lpthread'; do
+          LIBS="$gl_lib_prefix $gl_saved_libs"
+          AC_LINK_IFELSE(
+            [AC_LANG_PROGRAM(
+               [[#include <pthread.h>
+                 void *noop (void *p) { return p; }]],
+               [[pthread_t pt;
+                 void *arg = 0;
+                 pthread_create (&pt, 0, noop, arg);
+                 pthread_join (pthread_self (), &arg);]])],
+            [if test -z "$gl_lib_prefix"; then
+               gl_cv_lib_pthread="none required"
+             else
+               gl_cv_lib_pthread=$gl_lib_prefix
+             fi])
+          test -n "$gl_cv_lib_pthread" && break
+        done
+        LIBS="$gl_saved_libs"
+       ])
+     if test "$gl_cv_lib_pthread" != "none required"; then
+       LIB_PTHREAD="$gl_cv_lib_pthread"
+     fi
    fi
    AC_SUBST([LIB_PTHREAD])