summaryrefslogtreecommitdiff
path: root/m4/fp_check_pthreads.m4
blob: 5713e7c743ff1aef4ad22f504ef9d1d76271eacf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
dnl FP_CHECK_PTHREADS
dnl ----------------------------------
dnl Check various aspects of the platform's pthreads support
AC_DEFUN([FP_CHECK_PTHREADS],
[
  dnl Some platforms (e.g. Android's Bionic) have pthreads support available
  dnl without linking against libpthread. Check whether -lpthread is necessary
  dnl to use pthreads.
  dnl
  dnl Note that it is important that this happens before we AC_CHECK_LIB(thread)
  AC_MSG_CHECKING(whether -lpthread is needed for pthreads)
  AC_CHECK_FUNC(pthread_create,
      [
          AC_MSG_RESULT(no)
          AC_SUBST([UseLibpthread],[NO])
          need_lpthread=0
      ],
      [
          AC_CHECK_LIB(pthread, pthread_create,
              [
                  AC_MSG_RESULT(yes)
                  AC_SUBST([UseLibpthread],[YES])
                  need_lpthread=1
              ],
              [
                  AC_SUBST([UseLibpthread],[NO])
                  AC_MSG_RESULT([no pthreads support found.])
                  need_lpthread=0
              ])
      ])
  AC_DEFINE_UNQUOTED([NEED_PTHREAD_LIB], [$need_lpthread],
      [Define 1 if we need to link code using pthreads with -lpthread])

  dnl Setting thread names
  dnl ~~~~~~~~~~~~~~~~~~~~
  dnl The portability situation here is complicated:
  dnl
  dnl * FreeBSD supports pthread_set_name_np in <pthread_np.h>
  dnl   and (if not _POSIX_SOURCE) pthread_setname_np() in <pthread.h>
  dnl   because of the conditional visibility, we prefer the former.
  dnl * glibc supports pthread_setname_np
  dnl * Darwin supports pthread_setname_np but does not take a
  dnl   pthread_t argument.
  dnl
  AC_CHECK_HEADERS([pthread_np.h])

  dnl ** pthread_setname_np is a recent addition to glibc, and OS X has
  dnl    a different single-argument version.
  AC_CHECK_LIB(pthread, pthread_setname_np)

  AC_MSG_CHECKING([for pthread_setname_np (Darwin)])
  AC_LINK_IFELSE([
    AC_LANG_PROGRAM(
      [[
      #include <pthread.h>
      ]],
      [[pthread_setname_np("name");]]
    )],
    [
      AC_MSG_RESULT(yes)
      AC_DEFINE([HAVE_PTHREAD_SETNAME_NP_DARWIN], [1],
        [Define to 1 if you have the Darwin version of pthread_setname_np])
    ],
    AC_MSG_RESULT(no)
  )

  dnl glibc
  AC_MSG_CHECKING([for pthread_setname_np (glibc)])
  AC_LINK_IFELSE([
    AC_LANG_PROGRAM(
      [[
      #define _GNU_SOURCE
      #include <pthread.h>
      ]],
      [[pthread_setname_np(pthread_self(), "name");]]
    )],
    [
      AC_MSG_RESULT(yes)
      AC_DEFINE([HAVE_PTHREAD_SETNAME_NP], [1],
        [Define to 1 if you have the glibc version of pthread_setname_np])
    ],
    AC_MSG_RESULT(no)
  )

  dnl NetBSD
  AC_MSG_CHECKING([for pthread_setname_np (NetBSD)])
  AC_LINK_IFELSE([
    AC_LANG_PROGRAM(
      [[
      #include <pthread.h>
      ]],
      [[pthread_setname_np(pthread_self(), "%s", "name");]]
    )],
    [
      AC_MSG_RESULT([yes])
      AC_DEFINE([HAVE_PTHREAD_SETNAME_NP_NETBSD], [1],
        [Define to 1 if you have the NetBSD version of pthread_setname_np])
    ],
    AC_MSG_RESULT([no])
  )

  dnl FreeBSD
  AC_MSG_CHECKING([for pthread_set_name_np])
  AC_LINK_IFELSE([
    AC_LANG_PROGRAM(
      [[
      #include <pthread_np.h>
      ]],
      [[pthread_set_name_np(pthread_self(), "name");]]
    )],
    [
      AC_MSG_RESULT(yes)
      AC_DEFINE([HAVE_PTHREAD_SET_NAME_NP], [1],
        [Define to 1 if you have pthread_set_name_np])
    ],
    AC_MSG_RESULT(no)
  )

  AC_CHECK_FUNCS_ONCE([pthread_condattr_setclock])
])