pthread_sigmask: Work around bug in single-threaded implementation.
[gnulib.git] / m4 / pthread_sigmask.m4
1 # pthread_sigmask.m4 serial 8
2 dnl Copyright (C) 2011 Free Software Foundation, Inc.
3 dnl This file is free software; the Free Software Foundation
4 dnl gives unlimited permission to copy and/or distribute it,
5 dnl with or without modifications, as long as this notice is preserved.
6
7 AC_DEFUN([gl_FUNC_PTHREAD_SIGMASK],
8 [
9   AC_CHECK_FUNCS_ONCE([pthread_sigmask])
10   LIB_PTHREAD_SIGMASK=
11   m4_ifdef([gl_THREADLIB], [
12     AC_REQUIRE([gl_THREADLIB])
13     if test "$gl_threads_api" = posix; then
14       if test $ac_cv_func_pthread_sigmask = yes; then
15         dnl pthread_sigmask is available without -lpthread.
16         :
17       else
18         if test -n "$LIBMULTITHREAD"; then
19           AC_CACHE_CHECK([for pthread_sigmask in $LIBMULTITHREAD],
20             [gl_cv_func_pthread_sigmask_in_LIBMULTITHREAD],
21             [gl_save_LIBS="$LIBS"
22              LIBS="$LIBS $LIBMULTITHREAD"
23              AC_LINK_IFELSE(
24                [AC_LANG_PROGRAM(
25                   [[#include <pthread.h>
26                     #include <signal.h>
27                   ]],
28                   [[return pthread_sigmask (0, (sigset_t *) 0, (sigset_t *) 0);]])
29                ],
30                [gl_cv_func_pthread_sigmask_in_LIBMULTITHREAD=yes],
31                [gl_cv_func_pthread_sigmask_in_LIBMULTITHREAD=no])
32              LIBS="$gl_save_LIBS"
33             ])
34           if test $gl_cv_func_pthread_sigmask_in_LIBMULTITHREAD = yes; then
35             dnl pthread_sigmask is available with -lpthread.
36             LIB_PTHREAD_SIGMASK="$LIBMULTITHREAD"
37           else
38             dnl pthread_sigmask is not available at all.
39             HAVE_PTHREAD_SIGMASK=0
40           fi
41         else
42           dnl pthread_sigmask is not available at all.
43           HAVE_PTHREAD_SIGMASK=0
44         fi
45       fi
46     else
47       dnl pthread_sigmask may exist but does not interoperate with the chosen
48       dnl multithreading facility.
49       dnl If "$gl_threads_api" = pth, we could use the function pth_sigmask,
50       dnl but it is equivalent to sigprocmask, so we choose to emulate
51       dnl pthread_sigmask with sigprocmask also in this case. This yields fewer
52       dnl link dependencies.
53       if test $ac_cv_func_pthread_sigmask = yes; then
54         REPLACE_PTHREAD_SIGMASK=1
55       else
56         HAVE_PTHREAD_SIGMASK=0
57       fi
58     fi
59   ] ,[
60     dnl gl_THREADLIB is not in use.  Assume the application wants
61     dnl POSIX semantics.
62     if test $ac_cv_func_pthread_sigmask != yes; then
63       gl_save_LIBS=$LIBS
64       AC_SEARCH_LIBS([pthread_sigmask], [pthread c_r])
65       LIBS=$gl_save_LIBS
66       if test "$ac_cv_search_pthread_sigmask" = no; then
67         HAVE_PTHREAD_SIGMASK=0
68       elif test "$ac_cv_search_pthread_sigmask" != 'none required'; then
69         LIB_PTHREAD_SIGMASK=$ac_cv_search_pthread_sigmask
70       fi
71     fi
72   ])
73   AC_SUBST([LIB_PTHREAD_SIGMASK])
74   dnl We don't need a variable LTLIB_PTHREAD_SIGMASK, because when
75   dnl "$gl_threads_api" = posix, $LTLIBMULTITHREAD and $LIBMULTITHREAD are the
76   dnl same: either both empty or both "-lpthread".
77
78   dnl Now test for some bugs in the system function.
79   if test $HAVE_PTHREAD_SIGMASK = 1; then
80     AC_REQUIRE([AC_PROG_CC])
81     AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
82
83     dnl On FreeBSD 6.4, HP-UX 11.31, Solaris 9, in programs that are not linked
84     dnl with -lpthread, the pthread_sigmask() function always returns 0 and has
85     dnl no effect.
86     if test -z "$LIB_PTHREAD_SIGMASK"; then
87       AC_CACHE_CHECK([whether pthread_sigmask works without -lpthread],
88         [gl_cv_func_pthread_sigmask_in_libc_works],
89         [
90           AC_RUN_IFELSE(
91             [AC_LANG_SOURCE([[
92 #include <pthread.h>
93 #include <signal.h>
94 #include <stddef.h>
95 int main ()
96 {
97   sigset_t set;
98   sigemptyset (&set);
99   return pthread_sigmask (1729, &set, NULL) != 0;
100 }]])],
101             [gl_cv_func_pthread_sigmask_in_libc_works=no],
102             [gl_cv_func_pthread_sigmask_in_libc_works=yes],
103             [
104 changequote(,)dnl
105              case "$host_os" in
106                freebsd* | hpux* | solaris | solaris2.[2-9]*)
107                  gl_cv_func_pthread_sigmask_in_libc_works="guessing no";;
108                *)
109                  gl_cv_func_pthread_sigmask_in_libc_works="guessing yes";;
110              esac
111 changequote([,])dnl
112             ])
113         ])
114       case "$gl_cv_func_pthread_sigmask_in_libc_works" in
115         *no)
116           REPLACE_PTHREAD_SIGMASK=1
117           AC_DEFINE([PTHREAD_SIGMASK_INEFFECTIVE], [1],
118             [Define to 1 if pthread_mask() may returns 0 and have no effect.])
119           ;;
120       esac
121     fi
122   fi
123 ])
124
125 # Prerequisite of lib/pthread_sigmask.c.
126 AC_DEFUN([gl_PREREQ_PTHREAD_SIGMASK],
127 [
128   if test $HAVE_PTHREAD_SIGMASK = 1; then
129     AC_DEFINE([HAVE_PTHREAD_SIGMASK], [1],
130       [Define to 1 if the pthread_sigmask function can be used (despite bugs).])
131   fi
132 ])