lock.m4 12 KB

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