|
Packit Service |
991b93 |
# serial 39
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
dnl From Jim Meyering.
|
|
Packit |
aea12f |
dnl Check for the nanosleep function.
|
|
Packit |
aea12f |
dnl If not found, use the supplied replacement.
|
|
Packit |
aea12f |
dnl
|
|
Packit |
aea12f |
|
|
Packit Service |
991b93 |
# Copyright (C) 1999-2001, 2003-2020 Free Software Foundation, Inc.
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
# This file is free software; the Free Software Foundation
|
|
Packit |
aea12f |
# gives unlimited permission to copy and/or distribute it,
|
|
Packit |
aea12f |
# with or without modifications, as long as this notice is preserved.
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
AC_DEFUN([gl_FUNC_NANOSLEEP],
|
|
Packit |
aea12f |
[
|
|
Packit |
aea12f |
AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
|
|
Packit |
aea12f |
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
dnl Persuade glibc and Solaris <time.h> to declare nanosleep.
|
|
Packit |
aea12f |
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
AC_CHECK_HEADERS_ONCE([sys/time.h])
|
|
Packit |
aea12f |
AC_REQUIRE([gl_FUNC_SELECT])
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
AC_CHECK_DECLS_ONCE([alarm])
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
nanosleep_save_libs=$LIBS
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
# Solaris 2.5.1 needs -lposix4 to get the nanosleep function.
|
|
Packit |
aea12f |
# Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4.
|
|
Packit |
aea12f |
LIB_NANOSLEEP=
|
|
Packit |
aea12f |
AC_SUBST([LIB_NANOSLEEP])
|
|
Packit |
aea12f |
AC_SEARCH_LIBS([nanosleep], [rt posix4],
|
|
Packit |
aea12f |
[test "$ac_cv_search_nanosleep" = "none required" ||
|
|
Packit |
aea12f |
LIB_NANOSLEEP=$ac_cv_search_nanosleep])
|
|
Packit |
aea12f |
if test "x$ac_cv_search_nanosleep" != xno; then
|
|
Packit |
aea12f |
dnl The system has a nanosleep function.
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
AC_REQUIRE([gl_MULTIARCH])
|
|
Packit |
aea12f |
if test $APPLE_UNIVERSAL_BUILD = 1; then
|
|
Packit |
aea12f |
# A universal build on Apple Mac OS X platforms.
|
|
Packit |
aea12f |
# The test result would be 'no (mishandles large arguments)' in 64-bit
|
|
Packit |
aea12f |
# mode but 'yes' in 32-bit mode. But we need a configuration result that
|
|
Packit |
aea12f |
# is valid in both modes.
|
|
Packit |
aea12f |
gl_cv_func_nanosleep='no (mishandles large arguments)'
|
|
Packit |
aea12f |
fi
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
AC_CACHE_CHECK([for working nanosleep],
|
|
Packit |
aea12f |
[gl_cv_func_nanosleep],
|
|
Packit |
aea12f |
[
|
|
Packit |
aea12f |
AC_RUN_IFELSE(
|
|
Packit |
aea12f |
[AC_LANG_SOURCE([[
|
|
Packit |
aea12f |
#include <errno.h>
|
|
Packit |
aea12f |
#include <limits.h>
|
|
Packit |
aea12f |
#include <signal.h>
|
|
Packit |
aea12f |
#if HAVE_SYS_TIME_H
|
|
Packit |
aea12f |
#include <sys/time.h>
|
|
Packit |
aea12f |
#endif
|
|
Packit |
aea12f |
#include <time.h>
|
|
Packit |
aea12f |
#include <unistd.h>
|
|
Packit |
aea12f |
#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
|
|
Packit |
aea12f |
#define TYPE_MAXIMUM(t) \
|
|
Packit |
aea12f |
((t) (! TYPE_SIGNED (t) \
|
|
Packit |
aea12f |
? (t) -1 \
|
|
Packit |
aea12f |
: ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
#if HAVE_DECL_ALARM
|
|
Packit |
aea12f |
static void
|
|
Packit |
aea12f |
check_for_SIGALRM (int sig)
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
if (sig != SIGALRM)
|
|
Packit |
aea12f |
_exit (1);
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
#endif
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
int
|
|
Packit |
aea12f |
main ()
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
static struct timespec ts_sleep;
|
|
Packit |
aea12f |
static struct timespec ts_remaining;
|
|
Packit |
aea12f |
/* Test for major problems first. */
|
|
Packit |
aea12f |
if (! nanosleep)
|
|
Packit |
aea12f |
return 2;
|
|
Packit |
aea12f |
ts_sleep.tv_sec = 0;
|
|
Packit |
aea12f |
ts_sleep.tv_nsec = 1;
|
|
Packit |
aea12f |
#if HAVE_DECL_ALARM
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
static struct sigaction act;
|
|
Packit |
aea12f |
act.sa_handler = check_for_SIGALRM;
|
|
Packit |
aea12f |
sigemptyset (&act.sa_mask);
|
|
Packit |
aea12f |
sigaction (SIGALRM, &act, NULL);
|
|
Packit |
aea12f |
alarm (1);
|
|
Packit |
aea12f |
if (nanosleep (&ts_sleep, NULL) != 0)
|
|
Packit |
aea12f |
return 3;
|
|
Packit |
aea12f |
/* Test for a minor problem: the handling of large arguments. */
|
|
Packit |
aea12f |
ts_sleep.tv_sec = TYPE_MAXIMUM (time_t);
|
|
Packit |
aea12f |
ts_sleep.tv_nsec = 999999999;
|
|
Packit |
aea12f |
alarm (1);
|
|
Packit |
aea12f |
if (nanosleep (&ts_sleep, &ts_remaining) != -1)
|
|
Packit |
aea12f |
return 4;
|
|
Packit |
aea12f |
if (errno != EINTR)
|
|
Packit |
aea12f |
return 5;
|
|
Packit |
aea12f |
if (ts_remaining.tv_sec <= TYPE_MAXIMUM (time_t) - 10)
|
|
Packit |
aea12f |
return 6;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
#else /* A simpler test for native Windows. */
|
|
Packit |
aea12f |
if (nanosleep (&ts_sleep, &ts_remaining) < 0)
|
|
Packit |
aea12f |
return 3;
|
|
Packit |
aea12f |
#endif
|
|
Packit |
aea12f |
return 0;
|
|
Packit |
aea12f |
}]])],
|
|
Packit |
aea12f |
[gl_cv_func_nanosleep=yes],
|
|
Packit |
aea12f |
[case $? in dnl (
|
|
Packit |
aea12f |
4|5|6) gl_cv_func_nanosleep='no (mishandles large arguments)';; dnl (
|
|
Packit |
aea12f |
*) gl_cv_func_nanosleep=no;;
|
|
Packit |
aea12f |
esac],
|
|
Packit |
aea12f |
[case "$host_os" in dnl ((
|
|
Packit |
aea12f |
linux*) # Guess it halfway works when the kernel is Linux.
|
|
Packit |
aea12f |
gl_cv_func_nanosleep='guessing no (mishandles large arguments)' ;;
|
|
Packit |
aea12f |
mingw*) # Guess no on native Windows.
|
|
Packit |
aea12f |
gl_cv_func_nanosleep='guessing no' ;;
|
|
Packit Service |
991b93 |
*) # If we don't know, obey --enable-cross-guesses.
|
|
Packit Service |
991b93 |
gl_cv_func_nanosleep="$gl_cross_guess_normal" ;;
|
|
Packit |
aea12f |
esac
|
|
Packit |
aea12f |
])
|
|
Packit |
aea12f |
])
|
|
Packit |
aea12f |
case "$gl_cv_func_nanosleep" in
|
|
Packit |
aea12f |
*yes)
|
|
Packit |
aea12f |
REPLACE_NANOSLEEP=0
|
|
Packit |
aea12f |
;;
|
|
Packit |
aea12f |
*)
|
|
Packit |
aea12f |
REPLACE_NANOSLEEP=1
|
|
Packit |
aea12f |
case "$gl_cv_func_nanosleep" in
|
|
Packit |
aea12f |
*"mishandles large arguments"*)
|
|
Packit |
aea12f |
AC_DEFINE([HAVE_BUG_BIG_NANOSLEEP], [1],
|
|
Packit |
aea12f |
[Define to 1 if nanosleep mishandles large arguments.])
|
|
Packit |
aea12f |
;;
|
|
Packit |
aea12f |
*)
|
|
Packit |
aea12f |
# The replacement uses select(). Add $LIBSOCKET to $LIB_NANOSLEEP.
|
|
Packit |
aea12f |
for ac_lib in $LIBSOCKET; do
|
|
Packit |
aea12f |
case " $LIB_NANOSLEEP " in
|
|
Packit |
aea12f |
*" $ac_lib "*) ;;
|
|
Packit |
aea12f |
*) LIB_NANOSLEEP="$LIB_NANOSLEEP $ac_lib";;
|
|
Packit |
aea12f |
esac
|
|
Packit |
aea12f |
done
|
|
Packit |
aea12f |
;;
|
|
Packit |
aea12f |
esac
|
|
Packit |
aea12f |
;;
|
|
Packit |
aea12f |
esac
|
|
Packit |
aea12f |
else
|
|
Packit |
aea12f |
HAVE_NANOSLEEP=0
|
|
Packit |
aea12f |
fi
|
|
Packit |
aea12f |
LIBS=$nanosleep_save_libs
|
|
Packit |
aea12f |
])
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
# Prerequisites of lib/nanosleep.c.
|
|
Packit |
aea12f |
AC_DEFUN([gl_PREREQ_NANOSLEEP],
|
|
Packit |
aea12f |
[
|
|
Packit |
aea12f |
AC_CHECK_HEADERS_ONCE([sys/select.h])
|
|
Packit |
aea12f |
gl_PREREQ_SIG_HANDLER_H
|
|
Packit |
aea12f |
])
|