lock.m4
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:12k
源码类别:

midi

开发平台:

Unix_Linux

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