chiark / gitweb /
gnupg2 (2.1.17-3) unstable; urgency=medium
[gnupg2.git] / m4 / lock.m4
1 # lock.m4 serial 6 (gettext-0.16)
2 dnl Copyright (C) 2005-2006 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 dnl From Bruno Haible.
8
9 dnl Tests for a multithreading library to be used.
10 dnl Defines at most one of the macros USE_POSIX_THREADS, USE_SOLARIS_THREADS,
11 dnl USE_PTH_THREADS, USE_WIN32_THREADS
12 dnl Sets the variables LIBTHREAD and LTLIBTHREAD to the linker options for use
13 dnl in a Makefile (LIBTHREAD for use without libtool, LTLIBTHREAD for use with
14 dnl libtool).
15 dnl Sets the variables LIBMULTITHREAD and LTLIBMULTITHREAD similarly, for
16 dnl programs that really need multithread functionality. The difference
17 dnl between LIBTHREAD and LIBMULTITHREAD is that on platforms supporting weak
18 dnl symbols, typically LIBTHREAD="" whereas LIBMULTITHREAD="-lpthread".
19 dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
20 dnl multithread-safe programs.
21
22 AC_DEFUN([gl_LOCK_EARLY],
23 [
24   AC_REQUIRE([gl_LOCK_EARLY_BODY])
25 ])
26
27 dnl The guts of gl_LOCK_EARLY. Needs to be expanded only once.
28
29 AC_DEFUN([gl_LOCK_EARLY_BODY],
30 [
31   dnl Ordering constraints: This macro modifies CPPFLAGS in a way that
32   dnl influences the result of the autoconf tests that test for *_unlocked
33   dnl declarations, on AIX 5 at least. Therefore it must come early.
34   AC_BEFORE([$0], [gl_FUNC_GLIBC_UNLOCKED_IO])dnl
35   AC_BEFORE([$0], [gl_ARGP])dnl
36
37   AC_REQUIRE([AC_CANONICAL_HOST])
38   AC_REQUIRE([AC_GNU_SOURCE]) dnl needed for pthread_rwlock_t on glibc systems
39   dnl Check for multithreading.
40   AC_ARG_ENABLE(threads,
41 AC_HELP_STRING([--enable-threads={posix|solaris|pth|win32}], [specify multithreading API])
42 AC_HELP_STRING([--disable-threads], [build without multithread safety]),
43     [gl_use_threads=$enableval],
44     [case "$host_os" in
45        dnl Disable multithreading by default on OSF/1, because it interferes
46        dnl with fork()/exec(): When msgexec is linked with -lpthread, its child
47        dnl process gets an endless segmentation fault inside execvp().
48        osf*) gl_use_threads=no ;;
49        *)    gl_use_threads=yes ;;
50      esac
51     ])
52   if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
53     # For using <pthread.h>:
54     case "$host_os" in
55       osf*)
56         # On OSF/1, the compiler needs the flag -D_REENTRANT so that it
57         # groks <pthread.h>. cc also understands the flag -pthread, but
58         # we don't use it because 1. gcc-2.95 doesn't understand -pthread,
59         # 2. putting a flag into CPPFLAGS that has an effect on the linker
60         # causes the AC_TRY_LINK test below to succeed unexpectedly,
61         # leading to wrong values of LIBTHREAD and LTLIBTHREAD.
62         CPPFLAGS="$CPPFLAGS -D_REENTRANT"
63         ;;
64     esac
65     # Some systems optimize for single-threaded programs by default, and
66     # need special flags to disable these optimizations. For example, the
67     # definition of 'errno' in <errno.h>.
68     case "$host_os" in
69       aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;;
70       solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;;
71     esac
72   fi
73 ])
74
75 dnl The guts of gl_LOCK. Needs to be expanded only once.
76
77 AC_DEFUN([gl_LOCK_BODY],
78 [
79   AC_REQUIRE([gl_LOCK_EARLY_BODY])
80   gl_threads_api=none
81   LIBTHREAD=
82   LTLIBTHREAD=
83   LIBMULTITHREAD=
84   LTLIBMULTITHREAD=
85   if test "$gl_use_threads" != no; then
86     dnl Check whether the compiler and linker support weak declarations.
87     AC_MSG_CHECKING([whether imported symbols can be declared weak])
88     gl_have_weak=no
89     AC_TRY_LINK([extern void xyzzy ();
90 #pragma weak xyzzy], [xyzzy();], [gl_have_weak=yes])
91     AC_MSG_RESULT([$gl_have_weak])
92     if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
93       # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
94       # it groks <pthread.h>. It's added above, in gl_LOCK_EARLY_BODY.
95       AC_CHECK_HEADER(pthread.h, gl_have_pthread_h=yes, gl_have_pthread_h=no)
96       if test "$gl_have_pthread_h" = yes; then
97         # Other possible tests:
98         #   -lpthreads (FSU threads, PCthreads)
99         #   -lgthreads
100         gl_have_pthread=
101         # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
102         # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
103         # the second one only in libpthread, and lock.c needs it.
104         AC_TRY_LINK([#include <pthread.h>],
105           [pthread_mutex_lock((pthread_mutex_t*)0);
106            pthread_mutexattr_init((pthread_mutexattr_t*)0);],
107           [gl_have_pthread=yes])
108         # Test for libpthread by looking for pthread_kill. (Not pthread_self,
109         # since it is defined as a macro on OSF/1.)
110         if test -n "$gl_have_pthread"; then
111           # The program links fine without libpthread. But it may actually
112           # need to link with libpthread in order to create multiple threads.
113           AC_CHECK_LIB(pthread, pthread_kill,
114             [LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread
115              # On Solaris and HP-UX, most pthread functions exist also in libc.
116              # Therefore pthread_in_use() needs to actually try to create a
117              # thread: pthread_create from libc will fail, whereas
118              # pthread_create will actually create a thread.
119              case "$host_os" in
120                solaris* | hpux*)
121                  AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], 1,
122                    [Define if the pthread_in_use() detection is hard.])
123              esac
124             ])
125         else
126           # Some library is needed. Try libpthread and libc_r.
127           AC_CHECK_LIB(pthread, pthread_kill,
128             [gl_have_pthread=yes
129              LIBTHREAD=-lpthread LTLIBTHREAD=-lpthread
130              LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread])
131           if test -z "$gl_have_pthread"; then
132             # For FreeBSD 4.
133             AC_CHECK_LIB(c_r, pthread_kill,
134               [gl_have_pthread=yes
135                LIBTHREAD=-lc_r LTLIBTHREAD=-lc_r
136                LIBMULTITHREAD=-lc_r LTLIBMULTITHREAD=-lc_r])
137           fi
138         fi
139         if test -n "$gl_have_pthread"; then
140           gl_threads_api=posix
141           AC_DEFINE([USE_POSIX_THREADS], 1,
142             [Define if the POSIX multithreading library can be used.])
143           if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
144             if test $gl_have_weak = yes; then
145               AC_DEFINE([USE_POSIX_THREADS_WEAK], 1,
146                 [Define if references to the POSIX multithreading library should be made weak.])
147               LIBTHREAD=
148               LTLIBTHREAD=
149             fi
150           fi
151           # OSF/1 4.0 and MacOS X 10.1 lack the pthread_rwlock_t type and the
152           # pthread_rwlock_* functions.
153           AC_CHECK_TYPE([pthread_rwlock_t],
154             [AC_DEFINE([HAVE_PTHREAD_RWLOCK], 1,
155                [Define if the POSIX multithreading library has read/write locks.])],
156             [],
157             [#include <pthread.h>])
158           # glibc defines PTHREAD_MUTEX_RECURSIVE as enum, not as a macro.
159           AC_TRY_COMPILE([#include <pthread.h>],
160             [#if __FreeBSD__ == 4
161 error "No, in FreeBSD 4.0 recursive mutexes actually don't work."
162 #else
163 int x = (int)PTHREAD_MUTEX_RECURSIVE;
164 return !x;
165 #endif],
166             [AC_DEFINE([HAVE_PTHREAD_MUTEX_RECURSIVE], 1,
167                [Define if the <pthread.h> defines PTHREAD_MUTEX_RECURSIVE.])])
168         fi
169       fi
170     fi
171     if test -z "$gl_have_pthread"; then
172       if test "$gl_use_threads" = yes || test "$gl_use_threads" = solaris; then
173         gl_have_solaristhread=
174         gl_save_LIBS="$LIBS"
175         LIBS="$LIBS -lthread"
176         AC_TRY_LINK([#include <thread.h>
177 #include <synch.h>],
178           [thr_self();],
179           [gl_have_solaristhread=yes])
180         LIBS="$gl_save_LIBS"
181         if test -n "$gl_have_solaristhread"; then
182           gl_threads_api=solaris
183           LIBTHREAD=-lthread
184           LTLIBTHREAD=-lthread
185           LIBMULTITHREAD="$LIBTHREAD"
186           LTLIBMULTITHREAD="$LTLIBTHREAD"
187           AC_DEFINE([USE_SOLARIS_THREADS], 1,
188             [Define if the old Solaris multithreading library can be used.])
189           if test $gl_have_weak = yes; then
190             AC_DEFINE([USE_SOLARIS_THREADS_WEAK], 1,
191               [Define if references to the old Solaris multithreading library should be made weak.])
192             LIBTHREAD=
193             LTLIBTHREAD=
194           fi
195         fi
196       fi
197     fi
198     if test "$gl_use_threads" = pth; then
199       gl_save_CPPFLAGS="$CPPFLAGS"
200       AC_LIB_LINKFLAGS(pth)
201       gl_have_pth=
202       gl_save_LIBS="$LIBS"
203       LIBS="$LIBS -lpth"
204       AC_TRY_LINK([#include <pth.h>], [pth_self();], gl_have_pth=yes)
205       LIBS="$gl_save_LIBS"
206       if test -n "$gl_have_pth"; then
207         gl_threads_api=pth
208         LIBTHREAD="$LIBPTH"
209         LTLIBTHREAD="$LTLIBPTH"
210         LIBMULTITHREAD="$LIBTHREAD"
211         LTLIBMULTITHREAD="$LTLIBTHREAD"
212         AC_DEFINE([USE_PTH_THREADS], 1,
213           [Define if the GNU Pth multithreading library can be used.])
214         if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
215           if test $gl_have_weak = yes; then
216             AC_DEFINE([USE_PTH_THREADS_WEAK], 1,
217               [Define if references to the GNU Pth multithreading library should be made weak.])
218             LIBTHREAD=
219             LTLIBTHREAD=
220           fi
221         fi
222       else
223         CPPFLAGS="$gl_save_CPPFLAGS"
224       fi
225     fi
226     if test -z "$gl_have_pthread"; then
227       if test "$gl_use_threads" = yes || test "$gl_use_threads" = win32; then
228         if { case "$host_os" in
229                mingw*) true;;
230                *) false;;
231              esac
232            }; then
233           gl_threads_api=win32
234           AC_DEFINE([USE_WIN32_THREADS], 1,
235             [Define if the Win32 multithreading API can be used.])
236         fi
237       fi
238     fi
239   fi
240   AC_MSG_CHECKING([for multithread API to use])
241   AC_MSG_RESULT([$gl_threads_api])
242   AC_SUBST(LIBTHREAD)
243   AC_SUBST(LTLIBTHREAD)
244   AC_SUBST(LIBMULTITHREAD)
245   AC_SUBST(LTLIBMULTITHREAD)
246 ])
247
248 AC_DEFUN([gl_LOCK],
249 [
250   AC_REQUIRE([gl_LOCK_EARLY])
251   AC_REQUIRE([gl_LOCK_BODY])
252   gl_PREREQ_LOCK
253 ])
254
255 # Prerequisites of lib/lock.c.
256 AC_DEFUN([gl_PREREQ_LOCK], [
257   AC_REQUIRE([AC_C_INLINE])
258 ])
259
260 dnl Survey of platforms:
261 dnl
262 dnl Platform          Available   Compiler    Supports   test-lock
263 dnl                   flavours    option      weak       result
264 dnl ---------------   ---------   ---------   --------   ---------
265 dnl Linux 2.4/glibc   posix       -lpthread       Y      OK
266 dnl
267 dnl GNU Hurd/glibc    posix
268 dnl
269 dnl FreeBSD 5.3       posix       -lc_r           Y
270 dnl                   posix       -lkse ?         Y
271 dnl                   posix       -lpthread ?     Y
272 dnl                   posix       -lthr           Y
273 dnl
274 dnl FreeBSD 5.2       posix       -lc_r           Y
275 dnl                   posix       -lkse           Y
276 dnl                   posix       -lthr           Y
277 dnl
278 dnl FreeBSD 4.0,4.10  posix       -lc_r           Y      OK
279 dnl
280 dnl NetBSD 1.6        --
281 dnl
282 dnl OpenBSD 3.4       posix       -lpthread       Y      OK
283 dnl
284 dnl MacOS X 10.[123]  posix       -lpthread       Y      OK
285 dnl
286 dnl Solaris 7,8,9     posix       -lpthread       Y      Sol 7,8: 0.0; Sol 9: OK
287 dnl                   solaris     -lthread        Y      Sol 7,8: 0.0; Sol 9: OK
288 dnl
289 dnl HP-UX 11          posix       -lpthread       N (cc) OK
290 dnl                                               Y (gcc)
291 dnl
292 dnl IRIX 6.5          posix       -lpthread       Y      0.5
293 dnl
294 dnl AIX 4.3,5.1       posix       -lpthread       N      AIX 4: 0.5; AIX 5: OK
295 dnl
296 dnl OSF/1 4.0,5.1     posix       -pthread (cc)   N      OK
297 dnl                               -lpthread (gcc) Y
298 dnl
299 dnl Cygwin            posix       -lpthread       Y      OK
300 dnl
301 dnl Any of the above  pth         -lpth                  0.0
302 dnl
303 dnl Mingw             win32                       N      OK
304 dnl
305 dnl BeOS 5            --
306 dnl
307 dnl The test-lock result shows what happens if in test-lock.c EXPLICIT_YIELD is
308 dnl turned off:
309 dnl   OK if all three tests terminate OK,
310 dnl   0.5 if the first test terminates OK but the second one loops endlessly,
311 dnl   0.0 if the first test already loops endlessly.