libstdc++: Fix build failure for target with no way to sleep
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.
This commit is contained in:
parent
84d08255f9
commit
0aa1786d34
5 changed files with 27 additions and 2 deletions
|
@ -1626,16 +1626,22 @@ AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_TIME], [
|
|||
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"
|
||||
|
|
|
@ -767,6 +767,9 @@
|
|||
*/
|
||||
#undef LT_OBJDIR
|
||||
|
||||
/* Defined if no way to sleep is available. */
|
||||
#undef NO_SLEEP
|
||||
|
||||
/* Name of package */
|
||||
#undef PACKAGE
|
||||
|
||||
|
|
8
libstdc++-v3/configure
vendored
8
libstdc++-v3/configure
vendored
|
@ -21751,6 +21751,7 @@ $as_echo "$ac_has_usleep" >&6; }
|
|||
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
|
||||
|
@ -21774,11 +21775,18 @@ rm -f core conftest.err conftest.$ac_objext 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"
|
||||
|
|
|
@ -122,8 +122,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
*/
|
||||
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>
|
||||
|
@ -168,7 +172,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
__now = _Clock::now();
|
||||
}
|
||||
}
|
||||
}
|
||||
} // namespace this_thread
|
||||
#endif // ! NO_SLEEP
|
||||
|
||||
#ifdef __cpp_lib_jthread
|
||||
|
||||
|
|
|
@ -35,7 +35,8 @@
|
|||
# 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
|
||||
|
@ -196,6 +197,7 @@ _GLIBCXX_END_NAMESPACE_VERSION
|
|||
|
||||
#endif // _GLIBCXX_HAS_GTHREADS
|
||||
|
||||
#ifndef _GLIBCXX_NO_SLEEP
|
||||
namespace std _GLIBCXX_VISIBILITY(default)
|
||||
{
|
||||
_GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
|
@ -252,3 +254,4 @@ namespace this_thread
|
|||
}
|
||||
_GLIBCXX_END_NAMESPACE_VERSION
|
||||
} // namespace std
|
||||
#endif // ! NO_SLEEP
|
||||
|
|
Loading…
Add table
Reference in a new issue