mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-01-10 01:24:53 +08:00
re PR libstdc++/58038 (std::this_thread::sleep_until can cause inifinite sleep)
PR libstdc++/58038 PR libstdc++/60421 * include/std/thread (this_thread::sleep_for): Check for negative durations. (this_thread::sleep_until): Check for times in the past. * testsuite/30_threads/this_thread/58038.cc: New. * testsuite/30_threads/this_thread/60421.cc: New. From-SVN: r221708
This commit is contained in:
parent
1f4eb0e985
commit
d1a74a287e
@ -1,3 +1,13 @@
|
||||
2015-03-26 Jonathan Wakely <jwakely@redhat.com>
|
||||
|
||||
PR libstdc++/58038
|
||||
PR libstdc++/60421
|
||||
* include/std/thread (this_thread::sleep_for): Check for negative
|
||||
durations.
|
||||
(this_thread::sleep_until): Check for times in the past.
|
||||
* testsuite/30_threads/this_thread/58038.cc: New.
|
||||
* testsuite/30_threads/this_thread/60421.cc: New.
|
||||
|
||||
2015-03-26 Jonathan Wakely <jwakely@redhat.com>
|
||||
|
||||
PR libstdc++/62259
|
||||
|
@ -279,6 +279,8 @@ _GLIBCXX_END_NAMESPACE_VERSION
|
||||
inline void
|
||||
sleep_for(const chrono::duration<_Rep, _Period>& __rtime)
|
||||
{
|
||||
if (__rtime <= __rtime.zero())
|
||||
return;
|
||||
auto __s = chrono::duration_cast<chrono::seconds>(__rtime);
|
||||
auto __ns = chrono::duration_cast<chrono::nanoseconds>(__rtime - __s);
|
||||
#ifdef _GLIBCXX_USE_NANOSLEEP
|
||||
@ -297,7 +299,11 @@ _GLIBCXX_END_NAMESPACE_VERSION
|
||||
template<typename _Clock, typename _Duration>
|
||||
inline void
|
||||
sleep_until(const chrono::time_point<_Clock, _Duration>& __atime)
|
||||
{ sleep_for(__atime - _Clock::now()); }
|
||||
{
|
||||
auto __now = _Clock::now();
|
||||
if (__now < __atime)
|
||||
sleep_for(__atime - __now);
|
||||
}
|
||||
|
||||
_GLIBCXX_END_NAMESPACE_VERSION
|
||||
}
|
||||
|
44
libstdc++-v3/testsuite/30_threads/this_thread/58038.cc
Normal file
44
libstdc++-v3/testsuite/30_threads/this_thread/58038.cc
Normal file
@ -0,0 +1,44 @@
|
||||
// Copyright (C) 2015 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
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 3, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// { dg-options "-std=gnu++11" }
|
||||
// { dg-require-cstdint "" }
|
||||
// { dg-require-time "" }
|
||||
|
||||
#include <thread>
|
||||
#include <chrono>
|
||||
|
||||
void
|
||||
test01()
|
||||
{
|
||||
auto now = std::chrono::system_clock::now();
|
||||
std::this_thread::sleep_until(now - 1ul * std::chrono::seconds(1));
|
||||
}
|
||||
|
||||
void
|
||||
test02()
|
||||
{
|
||||
auto now = std::chrono::steady_clock::now();
|
||||
std::this_thread::sleep_until(now - 1ul * std::chrono::seconds(1));
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
test01();
|
||||
test02();
|
||||
}
|
38
libstdc++-v3/testsuite/30_threads/this_thread/60421.cc
Normal file
38
libstdc++-v3/testsuite/30_threads/this_thread/60421.cc
Normal file
@ -0,0 +1,38 @@
|
||||
// Copyright (C) 2015 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
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 3, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// { dg-options "-std=gnu++11" }
|
||||
// { dg-require-cstdint "" }
|
||||
// { dg-require-time "" }
|
||||
|
||||
#include <thread>
|
||||
#include <chrono>
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
void
|
||||
test01()
|
||||
{
|
||||
std::this_thread::sleep_for(std::chrono::seconds(0));
|
||||
std::this_thread::sleep_for(std::chrono::seconds(-1));
|
||||
std::this_thread::sleep_for(std::chrono::duration<uint64_t>::zero());
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
test01();
|
||||
}
|
Loading…
Reference in New Issue
Block a user