aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libstdc++-v3/ChangeLog22
-rw-r--r--libstdc++-v3/acinclude.m420
-rw-r--r--libstdc++-v3/config.h.in6
-rw-r--r--libstdc++-v3/config/abi/pre/gnu.ver3
-rwxr-xr-xlibstdc++-v3/configure56
-rw-r--r--libstdc++-v3/include/std/thread24
-rw-r--r--libstdc++-v3/src/c++11/thread.cc48
-rw-r--r--libstdc++-v3/testsuite/30_threads/async/54297.cc2
-rw-r--r--libstdc++-v3/testsuite/30_threads/condition_variable_any/53830.cc2
-rw-r--r--libstdc++-v3/testsuite/30_threads/this_thread/2.cc3
-rw-r--r--libstdc++-v3/testsuite/30_threads/this_thread/3.cc4
-rw-r--r--libstdc++-v3/testsuite/30_threads/this_thread/4.cc4
-rw-r--r--libstdc++-v3/testsuite/lib/dg-options.exp4
-rw-r--r--libstdc++-v3/testsuite/lib/libstdc++.exp44
14 files changed, 196 insertions, 46 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index f0a34f81589..19480af04c0 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,25 @@
+2012-11-23 Jonathan Wakely <jwakely.gcc@gmail.com>
+
+ PR libstdc++/52680
+ * acinclude.m4 (GLIBCXX_ENABLE_LIBSTDCXX_TIME): Check for usleep and
+ sleep if nanosleep is not available. Bump libtool revision.
+ * config.h.in: Regenerate.
+ * configure: Likewise.
+ * config/abi/pre/gnu.ver (GLIBCXX_3.4.18): Add __sleep_for.
+ * include/std/thread (this_thread::__sleep_for): Add.
+ (this_thread::yield, this_thread::sleep_until, this_thread::sleep_for):
+ Declare unconditionally.
+ * src/c++11/thread.cc (this_thread::__sleep_for): Define.
+ * testsuite/lib/libstdc++.exp (check_v3_target_nanosleep): Rename to
+ check_v3_target_sleep.
+ * testsuite/lib/dg-options.exp (dg-require-nanosleep): Rename to
+ dg-require-sleep.
+ * testsuite/30_threads/condition_variable_any/53830.cc: Update.
+ * testsuite/30_threads/this_thread/2.cc: Likewise.
+ * testsuite/30_threads/this_thread/3.cc: Likewise.
+ * testsuite/30_threads/this_thread/4.cc: Likewise.
+ * testsuite/30_threads/async/54297.cc: Likewise.
+
2012-11-20 Paolo Carlini <paolo.carlini@oracle.com>
PR libstdc++/55413
diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index 8c6f170a978..281ee7ec1ba 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -1281,6 +1281,24 @@ AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_TIME], [
if test x"$ac_has_nanosleep" = x"yes"; then
AC_DEFINE(_GLIBCXX_USE_NANOSLEEP, 1,
[ Defined if nanosleep is available. ])
+ else
+ AC_MSG_CHECKING([for sleep])
+ AC_TRY_COMPILE([#include <unistd.h>],
+ [sleep(1)],
+ [ac_has_sleep=yes],[ac_has_sleep=no])
+ if test x"$ac_has_sleep" = x"yes"; then
+ AC_DEFINE(HAVE_SLEEP,1, [Defined if sleep exists.])
+ fi
+ AC_MSG_RESULT($ac_has_sleep)
+ AC_MSG_CHECKING([for usleep])
+ AC_TRY_COMPILE([#include <unistd.h>],
+ [sleep(1);
+ usleep(100);],
+ [ac_has_usleep=yes],[ac_has_usleep=no])
+ if test x"$ac_has_usleep" = x"yes"; then
+ AC_DEFINE(HAVE_USLEEP,1, [Defined if usleep exists.])
+ fi
+ AC_MSG_RESULT($ac_has_usleep)
fi
AC_SUBST(GLIBCXX_LIBS)
@@ -3201,7 +3219,7 @@ changequote([,])dnl
fi
# For libtool versioning info, format is CURRENT:REVISION:AGE
-libtool_VERSION=6:17:0
+libtool_VERSION=6:18:0
# Everything parsed; figure out what files and settings to use.
case $enable_symvers in
diff --git a/libstdc++-v3/config.h.in b/libstdc++-v3/config.h.in
index 0667bbf7df8..fcb2bb31971 100644
--- a/libstdc++-v3/config.h.in
+++ b/libstdc++-v3/config.h.in
@@ -327,6 +327,9 @@
/* Define to 1 if you have the `sinl' function. */
#undef HAVE_SINL
+/* Defined if sleep exists. */
+#undef HAVE_SLEEP
+
/* Define to 1 if you have the `sqrtf' function. */
#undef HAVE_SQRTF
@@ -436,6 +439,9 @@
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
+/* Defined if usleep exists. */
+#undef HAVE_USLEEP
+
/* Defined if vfwscanf exists. */
#undef HAVE_VFWSCANF
diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver
index 949ab50e5e3..8b1ec0da917 100644
--- a/libstdc++-v3/config/abi/pre/gnu.ver
+++ b/libstdc++-v3/config/abi/pre/gnu.ver
@@ -1339,6 +1339,9 @@ GLIBCXX_3.4.18 {
# construction vtable
_ZTCSt*;
+ # std::this_thread::__sleep_for
+ _ZNSt11this_thread11__sleep_for*;
+
} GLIBCXX_3.4.17;
# Symbols in the support library (libsupc++) have their own tag.
diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index 5a98ee7bcde..1e7c2937524 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -19844,6 +19844,60 @@ $as_echo "#define _GLIBCXX_USE_CLOCK_REALTIME 1" >>confdefs.h
$as_echo "#define _GLIBCXX_USE_NANOSLEEP 1" >>confdefs.h
+ else
+ { $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
+/* end confdefs.h. */
+#include <unistd.h>
+int
+main ()
+{
+sleep(1)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_has_sleep=yes
+else
+ ac_has_sleep=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if test x"$ac_has_sleep" = x"yes"; then
+
+$as_echo "#define HAVE_SLEEP 1" >>confdefs.h
+
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_has_sleep" >&5
+$as_echo "$ac_has_sleep" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for usleep" >&5
+$as_echo_n "checking for usleep... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <unistd.h>
+int
+main ()
+{
+sleep(1);
+ usleep(100);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_has_usleep=yes
+else
+ ac_has_usleep=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if test x"$ac_has_usleep" = x"yes"; then
+
+$as_echo "#define HAVE_USLEEP 1" >>confdefs.h
+
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_has_usleep" >&5
+$as_echo "$ac_has_usleep" >&6; }
fi
@@ -70449,7 +70503,7 @@ $as_echo "$as_me: WARNING: === Symbol versioning will be disabled." >&2;}
fi
# For libtool versioning info, format is CURRENT:REVISION:AGE
-libtool_VERSION=6:17:0
+libtool_VERSION=6:18:0
# Everything parsed; figure out what files and settings to use.
case $enable_symvers in
diff --git a/libstdc++-v3/include/std/thread b/libstdc++-v3/include/std/thread
index 718c192c76d..6ca40cd266a 100644
--- a/libstdc++-v3/include/std/thread
+++ b/libstdc++-v3/include/std/thread
@@ -251,32 +251,35 @@ _GLIBCXX_END_NAMESPACE_VERSION
inline thread::id
get_id() noexcept { return thread::id(__gthread_self()); }
-#ifdef _GLIBCXX_USE_SCHED_YIELD
/// yield
inline void
yield() noexcept
- { __gthread_yield(); }
+ {
+#ifdef _GLIBCXX_USE_SCHED_YIELD
+ __gthread_yield();
#endif
+ }
+
+ void
+ __sleep_for(chrono::seconds, chrono::nanoseconds);
-#ifdef _GLIBCXX_USE_NANOSLEEP
/// sleep_for
template<typename _Rep, typename _Period>
inline void
sleep_for(const chrono::duration<_Rep, _Period>& __rtime)
{
- chrono::seconds __s =
- chrono::duration_cast<chrono::seconds>(__rtime);
-
- chrono::nanoseconds __ns =
- chrono::duration_cast<chrono::nanoseconds>(__rtime - __s);
-
+ auto __s = chrono::duration_cast<chrono::seconds>(__rtime);
+ auto __ns = chrono::duration_cast<chrono::nanoseconds>(__rtime - __s);
+#ifdef _GLIBCXX_USE_NANOSLEEP
__gthread_time_t __ts =
{
static_cast<std::time_t>(__s.count()),
static_cast<long>(__ns.count())
};
-
::nanosleep(&__ts, 0);
+#else
+ __sleep_for(__s, __ns);
+#endif
}
/// sleep_until
@@ -284,7 +287,6 @@ _GLIBCXX_END_NAMESPACE_VERSION
inline void
sleep_until(const chrono::time_point<_Clock, _Duration>& __atime)
{ sleep_for(__atime - _Clock::now()); }
-#endif
_GLIBCXX_END_NAMESPACE_VERSION
}
diff --git a/libstdc++-v3/src/c++11/thread.cc b/libstdc++-v3/src/c++11/thread.cc
index 5c108324141..084be426118 100644
--- a/libstdc++-v3/src/c++11/thread.cc
+++ b/libstdc++-v3/src/c++11/thread.cc
@@ -1,6 +1,6 @@
// thread -*- C++ -*-
-// Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+// Copyright (C) 2008-2012 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -27,6 +27,8 @@
#include <system_error>
#include <cerrno>
+#if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1)
+
#if defined(_GLIBCXX_USE_GET_NPROCS)
# include <sys/sysinfo.h>
# define _GLIBCXX_NPROCS get_nprocs()
@@ -55,7 +57,13 @@ static inline int get_nprocs()
# define _GLIBCXX_NPROCS 0
#endif
-#if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1)
+#ifndef _GLIBCXX_USE_NANOSLEEP
+# ifdef _GLIBCXX_HAVE_SLEEP
+# include <unistd.h>
+# else
+# error "No sleep function known for this target"
+# endif
+#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
@@ -142,6 +150,42 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
_GLIBCXX_END_NAMESPACE_VERSION
+
+namespace this_thread
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+ void
+ __sleep_for(chrono::seconds __s, chrono::nanoseconds __ns)
+ {
+#ifdef _GLIBCXX_USE_NANOSLEEP
+ __gthread_time_t __ts =
+ {
+ static_cast<std::time_t>(__s.count()),
+ static_cast<long>(__ns.count())
+ };
+ ::nanosleep(&__ts, 0);
+#else
+# ifdef _GLIBCXX_HAVE_SLEEP
+# ifdef _GLIBCXX_HAVE_USLEEP
+ ::sleep(__s.count());
+ if (__ns.count() > 0)
+ {
+ long __us = __ns.count() / 1000;
+ if (__us == 0)
+ __us = 1;
+ ::usleep(__us);
+ }
+# else
+ ::sleep(__s.count() + (__ns >= 1000000));
+# endif
+# endif
+#endif
+ }
+
+_GLIBCXX_END_NAMESPACE_VERSION
+}
+
} // namespace std
#endif // _GLIBCXX_HAS_GTHREADS && _GLIBCXX_USE_C99_STDINT_TR1
diff --git a/libstdc++-v3/testsuite/30_threads/async/54297.cc b/libstdc++-v3/testsuite/30_threads/async/54297.cc
index ff35a6778ab..0c32160f52f 100644
--- a/libstdc++-v3/testsuite/30_threads/async/54297.cc
+++ b/libstdc++-v3/testsuite/30_threads/async/54297.cc
@@ -5,7 +5,7 @@
// { dg-require-cstdint "" }
// { dg-require-gthreads "" }
// { dg-require-atomic-builtins "" }
-// { dg-require-nanosleep "" }
+// { dg-require-sleep "" }
// Copyright (C) 2012 Free Software Foundation, Inc.
//
diff --git a/libstdc++-v3/testsuite/30_threads/condition_variable_any/53830.cc b/libstdc++-v3/testsuite/30_threads/condition_variable_any/53830.cc
index 91aa348f90c..a5279f6d768 100644
--- a/libstdc++-v3/testsuite/30_threads/condition_variable_any/53830.cc
+++ b/libstdc++-v3/testsuite/30_threads/condition_variable_any/53830.cc
@@ -5,7 +5,7 @@
// { dg-require-cstdint "" }
// { dg-require-gthreads "" }
// { dg-require-sched-yield "" }
-// { dg-require-nanosleep "" }
+// { dg-require-sleep "" }
// Copyright (C) 2012 Free Software Foundation, Inc.
//
diff --git a/libstdc++-v3/testsuite/30_threads/this_thread/2.cc b/libstdc++-v3/testsuite/30_threads/this_thread/2.cc
index f6b4740713f..6f5dd0f3a17 100644
--- a/libstdc++-v3/testsuite/30_threads/this_thread/2.cc
+++ b/libstdc++-v3/testsuite/30_threads/this_thread/2.cc
@@ -4,9 +4,8 @@
// { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } }
// { dg-require-cstdint "" }
// { dg-require-gthreads "" }
-// { dg-require-sched-yield "" }
-// Copyright (C) 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+// Copyright (C) 2008-2012 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
diff --git a/libstdc++-v3/testsuite/30_threads/this_thread/3.cc b/libstdc++-v3/testsuite/30_threads/this_thread/3.cc
index b765f86aec9..35f65f48cb1 100644
--- a/libstdc++-v3/testsuite/30_threads/this_thread/3.cc
+++ b/libstdc++-v3/testsuite/30_threads/this_thread/3.cc
@@ -4,9 +4,9 @@
// { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } }
// { dg-require-cstdint "" }
// { dg-require-gthreads "" }
-// { dg-require-nanosleep "" }
+// { dg-require-sleep "" }
-// Copyright (C) 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+// Copyright (C) 2008-2012 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
diff --git a/libstdc++-v3/testsuite/30_threads/this_thread/4.cc b/libstdc++-v3/testsuite/30_threads/this_thread/4.cc
index 2f8e27ad167..38a2a3ce7f6 100644
--- a/libstdc++-v3/testsuite/30_threads/this_thread/4.cc
+++ b/libstdc++-v3/testsuite/30_threads/this_thread/4.cc
@@ -4,9 +4,9 @@
// { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } }
// { dg-require-cstdint "" }
// { dg-require-gthreads "" }
-// { dg-require-nanosleep "" }
+// { dg-require-sleep "" }
-// Copyright (C) 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+// Copyright (C) 2008-2012 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
diff --git a/libstdc++-v3/testsuite/lib/dg-options.exp b/libstdc++-v3/testsuite/lib/dg-options.exp
index 14c705a28c0..6836fbce711 100644
--- a/libstdc++-v3/testsuite/lib/dg-options.exp
+++ b/libstdc++-v3/testsuite/lib/dg-options.exp
@@ -143,8 +143,8 @@ proc dg-require-gthreads-timed { args } {
return
}
-proc dg-require-nanosleep { args } {
- if { ![ check_v3_target_nanosleep ] } {
+proc dg-require-sleep { args } {
+ if { ![ check_v3_target_sleep ] } {
upvar dg-do-what dg-do-what
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
return
diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp
index 09f512b3e9f..adb9c157586 100644
--- a/libstdc++-v3/testsuite/lib/libstdc++.exp
+++ b/libstdc++-v3/testsuite/lib/libstdc++.exp
@@ -1352,41 +1352,43 @@ proc check_v3_target_gthreads_timed { } {
}
-proc check_v3_target_nanosleep { } {
+proc check_v3_target_sleep { } {
global cxxflags
global DEFAULT_CXXFLAGS
- global et_nanosleep
+ global et_sleep
global tool
- if { ![info exists et_nanosleep_target_name] } {
- set et_nanosleep_target_name ""
+ if { ![info exists et_sleep_target_name] } {
+ set et_sleep_target_name ""
}
# If the target has changed since we set the cached value, clear it.
set current_target [current_target_name]
- if { $current_target != $et_nanosleep_target_name } {
- verbose "check_v3_target_nanosleep: `$et_nanosleep_target_name'" 2
- set et_nanosleep_target_name $current_target
- if [info exists et_nanosleep] {
- verbose "check_v3_target_nanosleep: removing cached result" 2
- unset et_nanosleep
+ if { $current_target != $et_sleep_target_name } {
+ verbose "check_v3_target_sleep: `$et_sleep_target_name'" 2
+ set et_sleep_target_name $current_target
+ if [info exists et_sleep] {
+ verbose "check_v3_target_sleep: removing cached result" 2
+ unset et_sleep
}
}
- if [info exists et_nanosleep] {
- verbose "check_v3_target_nanosleep: using cached result" 2
+ if [info exists et_sleep] {
+ verbose "check_v3_target_sleep: using cached result" 2
} else {
- set et_nanosleep 0
+ set et_sleep 0
- # Set up and preprocess a C++0x test program that depends
- # on the nanosleep facilities to be available.
- set src nanosleep[pid].cc
+ # Set up and preprocess a C++11 test program that depends
+ # on the sleep facilities to be available.
+ set src sleep[pid].cc
set f [open $src "w"]
puts $f "#include <bits/c++config.h>"
puts $f "#ifndef _GLIBCXX_USE_NANOSLEEP"
- puts $f "# error No nanosleep"
+ puts $f "# ifndef _GLIBCXX_HAVE_SLEEP"
+ puts $f "# error No nanosleep or sleep"
+ puts $f "# endif"
puts $f "#endif"
close $f
@@ -1399,13 +1401,13 @@ proc check_v3_target_nanosleep { } {
if [string match "" $lines] {
# No error message, preprocessing succeeded.
- set et_nanosleep 1
+ set et_sleep 1
} else {
- verbose "check_v3_target_nanosleep: compilation failed" 2
+ verbose "check_v3_target_sleep: compilation failed" 2
}
}
- verbose "check_v3_target_nanosleep: $et_nanosleep" 2
- return $et_nanosleep
+ verbose "check_v3_target_sleep: $et_sleep" 2
+ return $et_sleep
}
proc check_v3_target_sched_yield { } {