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. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@210210 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
981b01d9d0
commit
0707b67ac3
@ -121,7 +121,9 @@ sleep_for(const chrono::nanoseconds& ns)
|
|||||||
ts.tv_sec = ts_sec_max;
|
ts.tv_sec = ts_sec_max;
|
||||||
ts.tv_nsec = giga::num - 1;
|
ts.tv_nsec = giga::num - 1;
|
||||||
}
|
}
|
||||||
nanosleep(&ts, 0);
|
|
||||||
|
while (nanosleep(&ts, &ts) == -1 && errno == EINTR)
|
||||||
|
;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,9 +15,29 @@
|
|||||||
#include <thread>
|
#include <thread>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
int main()
|
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 std::chrono::system_clock Clock;
|
||||||
typedef Clock::time_point time_point;
|
typedef Clock::time_point time_point;
|
||||||
typedef Clock::duration duration;
|
typedef Clock::duration duration;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user