| 1 | # serial 40
|
|---|
| 2 |
|
|---|
| 3 | dnl From Jim Meyering.
|
|---|
| 4 | dnl Check for the nanosleep function.
|
|---|
| 5 | dnl If not found, use the supplied replacement.
|
|---|
| 6 | dnl
|
|---|
| 7 |
|
|---|
| 8 | # Copyright (C) 1999-2001, 2003-2021 Free Software Foundation, Inc.
|
|---|
| 9 |
|
|---|
| 10 | # This file is free software; the Free Software Foundation
|
|---|
| 11 | # gives unlimited permission to copy and/or distribute it,
|
|---|
| 12 | # with or without modifications, as long as this notice is preserved.
|
|---|
| 13 |
|
|---|
| 14 | AC_DEFUN([gl_FUNC_NANOSLEEP],
|
|---|
| 15 | [
|
|---|
| 16 | AC_REQUIRE([gl_TIME_H_DEFAULTS])
|
|---|
| 17 | AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
|
|---|
| 18 |
|
|---|
| 19 | dnl Persuade glibc and Solaris <time.h> to declare nanosleep.
|
|---|
| 20 | AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
|
|---|
| 21 |
|
|---|
| 22 | AC_CHECK_HEADERS_ONCE([sys/time.h])
|
|---|
| 23 | AC_REQUIRE([gl_FUNC_SELECT])
|
|---|
| 24 |
|
|---|
| 25 | AC_CHECK_DECLS_ONCE([alarm])
|
|---|
| 26 |
|
|---|
| 27 | nanosleep_save_libs=$LIBS
|
|---|
| 28 |
|
|---|
| 29 | # Solaris 2.5.1 needs -lposix4 to get the nanosleep function.
|
|---|
| 30 | # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4.
|
|---|
| 31 | LIB_NANOSLEEP=
|
|---|
| 32 | AC_SUBST([LIB_NANOSLEEP])
|
|---|
| 33 | AC_SEARCH_LIBS([nanosleep], [rt posix4],
|
|---|
| 34 | [test "$ac_cv_search_nanosleep" = "none required" ||
|
|---|
| 35 | LIB_NANOSLEEP=$ac_cv_search_nanosleep])
|
|---|
| 36 | if test "x$ac_cv_search_nanosleep" != xno; then
|
|---|
| 37 | dnl The system has a nanosleep function.
|
|---|
| 38 |
|
|---|
| 39 | AC_REQUIRE([gl_MULTIARCH])
|
|---|
| 40 | if test $APPLE_UNIVERSAL_BUILD = 1; then
|
|---|
| 41 | # A universal build on Apple Mac OS X platforms.
|
|---|
| 42 | # The test result would be 'no (mishandles large arguments)' in 64-bit
|
|---|
| 43 | # mode but 'yes' in 32-bit mode. But we need a configuration result that
|
|---|
| 44 | # is valid in both modes.
|
|---|
| 45 | gl_cv_func_nanosleep='no (mishandles large arguments)'
|
|---|
| 46 | fi
|
|---|
| 47 |
|
|---|
| 48 | AC_CACHE_CHECK([for working nanosleep],
|
|---|
| 49 | [gl_cv_func_nanosleep],
|
|---|
| 50 | [
|
|---|
| 51 | AC_RUN_IFELSE(
|
|---|
| 52 | [AC_LANG_SOURCE([[
|
|---|
| 53 | #include <errno.h>
|
|---|
| 54 | #include <limits.h>
|
|---|
| 55 | #include <signal.h>
|
|---|
| 56 | #if HAVE_SYS_TIME_H
|
|---|
| 57 | #include <sys/time.h>
|
|---|
| 58 | #endif
|
|---|
| 59 | #include <time.h>
|
|---|
| 60 | #include <unistd.h>
|
|---|
| 61 | #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
|
|---|
| 62 | #define TYPE_MAXIMUM(t) \
|
|---|
| 63 | ((t) (! TYPE_SIGNED (t) \
|
|---|
| 64 | ? (t) -1 \
|
|---|
| 65 | : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
|
|---|
| 66 |
|
|---|
| 67 | #if HAVE_DECL_ALARM
|
|---|
| 68 | static void
|
|---|
| 69 | check_for_SIGALRM (int sig)
|
|---|
| 70 | {
|
|---|
| 71 | if (sig != SIGALRM)
|
|---|
| 72 | _exit (1);
|
|---|
| 73 | }
|
|---|
| 74 | #endif
|
|---|
| 75 |
|
|---|
| 76 | int
|
|---|
| 77 | main ()
|
|---|
| 78 | {
|
|---|
| 79 | static struct timespec ts_sleep;
|
|---|
| 80 | static struct timespec ts_remaining;
|
|---|
| 81 | /* Test for major problems first. */
|
|---|
| 82 | if (! nanosleep)
|
|---|
| 83 | return 2;
|
|---|
| 84 | ts_sleep.tv_sec = 0;
|
|---|
| 85 | ts_sleep.tv_nsec = 1;
|
|---|
| 86 | #if HAVE_DECL_ALARM
|
|---|
| 87 | {
|
|---|
| 88 | static struct sigaction act;
|
|---|
| 89 | act.sa_handler = check_for_SIGALRM;
|
|---|
| 90 | sigemptyset (&act.sa_mask);
|
|---|
| 91 | sigaction (SIGALRM, &act, NULL);
|
|---|
| 92 | alarm (1);
|
|---|
| 93 | if (nanosleep (&ts_sleep, NULL) != 0)
|
|---|
| 94 | return 3;
|
|---|
| 95 | /* Test for a minor problem: the handling of large arguments. */
|
|---|
| 96 | ts_sleep.tv_sec = TYPE_MAXIMUM (time_t);
|
|---|
| 97 | ts_sleep.tv_nsec = 999999999;
|
|---|
| 98 | alarm (1);
|
|---|
| 99 | if (nanosleep (&ts_sleep, &ts_remaining) != -1)
|
|---|
| 100 | return 4;
|
|---|
| 101 | if (errno != EINTR)
|
|---|
| 102 | return 5;
|
|---|
| 103 | if (ts_remaining.tv_sec <= TYPE_MAXIMUM (time_t) - 10)
|
|---|
| 104 | return 6;
|
|---|
| 105 | }
|
|---|
| 106 | #else /* A simpler test for native Windows. */
|
|---|
| 107 | if (nanosleep (&ts_sleep, &ts_remaining) < 0)
|
|---|
| 108 | return 3;
|
|---|
| 109 | #endif
|
|---|
| 110 | return 0;
|
|---|
| 111 | }]])],
|
|---|
| 112 | [gl_cv_func_nanosleep=yes],
|
|---|
| 113 | [case $? in dnl (
|
|---|
| 114 | 4|5|6) gl_cv_func_nanosleep='no (mishandles large arguments)';; dnl (
|
|---|
| 115 | *) gl_cv_func_nanosleep=no;;
|
|---|
| 116 | esac],
|
|---|
| 117 | [case "$host_os" in dnl ((
|
|---|
| 118 | linux*) # Guess it halfway works when the kernel is Linux.
|
|---|
| 119 | gl_cv_func_nanosleep='guessing no (mishandles large arguments)' ;;
|
|---|
| 120 | mingw*) # Guess no on native Windows.
|
|---|
| 121 | gl_cv_func_nanosleep='guessing no' ;;
|
|---|
| 122 | *) # If we don't know, obey --enable-cross-guesses.
|
|---|
| 123 | gl_cv_func_nanosleep="$gl_cross_guess_normal" ;;
|
|---|
| 124 | esac
|
|---|
| 125 | ])
|
|---|
| 126 | ])
|
|---|
| 127 | case "$gl_cv_func_nanosleep" in
|
|---|
| 128 | *yes)
|
|---|
| 129 | REPLACE_NANOSLEEP=0
|
|---|
| 130 | ;;
|
|---|
| 131 | *)
|
|---|
| 132 | REPLACE_NANOSLEEP=1
|
|---|
| 133 | case "$gl_cv_func_nanosleep" in
|
|---|
| 134 | *"mishandles large arguments"*)
|
|---|
| 135 | AC_DEFINE([HAVE_BUG_BIG_NANOSLEEP], [1],
|
|---|
| 136 | [Define to 1 if nanosleep mishandles large arguments.])
|
|---|
| 137 | ;;
|
|---|
| 138 | *)
|
|---|
| 139 | # The replacement uses select(). Add $LIBSOCKET to $LIB_NANOSLEEP.
|
|---|
| 140 | for ac_lib in $LIBSOCKET; do
|
|---|
| 141 | case " $LIB_NANOSLEEP " in
|
|---|
| 142 | *" $ac_lib "*) ;;
|
|---|
| 143 | *) LIB_NANOSLEEP="$LIB_NANOSLEEP $ac_lib";;
|
|---|
| 144 | esac
|
|---|
| 145 | done
|
|---|
| 146 | ;;
|
|---|
| 147 | esac
|
|---|
| 148 | ;;
|
|---|
| 149 | esac
|
|---|
| 150 | else
|
|---|
| 151 | HAVE_NANOSLEEP=0
|
|---|
| 152 | fi
|
|---|
| 153 | LIBS=$nanosleep_save_libs
|
|---|
| 154 | ])
|
|---|
| 155 |
|
|---|
| 156 | # Prerequisites of lib/nanosleep.c.
|
|---|
| 157 | AC_DEFUN([gl_PREREQ_NANOSLEEP],
|
|---|
| 158 | [
|
|---|
| 159 | AC_CHECK_HEADERS_ONCE([sys/select.h])
|
|---|
| 160 | gl_PREREQ_SIG_HANDLER_H
|
|---|
| 161 | ])
|
|---|