diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index f0a34f8158940c349572f30be380f7c0c8648c6d..19480af04c02280efc8472350662c65b0d72c157 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 8c6f170a9785cfbbff9ec643b23a7e9c9ace55b4..281ee7ec1ba64ab0e754e928ba2de18a6550232a 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 0667bbf7df890dbf3ffcae5fe656a50c0ce8fe1c..fcb2bb319714261b5ef9925d1e41725b6994562a 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 949ab50e5e3df33d49d52461df4a03c3584e7c9d..8b1ec0da91731eaafac5fea60a027fdd51e24c2f 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 5a98ee7bcded4f22d605a36541139f64c7ceb1c0..1e7c2937524d58ca763ca8226c1956651487e957 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 718c192c76dfe3a8f7d35783915883878a5542bd..6ca40cd266a167e3c4aaec09f120f39cc288a650 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 5c108324141008d3d13b8129c3715463c0f5057d..084be4261182f13d8e05d6252a2d5db70cc555cb 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 ff35a6778ab756f754f9c36bde0c62cac240c586..0c32160f52fad6102051351b010d487d20047090 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 91aa348f90c828203c4217834a1353ffb92a68bc..a5279f6d768f39c96976c8593d9efa5971e5b083 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 f6b4740713f466087108e4374e761f4dad26b18a..6f5dd0f3a17fda8640f1ec3b675c61ef7066d498 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 b765f86aec932218f11e13a89109b52f63c35477..35f65f48cb19b40303802eab3dba4fe557e13ae4 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 2f8e27ad1670c02611015667a3c0416e2ce58adc..38a2a3ce7f640da1f585089f318475ca0ddbf4e2 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 14c705a28c070793faa283021b052220b85075a5..6836fbce711019986ff3d47fff0b43d7d1ab2852 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 09f512b3e9ffa3e1a414074683ea7cff80092214..adb9c157586d17d2bedfe3436924bef24a25f221 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 { } {