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