~ubuntu-branches/ubuntu/wily/gmerlin-encoders/wily-proposed

« back to all changes in this revision

Viewing changes to m4/lock.m4

  • Committer: Bazaar Package Importer
  • Author(s): IOhannes m zmoelnig (gpg-key at iem)
  • Date: 2011-01-15 20:19:05 UTC
  • Revision ID: james.westby@ubuntu.com-20110115201905-qign5pihv1b977ct
Tags: upstream-1.0.0
ImportĀ upstreamĀ versionĀ 1.0.0

Show diffs side-by-side

added added

removed removed

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