summaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>2012-12-20 14:36:56 +0000
committerredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>2012-12-20 14:36:56 +0000
commitbd83c8ab8d8c65c3a18f449ede7ba2abef6d1c33 (patch)
tree0d2a84cb3f0ff31372af99337ec596b7f10c07a6 /libstdc++-v3
parent960a9b56d6ddfdfa9f6ec747b263e8a6dec80bcd (diff)
downloadgcc-bd83c8ab8d8c65c3a18f449ede7ba2abef6d1c33.tar.gz
PR libstdc++/55741
* acinclude.m4 (GLIBCXX_ENABLE_LIBSTDCXX_TIME): Check for Sleep. * config.h.in: Regenerate. * configure: Regenerate. * src/c++11/thread.cc (__sleep_for): Use Sleep if available. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@194635 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog8
-rw-r--r--libstdc++-v3/acinclude.m411
-rw-r--r--libstdc++-v3/config.h.in3
-rwxr-xr-xlibstdc++-v3/configure29
-rw-r--r--libstdc++-v3/src/c++11/thread.cc15
5 files changed, 61 insertions, 5 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index ec648dff906..41649b7c7e3 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,11 @@
+2012-12-20 Jonathan Wakely <jwakely.gcc@gmail.com>
+
+ PR libstdc++/55741
+ * acinclude.m4 (GLIBCXX_ENABLE_LIBSTDCXX_TIME): Check for Sleep.
+ * config.h.in: Regenerate.
+ * configure: Regenerate.
+ * src/c++11/thread.cc (__sleep_for): Use Sleep if available.
+
2012-12-18 Jonathan Wakely <jwakely.gcc@gmail.com>
* doc/xml/manual/abi.xml: Update URLs for C++ ABI.
diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index 281ee7ec1ba..2d4d7f022f9 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -1301,6 +1301,17 @@ AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_TIME], [
AC_MSG_RESULT($ac_has_usleep)
fi
+ if test x"$ac_has_nanosleep$ac_has_sleep" = x"nono"; then
+ 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.])
+ fi
+ AC_MSG_RESULT($ac_has_win32_sleep)
+ fi
+
AC_SUBST(GLIBCXX_LIBS)
CXXFLAGS="$ac_save_CXXFLAGS"
diff --git a/libstdc++-v3/config.h.in b/libstdc++-v3/config.h.in
index fcb2bb31971..dd14b91ebfd 100644
--- a/libstdc++-v3/config.h.in
+++ b/libstdc++-v3/config.h.in
@@ -460,6 +460,9 @@
/* Define to 1 if you have the <wctype.h> header file. */
#undef HAVE_WCTYPE_H
+/* Defined if Sleep exists. */
+#undef HAVE_WIN32_SLEEP
+
/* Define if writev is available in <sys/uio.h>. */
#undef HAVE_WRITEV
diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index 1e7c2937524..9e8360200b4 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -19900,6 +19900,35 @@ $as_echo "#define HAVE_USLEEP 1" >>confdefs.h
$as_echo "$ac_has_usleep" >&6; }
fi
+ if test x"$ac_has_nanosleep$ac_has_sleep" = x"nono"; then
+ { $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 <windows.h>
+int
+main ()
+{
+Sleep(1)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_has_win32_sleep=yes
+else
+ ac_has_win32_sleep=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if test x"$ac_has_win32_sleep" = x"yes"; then
+
+$as_echo "#define HAVE_WIN32_SLEEP 1" >>confdefs.h
+
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_has_win32_sleep" >&5
+$as_echo "$ac_has_win32_sleep" >&6; }
+ fi
+
CXXFLAGS="$ac_save_CXXFLAGS"
diff --git a/libstdc++-v3/src/c++11/thread.cc b/libstdc++-v3/src/c++11/thread.cc
index fa86a1bd34e..b04e6dc36e3 100644
--- a/libstdc++-v3/src/c++11/thread.cc
+++ b/libstdc++-v3/src/c++11/thread.cc
@@ -61,6 +61,8 @@ static inline int get_nprocs()
#ifndef _GLIBCXX_USE_NANOSLEEP
# ifdef _GLIBCXX_HAVE_SLEEP
# include <unistd.h>
+# elif defined(_GLIBCXX_HAVE_WIN32_SLEEP)
+# include <windows.h>
# else
# error "No sleep function known for this target"
# endif
@@ -170,9 +172,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
static_cast<long>(__ns.count())
};
::nanosleep(&__ts, 0);
-#else
-# ifdef _GLIBCXX_HAVE_SLEEP
-# ifdef _GLIBCXX_HAVE_USLEEP
+#elif defined(_GLIBCXX_HAVE_SLEEP)
+# ifdef _GLIBCXX_HAVE_USLEEP
::sleep(__s.count());
if (__ns.count() > 0)
{
@@ -181,10 +182,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__us = 1;
::usleep(__us);
}
-# else
+# else
::sleep(__s.count() + (__ns >= 1000000));
-# endif
# endif
+#elif defined(_GLIBCXX_HAVE_WIN32_SLEEP)
+ unsigned long ms = __ns.count() / 1000000;
+ if (__ns.count() > 0 && ms == 0)
+ ms = 1;
+ ::Sleep(chrono::milliseconds(__s).count() + ms);
#endif
}