diff --git a/Misc/NEWS.d/next/Library/2021-09-22-23-56-15.bpo-21302.vvQ3Su.rst b/Misc/NEWS.d/next/Library/2021-09-22-23-56-15.bpo-21302.vvQ3Su.rst new file mode 100644 index 00000000000000..52ee8d7cc64f15 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-09-22-23-56-15.bpo-21302.vvQ3Su.rst @@ -0,0 +1 @@ +In Unix operating systems, :func:`time.sleep` now uses the ``nanosleep()`` function, if ``clock_nanosleep()`` is not available but ``nanosleep()`` is available. ``nanosleep()`` allows to sleep with nanosecond precision. \ No newline at end of file diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 53ec86eb3981ef..aaf96e3f938682 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -2057,6 +2057,8 @@ pysleep(_PyTime_t secs) #ifndef MS_WINDOWS #ifdef HAVE_CLOCK_NANOSLEEP struct timespec timeout_abs; +#elif defined(HAVE_NANOSLEEP) + struct timespec timeout; #else struct timeval timeout; #endif @@ -2074,7 +2076,11 @@ pysleep(_PyTime_t secs) #endif do { -#ifndef HAVE_CLOCK_NANOSLEEP +#if defined(HAVE_NANOSLEEP) && !defined(HAVE_CLOCK_NANOSLEEP) + if (_PyTime_AsTimespec(secs, &timeout) < 0) { + return -1; + } +#elif !defined(HAVE_CLOCK_NANOSLEEP) if (_PyTime_AsTimeval(secs, &timeout, _PyTime_ROUND_CEILING) < 0) { return -1; } @@ -2088,7 +2094,11 @@ pysleep(_PyTime_t secs) err = ret; #else Py_BEGIN_ALLOW_THREADS +#ifdef HAVE_NANOSLEEP + ret = nanosleep(&timeout, NULL); +#else ret = select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &timeout); +#endif Py_END_ALLOW_THREADS err = errno; #endif diff --git a/configure b/configure index 2e3c9ba7baddd4..4acf91f22107f4 100755 --- a/configure +++ b/configure @@ -13310,6 +13310,64 @@ fi done +for ac_func in nanosleep +do : + ac_fn_c_check_func "$LINENO" "nanosleep" "ac_cv_func_nanosleep" +if test "x$ac_cv_func_nanosleep" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NANOSLEEP 1 +_ACEOF + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nanosleep in -lrt" >&5 +$as_echo_n "checking for nanosleep in -lrt... " >&6; } +if ${ac_cv_lib_rt_nanosleep+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrt $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char nanosleep (); +int +main () +{ +return nanosleep (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_rt_nanosleep=yes +else + ac_cv_lib_rt_nanosleep=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_nanosleep" >&5 +$as_echo "$ac_cv_lib_rt_nanosleep" >&6; } +if test "x$ac_cv_lib_rt_nanosleep" = xyes; then : + + $as_echo "#define HAVE_NANOSLEEP 1" >>confdefs.h + + +fi + + +fi +done + + for ac_func in clock_getres do : ac_fn_c_check_func "$LINENO" "clock_getres" "ac_cv_func_clock_getres" diff --git a/configure.ac b/configure.ac index 4a0694c442f3f7..48d86ef79199e1 100644 --- a/configure.ac +++ b/configure.ac @@ -4121,6 +4121,12 @@ AC_CHECK_FUNCS(clock_nanosleep, [], [ ]) ]) +AC_CHECK_FUNCS(nanosleep, [], [ + AC_CHECK_LIB(rt, nanosleep, [ + AC_DEFINE(HAVE_NANOSLEEP, 1) + ]) +]) + AC_MSG_CHECKING(for major, minor, and makedev) AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #if defined(MAJOR_IN_MKDEV) diff --git a/pyconfig.h.in b/pyconfig.h.in index d6408e9415e2d0..23d7111b9f77e7 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -736,6 +736,9 @@ /* Define to 1 if you have the `mremap' function. */ #undef HAVE_MREMAP +/* Define to 1 if you have the `nanosleep' function. */ +#undef HAVE_NANOSLEEP + /* Define to 1 if you have the header file. */ #undef HAVE_NCURSES_H