1 | # threadlib.m4 serial 31
|
---|
2 | dnl Copyright (C) 2005-2021 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 | AC_PREREQ([2.60])
|
---|
10 |
|
---|
11 | dnl The general structure of the multithreading modules in gnulib is that we
|
---|
12 | dnl have three set of modules:
|
---|
13 | dnl
|
---|
14 | dnl * POSIX API:
|
---|
15 | dnl pthread, which combines
|
---|
16 | dnl pthread-h
|
---|
17 | dnl pthread-thread
|
---|
18 | dnl pthread-once
|
---|
19 | dnl pthread-mutex
|
---|
20 | dnl pthread-rwlock
|
---|
21 | dnl pthread-cond
|
---|
22 | dnl pthread-tss
|
---|
23 | dnl pthread-spin
|
---|
24 | dnl sched_yield
|
---|
25 | dnl
|
---|
26 | dnl * ISO C API:
|
---|
27 | dnl threads, which combines
|
---|
28 | dnl threads-h
|
---|
29 | dnl thrd
|
---|
30 | dnl mtx
|
---|
31 | dnl cnd
|
---|
32 | dnl tss
|
---|
33 | dnl
|
---|
34 | dnl * Gnulib API, with an implementation that can be chosen at configure
|
---|
35 | dnl time through the option --enable-threads=...
|
---|
36 | dnl thread
|
---|
37 | dnl lock
|
---|
38 | dnl cond
|
---|
39 | dnl tls
|
---|
40 | dnl yield
|
---|
41 | dnl
|
---|
42 | dnl They are independent, except for the fact that
|
---|
43 | dnl - the implementation of the ISO C API may use the POSIX (or some other
|
---|
44 | dnl platform dependent) API,
|
---|
45 | dnl - the implementation of the Gnulib API may use the POSIX or ISO C or
|
---|
46 | dnl some other platform dependent API, depending on the --enable-threads
|
---|
47 | dnl option.
|
---|
48 | dnl
|
---|
49 | dnl This file contains macros for all of these APIs!
|
---|
50 |
|
---|
51 | dnl ============================================================================
|
---|
52 | dnl Macros for all thread APIs
|
---|
53 |
|
---|
54 | AC_DEFUN([gl_ANYTHREADLIB_EARLY],
|
---|
55 | [
|
---|
56 | AC_REQUIRE([AC_CANONICAL_HOST])
|
---|
57 | if test -z "$gl_anythreadlib_early_done"; then
|
---|
58 | case "$host_os" in
|
---|
59 | osf*)
|
---|
60 | # On OSF/1, the compiler needs the flag -D_REENTRANT so that it
|
---|
61 | # groks <pthread.h>. cc also understands the flag -pthread, but
|
---|
62 | # we don't use it because 1. gcc-2.95 doesn't understand -pthread,
|
---|
63 | # 2. putting a flag into CPPFLAGS that has an effect on the linker
|
---|
64 | # causes the AC_LINK_IFELSE test below to succeed unexpectedly,
|
---|
65 | # leading to wrong values of LIBTHREAD and LTLIBTHREAD.
|
---|
66 | CPPFLAGS="$CPPFLAGS -D_REENTRANT"
|
---|
67 | ;;
|
---|
68 | esac
|
---|
69 | # Some systems optimize for single-threaded programs by default, and
|
---|
70 | # need special flags to disable these optimizations. For example, the
|
---|
71 | # definition of 'errno' in <errno.h>.
|
---|
72 | case "$host_os" in
|
---|
73 | aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;;
|
---|
74 | solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;;
|
---|
75 | esac
|
---|
76 | gl_anythreadlib_early_done=done
|
---|
77 | fi
|
---|
78 | ])
|
---|
79 |
|
---|
80 | dnl Checks whether the compiler and linker support weak declarations of symbols.
|
---|
81 |
|
---|
82 | AC_DEFUN([gl_WEAK_SYMBOLS],
|
---|
83 | [
|
---|
84 | AC_REQUIRE([AC_CANONICAL_HOST])
|
---|
85 | AC_CACHE_CHECK([whether imported symbols can be declared weak],
|
---|
86 | [gl_cv_have_weak],
|
---|
87 | [gl_cv_have_weak=no
|
---|
88 | dnl First, test whether the compiler accepts it syntactically.
|
---|
89 | AC_LINK_IFELSE(
|
---|
90 | [AC_LANG_PROGRAM(
|
---|
91 | [[extern void xyzzy ();
|
---|
92 | #pragma weak xyzzy]],
|
---|
93 | [[xyzzy();]])],
|
---|
94 | [gl_cv_have_weak=maybe])
|
---|
95 | if test $gl_cv_have_weak = maybe; then
|
---|
96 | dnl Second, test whether it actually works. On Cygwin 1.7.2, with
|
---|
97 | dnl gcc 4.3, symbols declared weak always evaluate to the address 0.
|
---|
98 | AC_RUN_IFELSE(
|
---|
99 | [AC_LANG_SOURCE([[
|
---|
100 | #include <stdio.h>
|
---|
101 | #pragma weak fputs
|
---|
102 | int main ()
|
---|
103 | {
|
---|
104 | return (fputs == NULL);
|
---|
105 | }]])],
|
---|
106 | [gl_cv_have_weak=yes],
|
---|
107 | [gl_cv_have_weak=no],
|
---|
108 | [dnl When cross-compiling, assume that only ELF platforms support
|
---|
109 | dnl weak symbols.
|
---|
110 | AC_EGREP_CPP([Extensible Linking Format],
|
---|
111 | [#ifdef __ELF__
|
---|
112 | Extensible Linking Format
|
---|
113 | #endif
|
---|
114 | ],
|
---|
115 | [gl_cv_have_weak="guessing yes"],
|
---|
116 | [gl_cv_have_weak="guessing no"])
|
---|
117 | ])
|
---|
118 | fi
|
---|
119 | dnl But when linking statically, weak symbols don't work.
|
---|
120 | case " $LDFLAGS " in
|
---|
121 | *" -static "*) gl_cv_have_weak=no ;;
|
---|
122 | esac
|
---|
123 | dnl Test for a bug in FreeBSD 11: A link error occurs when using a weak
|
---|
124 | dnl symbol and linking against a shared library that has a dependency on
|
---|
125 | dnl the shared library that defines the symbol.
|
---|
126 | case "$gl_cv_have_weak" in
|
---|
127 | *yes)
|
---|
128 | case "$host_os" in
|
---|
129 | freebsd* | dragonfly* | midnightbsd*)
|
---|
130 | : > conftest1.c
|
---|
131 | $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&AS_MESSAGE_LOG_FD 2>&1
|
---|
132 | cat <<EOF > conftest2.c
|
---|
133 | #include <pthread.h>
|
---|
134 | #pragma weak pthread_mutexattr_gettype
|
---|
135 | int main ()
|
---|
136 | {
|
---|
137 | return (pthread_mutexattr_gettype != NULL);
|
---|
138 | }
|
---|
139 | EOF
|
---|
140 | $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&AS_MESSAGE_LOG_FD 2>&1 \
|
---|
141 | || gl_cv_have_weak=no
|
---|
142 | rm -f conftest1.c libempty.so conftest2.c conftest
|
---|
143 | ;;
|
---|
144 | esac
|
---|
145 | ;;
|
---|
146 | esac
|
---|
147 | ])
|
---|
148 | case "$gl_cv_have_weak" in
|
---|
149 | *yes)
|
---|
150 | AC_DEFINE([HAVE_WEAK_SYMBOLS], [1],
|
---|
151 | [Define to 1 if the compiler and linker support weak declarations of symbols.])
|
---|
152 | ;;
|
---|
153 | esac
|
---|
154 | ])
|
---|
155 |
|
---|
156 | dnl ============================================================================
|
---|
157 | dnl Macros for the POSIX API
|
---|
158 |
|
---|
159 | dnl gl_PTHREADLIB
|
---|
160 | dnl -------------
|
---|
161 | dnl Tests for the libraries needs for using the POSIX threads API.
|
---|
162 | dnl Sets the variable LIBPTHREAD to the linker options for use in a Makefile.
|
---|
163 | dnl Sets the variable LIBPMULTITHREAD, for programs that really need
|
---|
164 | dnl multithread functionality. The difference between LIBPTHREAD and
|
---|
165 | dnl LIBPMULTITHREAD is that on platforms supporting weak symbols, typically
|
---|
166 | dnl LIBPTHREAD is empty whereas LIBPMULTITHREAD is not.
|
---|
167 | dnl Sets the variable LIB_SCHED_YIELD to the linker options needed to use the
|
---|
168 | dnl sched_yield() function.
|
---|
169 | dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
|
---|
170 | dnl multithread-safe programs.
|
---|
171 | dnl Defines the C macro HAVE_PTHREAD_API if (at least parts of) the POSIX
|
---|
172 | dnl threads API is available.
|
---|
173 |
|
---|
174 | dnl The guts of gl_PTHREADLIB. Needs to be expanded only once.
|
---|
175 |
|
---|
176 | AC_DEFUN([gl_PTHREADLIB_BODY],
|
---|
177 | [
|
---|
178 | AC_REQUIRE([gl_ANYTHREADLIB_EARLY])
|
---|
179 | if test -z "$gl_pthreadlib_body_done"; then
|
---|
180 | gl_pthread_api=no
|
---|
181 | LIBPTHREAD=
|
---|
182 | LIBPMULTITHREAD=
|
---|
183 | # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
|
---|
184 | # it groks <pthread.h>. It's added above, in gl_ANYTHREADLIB_EARLY.
|
---|
185 | AC_CHECK_HEADER([pthread.h],
|
---|
186 | [gl_have_pthread_h=yes], [gl_have_pthread_h=no])
|
---|
187 | if test "$gl_have_pthread_h" = yes; then
|
---|
188 | # Other possible tests:
|
---|
189 | # -lpthreads (FSU threads, PCthreads)
|
---|
190 | # -lgthreads
|
---|
191 | # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
|
---|
192 | # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
|
---|
193 | # the second one only in libpthread, and lock.c needs it.
|
---|
194 | #
|
---|
195 | # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04
|
---|
196 | # needs -pthread for some reason. See:
|
---|
197 | # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html
|
---|
198 | save_LIBS=$LIBS
|
---|
199 | for gl_pthread in '' '-pthread'; do
|
---|
200 | LIBS="$LIBS $gl_pthread"
|
---|
201 | AC_LINK_IFELSE(
|
---|
202 | [AC_LANG_PROGRAM(
|
---|
203 | [[#include <pthread.h>
|
---|
204 | pthread_mutex_t m;
|
---|
205 | pthread_mutexattr_t ma;
|
---|
206 | ]],
|
---|
207 | [[pthread_mutex_lock (&m);
|
---|
208 | pthread_mutexattr_init (&ma);]])],
|
---|
209 | [gl_pthread_api=yes
|
---|
210 | LIBPTHREAD=$gl_pthread
|
---|
211 | LIBPMULTITHREAD=$gl_pthread])
|
---|
212 | LIBS=$save_LIBS
|
---|
213 | test $gl_pthread_api = yes && break
|
---|
214 | done
|
---|
215 | echo "$as_me:__oline__: gl_pthread_api=$gl_pthread_api" >&AS_MESSAGE_LOG_FD
|
---|
216 | echo "$as_me:__oline__: LIBPTHREAD=$LIBPTHREAD" >&AS_MESSAGE_LOG_FD
|
---|
217 |
|
---|
218 | gl_pthread_in_glibc=no
|
---|
219 | # On Linux with glibc >= 2.34, libc contains the fully functional
|
---|
220 | # pthread functions.
|
---|
221 | case "$host_os" in
|
---|
222 | linux*)
|
---|
223 | AC_EGREP_CPP([Lucky user],
|
---|
224 | [#include <features.h>
|
---|
225 | #ifdef __GNU_LIBRARY__
|
---|
226 | #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 34) || (__GLIBC__ > 2)
|
---|
227 | Lucky user
|
---|
228 | #endif
|
---|
229 | #endif
|
---|
230 | ],
|
---|
231 | [gl_pthread_in_glibc=yes],
|
---|
232 | [])
|
---|
233 | ;;
|
---|
234 | esac
|
---|
235 | echo "$as_me:__oline__: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&AS_MESSAGE_LOG_FD
|
---|
236 |
|
---|
237 | # Test for libpthread by looking for pthread_kill. (Not pthread_self,
|
---|
238 | # since it is defined as a macro on OSF/1.)
|
---|
239 | if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then
|
---|
240 | # The program links fine without libpthread. But it may actually
|
---|
241 | # need to link with libpthread in order to create multiple threads.
|
---|
242 | AC_CHECK_LIB([pthread], [pthread_kill],
|
---|
243 | [if test $gl_pthread_in_glibc = yes; then
|
---|
244 | LIBPMULTITHREAD=
|
---|
245 | else
|
---|
246 | LIBPMULTITHREAD=-lpthread
|
---|
247 | # On Solaris and HP-UX, most pthread functions exist also in libc.
|
---|
248 | # Therefore pthread_in_use() needs to actually try to create a
|
---|
249 | # thread: pthread_create from libc will fail, whereas
|
---|
250 | # pthread_create will actually create a thread.
|
---|
251 | # On Solaris 10 or newer, this test is no longer needed, because
|
---|
252 | # libc contains the fully functional pthread functions.
|
---|
253 | case "$host_os" in
|
---|
254 | solaris | solaris2.[1-9] | solaris2.[1-9].* | hpux*)
|
---|
255 | AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1],
|
---|
256 | [Define if the pthread_in_use() detection is hard.])
|
---|
257 | esac
|
---|
258 | fi
|
---|
259 | ])
|
---|
260 | elif test $gl_pthread_api != yes; then
|
---|
261 | # Some library is needed. Try libpthread and libc_r.
|
---|
262 | AC_CHECK_LIB([pthread], [pthread_kill],
|
---|
263 | [gl_pthread_api=yes
|
---|
264 | LIBPTHREAD=-lpthread
|
---|
265 | LIBPMULTITHREAD=-lpthread])
|
---|
266 | if test $gl_pthread_api != yes; then
|
---|
267 | # For FreeBSD 4.
|
---|
268 | AC_CHECK_LIB([c_r], [pthread_kill],
|
---|
269 | [gl_pthread_api=yes
|
---|
270 | LIBPTHREAD=-lc_r
|
---|
271 | LIBPMULTITHREAD=-lc_r])
|
---|
272 | fi
|
---|
273 | fi
|
---|
274 | echo "$as_me:__oline__: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&AS_MESSAGE_LOG_FD
|
---|
275 | fi
|
---|
276 | AC_MSG_CHECKING([whether POSIX threads API is available])
|
---|
277 | AC_MSG_RESULT([$gl_pthread_api])
|
---|
278 | AC_SUBST([LIBPTHREAD])
|
---|
279 | AC_SUBST([LIBPMULTITHREAD])
|
---|
280 | if test $gl_pthread_api = yes; then
|
---|
281 | AC_DEFINE([HAVE_PTHREAD_API], [1],
|
---|
282 | [Define if you have the <pthread.h> header and the POSIX threads API.])
|
---|
283 | fi
|
---|
284 |
|
---|
285 | dnl On some systems, sched_yield is in librt, rather than in libpthread.
|
---|
286 | AC_LINK_IFELSE(
|
---|
287 | [AC_LANG_PROGRAM(
|
---|
288 | [[#include <sched.h>]],
|
---|
289 | [[sched_yield ();]])],
|
---|
290 | [LIB_SCHED_YIELD=
|
---|
291 | ],
|
---|
292 | [dnl Solaris 7...10 has sched_yield in librt, not in libpthread or libc.
|
---|
293 | AC_CHECK_LIB([rt], [sched_yield], [LIB_SCHED_YIELD=-lrt],
|
---|
294 | [dnl Solaris 2.5.1, 2.6 has sched_yield in libposix4, not librt.
|
---|
295 | AC_CHECK_LIB([posix4], [sched_yield], [LIB_SCHED_YIELD=-lposix4])])
|
---|
296 | ])
|
---|
297 | AC_SUBST([LIB_SCHED_YIELD])
|
---|
298 |
|
---|
299 | gl_pthreadlib_body_done=done
|
---|
300 | fi
|
---|
301 | ])
|
---|
302 |
|
---|
303 | AC_DEFUN([gl_PTHREADLIB],
|
---|
304 | [
|
---|
305 | AC_REQUIRE([gl_ANYTHREADLIB_EARLY])
|
---|
306 | gl_PTHREADLIB_BODY
|
---|
307 | ])
|
---|
308 |
|
---|
309 | dnl ============================================================================
|
---|
310 | dnl Macros for the ISO C API
|
---|
311 |
|
---|
312 | dnl gl_STDTHREADLIB
|
---|
313 | dnl ---------------
|
---|
314 | dnl Tests for the libraries needs for using the ISO C threads API.
|
---|
315 | dnl Sets the variable LIBSTDTHREAD to the linker options for use in a Makefile.
|
---|
316 | dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
|
---|
317 | dnl multithread-safe programs.
|
---|
318 | dnl Defines the C macro HAVE_THREADS_H if (at least parts of) the ISO C threads
|
---|
319 | dnl API is available.
|
---|
320 |
|
---|
321 | dnl The guts of gl_STDTHREADLIB. Needs to be expanded only once.
|
---|
322 |
|
---|
323 | AC_DEFUN([gl_STDTHREADLIB_BODY],
|
---|
324 | [
|
---|
325 | AC_REQUIRE([gl_ANYTHREADLIB_EARLY])
|
---|
326 | AC_REQUIRE([AC_CANONICAL_HOST])
|
---|
327 | if test -z "$gl_stdthreadlib_body_done"; then
|
---|
328 | AC_CHECK_HEADERS_ONCE([threads.h])
|
---|
329 |
|
---|
330 | case "$host_os" in
|
---|
331 | mingw*)
|
---|
332 | LIBSTDTHREAD=
|
---|
333 | ;;
|
---|
334 | *)
|
---|
335 | gl_PTHREADLIB_BODY
|
---|
336 | if test $ac_cv_header_threads_h = yes; then
|
---|
337 | dnl glibc >= 2.29 has thrd_create in libpthread.
|
---|
338 | dnl FreeBSD >= 10 has thrd_create in libstdthreads; this library depends
|
---|
339 | dnl on libpthread (for the symbol 'pthread_mutexattr_gettype').
|
---|
340 | dnl glibc >= 2.34, AIX >= 7.1, and Solaris >= 11.4 have thrd_create in
|
---|
341 | dnl libc.
|
---|
342 | AC_CHECK_FUNCS([thrd_create])
|
---|
343 | if test $ac_cv_func_thrd_create = yes; then
|
---|
344 | LIBSTDTHREAD=
|
---|
345 | else
|
---|
346 | AC_CHECK_LIB([stdthreads], [thrd_create], [
|
---|
347 | LIBSTDTHREAD='-lstdthreads -lpthread'
|
---|
348 | ], [
|
---|
349 | dnl Guess that thrd_create is in libpthread.
|
---|
350 | LIBSTDTHREAD="$LIBPMULTITHREAD"
|
---|
351 | ])
|
---|
352 | fi
|
---|
353 | else
|
---|
354 | dnl Libraries needed by thrd.c, mtx.c, cnd.c, tss.c.
|
---|
355 | LIBSTDTHREAD="$LIBPMULTITHREAD $LIB_SCHED_YIELD"
|
---|
356 | fi
|
---|
357 | ;;
|
---|
358 | esac
|
---|
359 | AC_SUBST([LIBSTDTHREAD])
|
---|
360 |
|
---|
361 | AC_MSG_CHECKING([whether ISO C threads API is available])
|
---|
362 | AC_MSG_RESULT([$ac_cv_header_threads_h])
|
---|
363 | gl_stdthreadlib_body_done=done
|
---|
364 | fi
|
---|
365 | ])
|
---|
366 |
|
---|
367 | AC_DEFUN([gl_STDTHREADLIB],
|
---|
368 | [
|
---|
369 | AC_REQUIRE([gl_ANYTHREADLIB_EARLY])
|
---|
370 | gl_STDTHREADLIB_BODY
|
---|
371 | ])
|
---|
372 |
|
---|
373 | dnl ============================================================================
|
---|
374 | dnl Macros for the Gnulib API
|
---|
375 |
|
---|
376 | dnl gl_THREADLIB
|
---|
377 | dnl ------------
|
---|
378 | dnl Tests for a multithreading library to be used.
|
---|
379 | dnl If the configure.ac contains a definition of the gl_THREADLIB_DEFAULT_NO
|
---|
380 | dnl (it must be placed before the invocation of gl_THREADLIB_EARLY!), then the
|
---|
381 | dnl default is 'no', otherwise it is system dependent. In both cases, the user
|
---|
382 | dnl can change the choice through the options --enable-threads=choice or
|
---|
383 | dnl --disable-threads.
|
---|
384 | dnl Defines at most one of the macros USE_ISOC_THREADS, USE_POSIX_THREADS,
|
---|
385 | dnl USE_ISOC_AND_POSIX_THREADS, USE_WINDOWS_THREADS.
|
---|
386 | dnl The choice --enable-threads=isoc+posix is available only on platforms that
|
---|
387 | dnl have both the ISO C and the POSIX threads APIs. It has the effect of using
|
---|
388 | dnl the ISO C API for most things and the POSIX API only for creating and
|
---|
389 | dnl controlling threads (because there is no equivalent to pthread_atfork in
|
---|
390 | dnl the ISO C API).
|
---|
391 | dnl Sets the variables LIBTHREAD and LTLIBTHREAD to the linker options for use
|
---|
392 | dnl in a Makefile (LIBTHREAD for use without libtool, LTLIBTHREAD for use with
|
---|
393 | dnl libtool).
|
---|
394 | dnl Sets the variables LIBMULTITHREAD and LTLIBMULTITHREAD similarly, for
|
---|
395 | dnl programs that really need multithread functionality. The difference
|
---|
396 | dnl between LIBTHREAD and LIBMULTITHREAD is that on platforms supporting weak
|
---|
397 | dnl symbols, typically LIBTHREAD is empty whereas LIBMULTITHREAD is not.
|
---|
398 | dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
|
---|
399 | dnl multithread-safe programs.
|
---|
400 | dnl Since support for GNU pth was removed, $LTLIBTHREAD and $LIBTHREAD have the
|
---|
401 | dnl same value, and similarly $LTLIBMULTITHREAD and $LIBMULTITHREAD have the
|
---|
402 | dnl same value. Only system libraries are needed.
|
---|
403 |
|
---|
404 | AC_DEFUN([gl_THREADLIB_EARLY],
|
---|
405 | [
|
---|
406 | AC_REQUIRE([gl_THREADLIB_EARLY_BODY])
|
---|
407 | ])
|
---|
408 |
|
---|
409 | dnl The guts of gl_THREADLIB_EARLY. Needs to be expanded only once.
|
---|
410 |
|
---|
411 | AC_DEFUN([gl_THREADLIB_EARLY_BODY],
|
---|
412 | [
|
---|
413 | dnl Ordering constraints: This macro modifies CPPFLAGS in a way that
|
---|
414 | dnl influences the result of the autoconf tests that test for *_unlocked
|
---|
415 | dnl declarations, on AIX 5 at least. Therefore it must come early.
|
---|
416 | AC_BEFORE([$0], [gl_FUNC_GLIBC_UNLOCKED_IO])dnl
|
---|
417 | AC_BEFORE([$0], [gl_ARGP])dnl
|
---|
418 |
|
---|
419 | AC_REQUIRE([AC_CANONICAL_HOST])
|
---|
420 | dnl _GNU_SOURCE is needed for pthread_rwlock_t on glibc systems.
|
---|
421 | AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
|
---|
422 | dnl Check for multithreading.
|
---|
423 | m4_ifdef([gl_THREADLIB_DEFAULT_NO],
|
---|
424 | [m4_divert_text([DEFAULTS], [gl_use_threads_default=no])],
|
---|
425 | [m4_divert_text([DEFAULTS], [gl_use_threads_default=])])
|
---|
426 | m4_divert_text([DEFAULTS], [gl_use_winpthreads_default=])
|
---|
427 | AC_ARG_ENABLE([threads],
|
---|
428 | AS_HELP_STRING([--enable-threads={isoc|posix|isoc+posix|windows}], [specify multithreading API])m4_ifdef([gl_THREADLIB_DEFAULT_NO], [], [
|
---|
429 | AS_HELP_STRING([--disable-threads], [build without multithread safety])]),
|
---|
430 | [gl_use_threads=$enableval],
|
---|
431 | [if test -n "$gl_use_threads_default"; then
|
---|
432 | gl_use_threads="$gl_use_threads_default"
|
---|
433 | else
|
---|
434 | changequote(,)dnl
|
---|
435 | case "$host_os" in
|
---|
436 | dnl Disable multithreading by default on OSF/1, because it interferes
|
---|
437 | dnl with fork()/exec(): When msgexec is linked with -lpthread, its
|
---|
438 | dnl child process gets an endless segmentation fault inside execvp().
|
---|
439 | osf*) gl_use_threads=no ;;
|
---|
440 | dnl Disable multithreading by default on Cygwin 1.5.x, because it has
|
---|
441 | dnl bugs that lead to endless loops or crashes. See
|
---|
442 | dnl <https://cygwin.com/ml/cygwin/2009-08/msg00283.html>.
|
---|
443 | cygwin*)
|
---|
444 | case `uname -r` in
|
---|
445 | 1.[0-5].*) gl_use_threads=no ;;
|
---|
446 | *) gl_use_threads=yes ;;
|
---|
447 | esac
|
---|
448 | ;;
|
---|
449 | dnl Obey gl_AVOID_WINPTHREAD on mingw.
|
---|
450 | mingw*)
|
---|
451 | case "$gl_use_winpthreads_default" in
|
---|
452 | yes) gl_use_threads=posix ;;
|
---|
453 | no) gl_use_threads=windows ;;
|
---|
454 | *) gl_use_threads=yes ;;
|
---|
455 | esac
|
---|
456 | ;;
|
---|
457 | *) gl_use_threads=yes ;;
|
---|
458 | esac
|
---|
459 | changequote([,])dnl
|
---|
460 | fi
|
---|
461 | ])
|
---|
462 | if test "$gl_use_threads" = yes \
|
---|
463 | || test "$gl_use_threads" = isoc \
|
---|
464 | || test "$gl_use_threads" = posix \
|
---|
465 | || test "$gl_use_threads" = isoc+posix; then
|
---|
466 | # For using <threads.h> or <pthread.h>:
|
---|
467 | gl_ANYTHREADLIB_EARLY
|
---|
468 | fi
|
---|
469 | ])
|
---|
470 |
|
---|
471 | dnl The guts of gl_THREADLIB. Needs to be expanded only once.
|
---|
472 |
|
---|
473 | AC_DEFUN([gl_THREADLIB_BODY],
|
---|
474 | [
|
---|
475 | AC_REQUIRE([gl_THREADLIB_EARLY_BODY])
|
---|
476 | gl_threads_api=none
|
---|
477 | LIBTHREAD=
|
---|
478 | LTLIBTHREAD=
|
---|
479 | LIBMULTITHREAD=
|
---|
480 | LTLIBMULTITHREAD=
|
---|
481 | if test "$gl_use_threads" != no; then
|
---|
482 | dnl Check whether the compiler and linker support weak declarations.
|
---|
483 | gl_WEAK_SYMBOLS
|
---|
484 | if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
|
---|
485 | dnl If we use weak symbols to implement pthread_in_use / pth_in_use /
|
---|
486 | dnl thread_in_use, we also need to test whether the ISO C 11 thrd_create
|
---|
487 | dnl facility is in use.
|
---|
488 | AC_CHECK_HEADERS_ONCE([threads.h])
|
---|
489 | :
|
---|
490 | fi
|
---|
491 | if test "$gl_use_threads" = isoc || test "$gl_use_threads" = isoc+posix; then
|
---|
492 | AC_CHECK_HEADERS_ONCE([threads.h])
|
---|
493 | gl_have_isoc_threads="$ac_cv_header_threads_h"
|
---|
494 | fi
|
---|
495 | if test "$gl_use_threads" = yes \
|
---|
496 | || test "$gl_use_threads" = posix \
|
---|
497 | || test "$gl_use_threads" = isoc+posix; then
|
---|
498 | gl_PTHREADLIB_BODY
|
---|
499 | LIBTHREAD=$LIBPTHREAD LTLIBTHREAD=$LIBPTHREAD
|
---|
500 | LIBMULTITHREAD=$LIBPMULTITHREAD LTLIBMULTITHREAD=$LIBPMULTITHREAD
|
---|
501 | if test $gl_pthread_api = yes; then
|
---|
502 | if test "$gl_use_threads" = isoc+posix && test "$gl_have_isoc_threads" = yes; then
|
---|
503 | gl_threads_api='isoc+posix'
|
---|
504 | AC_DEFINE([USE_ISOC_AND_POSIX_THREADS], [1],
|
---|
505 | [Define if the combination of the ISO C and POSIX multithreading APIs can be used.])
|
---|
506 | LIBTHREAD= LTLIBTHREAD=
|
---|
507 | else
|
---|
508 | gl_threads_api=posix
|
---|
509 | AC_DEFINE([USE_POSIX_THREADS], [1],
|
---|
510 | [Define if the POSIX multithreading library can be used.])
|
---|
511 | if test -z "$LIBMULTITHREAD" && test -z "$LTLIBMULTITHREAD"; then
|
---|
512 | AC_DEFINE([USE_POSIX_THREADS_FROM_LIBC], [1],
|
---|
513 | [Define if references to the POSIX multithreading library are satisfied by libc.])
|
---|
514 | else
|
---|
515 | if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
|
---|
516 | AC_DEFINE([USE_POSIX_THREADS_WEAK], [1],
|
---|
517 | [Define if references to the POSIX multithreading library should be made weak.])
|
---|
518 | LIBTHREAD= LTLIBTHREAD=
|
---|
519 | else
|
---|
520 | case "$host_os" in
|
---|
521 | freebsd* | dragonfly* | midnightbsd*)
|
---|
522 | if test "x$LIBTHREAD" != "x$LIBMULTITHREAD"; then
|
---|
523 | dnl If weak symbols can't tell whether pthread_create(), pthread_key_create()
|
---|
524 | dnl etc. will succeed, we need a runtime test.
|
---|
525 | AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1],
|
---|
526 | [Define if the pthread_in_use() detection is hard.])
|
---|
527 | fi
|
---|
528 | ;;
|
---|
529 | esac
|
---|
530 | fi
|
---|
531 | fi
|
---|
532 | fi
|
---|
533 | fi
|
---|
534 | fi
|
---|
535 | if test $gl_threads_api = none; then
|
---|
536 | if test "$gl_use_threads" = isoc && test "$gl_have_isoc_threads" = yes; then
|
---|
537 | gl_STDTHREADLIB_BODY
|
---|
538 | LIBTHREAD=$LIBSTDTHREAD LTLIBTHREAD=$LIBSTDTHREAD
|
---|
539 | LIBMULTITHREAD=$LIBSTDTHREAD LTLIBMULTITHREAD=$LIBSTDTHREAD
|
---|
540 | gl_threads_api=isoc
|
---|
541 | AC_DEFINE([USE_ISOC_THREADS], [1],
|
---|
542 | [Define if the ISO C multithreading library can be used.])
|
---|
543 | fi
|
---|
544 | fi
|
---|
545 | if test $gl_threads_api = none; then
|
---|
546 | case "$gl_use_threads" in
|
---|
547 | yes | windows | win32) # The 'win32' is for backward compatibility.
|
---|
548 | if { case "$host_os" in
|
---|
549 | mingw*) true;;
|
---|
550 | *) false;;
|
---|
551 | esac
|
---|
552 | }; then
|
---|
553 | gl_threads_api=windows
|
---|
554 | AC_DEFINE([USE_WINDOWS_THREADS], [1],
|
---|
555 | [Define if the native Windows multithreading API can be used.])
|
---|
556 | fi
|
---|
557 | ;;
|
---|
558 | esac
|
---|
559 | fi
|
---|
560 | fi
|
---|
561 | AC_MSG_CHECKING([for multithread API to use])
|
---|
562 | AC_MSG_RESULT([$gl_threads_api])
|
---|
563 | AC_SUBST([LIBTHREAD])
|
---|
564 | AC_SUBST([LTLIBTHREAD])
|
---|
565 | AC_SUBST([LIBMULTITHREAD])
|
---|
566 | AC_SUBST([LTLIBMULTITHREAD])
|
---|
567 | ])
|
---|
568 |
|
---|
569 | AC_DEFUN([gl_THREADLIB],
|
---|
570 | [
|
---|
571 | AC_REQUIRE([gl_THREADLIB_EARLY])
|
---|
572 | AC_REQUIRE([gl_THREADLIB_BODY])
|
---|
573 | ])
|
---|
574 |
|
---|
575 |
|
---|
576 | dnl gl_DISABLE_THREADS
|
---|
577 | dnl ------------------
|
---|
578 | dnl Sets the gl_THREADLIB default so that threads are not used by default.
|
---|
579 | dnl The user can still override it at installation time, by using the
|
---|
580 | dnl configure option '--enable-threads'.
|
---|
581 |
|
---|
582 | AC_DEFUN([gl_DISABLE_THREADS], [
|
---|
583 | m4_divert_text([INIT_PREPARE], [gl_use_threads_default=no])
|
---|
584 | ])
|
---|
585 |
|
---|
586 |
|
---|
587 | dnl gl_AVOID_WINPTHREAD
|
---|
588 | dnl -------------------
|
---|
589 | dnl Sets the gl_THREADLIB default so that on mingw, a dependency to the
|
---|
590 | dnl libwinpthread DLL (mingw-w64 winpthreads library) is avoided.
|
---|
591 | dnl The user can still override it at installation time, by using the
|
---|
592 | dnl configure option '--enable-threads'.
|
---|
593 |
|
---|
594 | AC_DEFUN([gl_AVOID_WINPTHREAD], [
|
---|
595 | m4_divert_text([INIT_PREPARE], [gl_use_winpthreads_default=no])
|
---|
596 | ])
|
---|
597 |
|
---|
598 |
|
---|
599 | dnl ============================================================================
|
---|
600 |
|
---|
601 |
|
---|
602 | dnl Survey of platforms:
|
---|
603 | dnl
|
---|
604 | dnl Platform Available Compiler Supports test-lock
|
---|
605 | dnl flavours option weak result
|
---|
606 | dnl --------------- --------- --------- -------- ---------
|
---|
607 | dnl Linux 2.4/glibc posix -lpthread Y OK
|
---|
608 | dnl
|
---|
609 | dnl Linux/glibc 2.34 posix Y OK
|
---|
610 | dnl
|
---|
611 | dnl GNU Hurd/glibc posix -lpthread Y OK
|
---|
612 | dnl
|
---|
613 | dnl Ubuntu 14.04 posix -pthread Y OK
|
---|
614 | dnl
|
---|
615 | dnl FreeBSD 5.3 posix -lc_r Y
|
---|
616 | dnl posix -lkse ? Y
|
---|
617 | dnl posix -lpthread ? Y
|
---|
618 | dnl posix -lthr Y
|
---|
619 | dnl
|
---|
620 | dnl FreeBSD 5.2 posix -lc_r Y
|
---|
621 | dnl posix -lkse Y
|
---|
622 | dnl posix -lthr Y
|
---|
623 | dnl
|
---|
624 | dnl FreeBSD 4.0,4.10 posix -lc_r Y OK
|
---|
625 | dnl
|
---|
626 | dnl NetBSD 1.6 --
|
---|
627 | dnl
|
---|
628 | dnl OpenBSD 3.4 posix -lpthread Y OK
|
---|
629 | dnl
|
---|
630 | dnl Mac OS X 10.[123] posix -lpthread Y OK
|
---|
631 | dnl
|
---|
632 | dnl Solaris 7,8,9 posix -lpthread Y Sol 7,8: 0.0; Sol 9: OK
|
---|
633 | dnl
|
---|
634 | dnl HP-UX 11 posix -lpthread N (cc) OK
|
---|
635 | dnl Y (gcc)
|
---|
636 | dnl
|
---|
637 | dnl IRIX 6.5 posix -lpthread Y 0.5
|
---|
638 | dnl
|
---|
639 | dnl AIX 4.3,5.1 posix -lpthread N AIX 4: 0.5; AIX 5: OK
|
---|
640 | dnl
|
---|
641 | dnl OSF/1 4.0,5.1 posix -pthread (cc) N OK
|
---|
642 | dnl -lpthread (gcc) Y
|
---|
643 | dnl
|
---|
644 | dnl Cygwin posix -lpthread Y OK
|
---|
645 | dnl
|
---|
646 | dnl Mingw windows N OK
|
---|
647 | dnl
|
---|
648 | dnl BeOS 5 --
|
---|
649 | dnl
|
---|
650 | dnl The test-lock result shows what happens if in test-lock.c EXPLICIT_YIELD is
|
---|
651 | dnl turned off:
|
---|
652 | dnl OK if all three tests terminate OK,
|
---|
653 | dnl 0.5 if the first test terminates OK but the second one loops endlessly,
|
---|
654 | dnl 0.0 if the first test already loops endlessly.
|
---|