Handle partial nanosleeps in this_thread::sleep_for

Signals may result in nanosleep returning with only some of the
requested sleeping performed.

Utilize nanosleep's "time-remaining" out parameter to continue sleeping
when this occurs.

llvm-svn: 210210
This commit is contained in:
David Majnemer 2014-06-04 19:43:20 +00:00
parent be7eaddc69
commit 58a0a70fb2
2 changed files with 23 additions and 1 deletions

View File

@ -121,7 +121,9 @@ sleep_for(const chrono::nanoseconds& ns)
ts.tv_sec = ts_sec_max;
ts.tv_nsec = giga::num - 1;
}
nanosleep(&ts, 0);
while (nanosleep(&ts, &ts) == -1 && errno == EINTR)
;
}
}

View File

@ -15,9 +15,29 @@
#include <thread>
#include <cstdlib>
#include <cassert>
#include <signal.h>
#include <sys/time.h>
int main()
{
int ec;
struct sigaction action;
action.sa_handler = [](int) {};
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
ec = sigaction(SIGALRM, &action, nullptr);
assert(!ec);
struct itimerval it;
it.it_interval = { 0 };
it.it_value.tv_sec = 0;
it.it_value.tv_usec = 250000;
// This will result in a SIGALRM getting fired resulting in the nanosleep
// inside sleep_for getting EINTR.
ec = setitimer(ITIMER_REAL, &it, nullptr);
assert(!ec);
typedef std::chrono::system_clock Clock;
typedef Clock::time_point time_point;
typedef Clock::duration duration;