In previous releases the std::this_thread::sleep_for function was only
declared if the target supports multiple threads. I changed that
recently in
r11-2649-g5bbb1f3000c57fd4d95969b30fa0e35be6d54ffb so that
sleep_for could be used single-threaded. But that means that targets
using --disable-threads are now required to provide some way to sleep.
This breaks the build for (at least) AVR when trying to build a hosted
library.
This patch adds a new autoconf macro that is defined when no way to
sleep is available, and uses that to suppress the sleeping functions in
std::this_thread.
The #error in src/c++11/thread.cc is retained for the case where there
is no sleep function available but multiple threads are supported. This
is consistent with previous releases, but that #error could probably be
removed without any consequences.
libstdc++-v3/ChangeLog:
* acinclude.m4 (GLIBCXX_ENABLE_LIBSTDCXX_TIME): Define NO_SLEEP
if none of nanosleep, sleep and Sleep is available.
* config.h.in: Regenerate.
* configure: Regenerate.
* include/std/thread [_GLIBCXX_NO_SLEEP] (__sleep_for): Do
not declare.
[_GLIBCXX_NO_SLEEP] (sleep_for, sleep_until): Do not
define.
* src/c++11/thread.cc [_GLIBCXX_NO_SLEEP] (__sleep_for): Do
not define.
fi
if test x"$ac_has_nanosleep$ac_has_sleep" = x"nono"; then
+ ac_no_sleep=yes
AC_MSG_CHECKING([for Sleep])
AC_TRY_COMPILE([#include <windows.h>],
[Sleep(1)],
[ac_has_win32_sleep=yes],[ac_has_win32_sleep=no])
if test x"$ac_has_win32_sleep" = x"yes"; then
AC_DEFINE(HAVE_WIN32_SLEEP,1, [Defined if Sleep exists.])
+ ac_no_sleep=no
fi
AC_MSG_RESULT($ac_has_win32_sleep)
fi
+ if test x"$ac_no_sleep" = x"yes"; then
+ AC_DEFINE(NO_SLEEP,1, [Defined if no way to sleep is available.])
+ fi
+
AC_SUBST(GLIBCXX_LIBS)
CXXFLAGS="$ac_save_CXXFLAGS"
*/
#undef LT_OBJDIR
+/* Defined if no way to sleep is available. */
+#undef NO_SLEEP
+
/* Name of package */
#undef PACKAGE
fi
if test x"$ac_has_nanosleep$ac_has_sleep" = x"nono"; then
+ ac_no_sleep=yes
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Sleep" >&5
$as_echo_n "checking for Sleep... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
$as_echo "#define HAVE_WIN32_SLEEP 1" >>confdefs.h
+ ac_no_sleep=no
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_has_win32_sleep" >&5
$as_echo "$ac_has_win32_sleep" >&6; }
fi
+ if test x"$ac_no_sleep" = x"yes"; then
+
+$as_echo "#define NO_SLEEP 1" >>confdefs.h
+
+ fi
+
CXXFLAGS="$ac_save_CXXFLAGS"
*/
namespace this_thread
{
+#ifndef _GLIBCXX_NO_SLEEP
+
+#ifndef _GLIBCXX_USE_NANOSLEEP
void
__sleep_for(chrono::seconds, chrono::nanoseconds);
+#endif
/// this_thread::sleep_for
template<typename _Rep, typename _Period>
__now = _Clock::now();
}
}
- }
+ } // namespace this_thread
+#endif // ! NO_SLEEP
#ifdef __cpp_lib_jthread
# include <unistd.h>
# elif defined(_GLIBCXX_HAVE_WIN32_SLEEP)
# include <windows.h>
-# else
+# elif defined _GLIBCXX_NO_SLEEP && defined _GLIBCXX_HAS_GTHREADS
+// We expect to be able to sleep for targets that support multiple threads:
# error "No sleep function known for this target"
# endif
#endif
#endif // _GLIBCXX_HAS_GTHREADS
+#ifndef _GLIBCXX_NO_SLEEP
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
}
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std
+#endif // ! NO_SLEEP