re PR libstdc++/52680 (std::this_thread::sleep_for #ifdef'd out by _GLIBCXX_USE_NANOS...
authorJonathan Wakely <jwakely.gcc@gmail.com>
Fri, 23 Nov 2012 22:11:23 +0000 (22:11 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 23 Nov 2012 22:11:23 +0000 (22:11 +0000)
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.

From-SVN: r193769

14 files changed:
libstdc++-v3/ChangeLog
libstdc++-v3/acinclude.m4
libstdc++-v3/config.h.in
libstdc++-v3/config/abi/pre/gnu.ver
libstdc++-v3/configure
libstdc++-v3/include/std/thread
libstdc++-v3/src/c++11/thread.cc
libstdc++-v3/testsuite/30_threads/async/54297.cc
libstdc++-v3/testsuite/30_threads/condition_variable_any/53830.cc
libstdc++-v3/testsuite/30_threads/this_thread/2.cc
libstdc++-v3/testsuite/30_threads/this_thread/3.cc
libstdc++-v3/testsuite/30_threads/this_thread/4.cc
libstdc++-v3/testsuite/lib/dg-options.exp
libstdc++-v3/testsuite/lib/libstdc++.exp

index f0a34f8..19480af 100644 (file)
@@ -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
index 8c6f170..281ee7e 100644 (file)
@@ -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
index 0667bbf..fcb2bb3 100644 (file)
 /* 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
 
 /* 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
 
index 949ab50..8b1ec0d 100644 (file)
@@ -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.
index 5a98ee7..1e7c293 100755 (executable)
@@ -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
index 718c192..6ca40cd 100644 (file)
@@ -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
   }
index 5c10832..084be42 100644 (file)
@@ -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
index ff35a67..0c32160 100644 (file)
@@ -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.
 //
index 91aa348..a5279f6 100644 (file)
@@ -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.
 //
index f6b4740..6f5dd0f 100644 (file)
@@ -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
index b765f86..35f65f4 100644 (file)
@@ -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
index 2f8e27a..38a2a3c 100644 (file)
@@ -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
index 14c705a..6836fbc 100644 (file)
@@ -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
index 09f512b..adb9c15 100644 (file)
@@ -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 { } {