[LLVMbugs] [Bug 13721] New: sleep_for(std::chrono::duration<T>::max()) does not sleep at all for (T > uint32_t)
bugzilla-daemon at llvm.org
bugzilla-daemon at llvm.org
Tue Aug 28 14:21:02 PDT 2012
http://llvm.org/bugs/show_bug.cgi?id=13721
Bug #: 13721
Summary: sleep_for(std::chrono::duration<T>::max()) does not
sleep at all for (T > uint32_t)
Product: libc++
Version: unspecified
Platform: All
OS/Version: All
Status: NEW
Severity: normal
Priority: P
Component: All Bugs
AssignedTo: hhinnant at apple.com
ReportedBy: arthur.j.odwyer at gmail.com
CC: llvmbugs at cs.uiuc.edu
Classification: Unclassified
As of https://llvm.org/svn/llvm-project/libcxx/trunk@162648 libc++'s <chrono>
header contains the following template definition:
template <class _Rep, class _Period>
void
sleep_for(const chrono::duration<_Rep, _Period>& __d)
{
using namespace chrono;
nanoseconds __ns = duration_cast<nanoseconds>(__d);
if (__ns < __d)
++__ns;
sleep_for(__ns);
}
This has wrong behavior (even undefined behavior!) if the conversion of __d to
nanoseconds overflows the type _Rep. I don't see any language in the C++11
standard that permits misbehavior for large values.
For example:
#include <chrono>
#include <thread>
int main() {
std::this_thread::sleep_for(std::chrono::milliseconds::max());
}
This seems like a nice idiom to indicate "sleep forever", but in fact this
program returns immediately! Even worse, from the user's point of view:
while (true)
std::this_thread::sleep_for(std::chrono::seconds::max());
This loop is intended as a future-proof "sleep forever", but libc++ turns it
into a "busy-wait forever". The programmer's attempt to relinquish the CPU gets
turned into the exact opposite!
Incidentally, is there a better (clearer and/or more portable to libc++) idiom
to indicate "sleep forever", in cases where we have nothing else to do but
can't afford to kill ourselves? (Perhaps some other thread holds references to
objects on our stack.) My only other idea is "create a private condition
variable and wait on it", but IMHO that fails Occam's Razor.
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
More information about the llvm-bugs
mailing list