8 int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
11 unsigned int __sleep (unsigned int seconds)
13 model->switch_to_master(
14 new ModelAction(NOOP, std::memory_order_seq_cst, NULL)
19 unsigned int sleep(unsigned int seconds)
21 return __sleep(seconds);
24 int usleep (useconds_t useconds)
26 struct timespec ts = {
27 .tv_sec = (long int) (useconds / 1000000),
28 .tv_nsec = (long int) (useconds % 1000000) * 1000l,
30 return nanosleep(&ts, NULL);
33 int nanosleep(const struct timespec *rqtp, struct timespec *rmtp) {
35 uint64_t time = rqtp->tv_sec * 1000000000 + rqtp->tv_nsec;
36 struct timespec currtime;
37 clock_gettime(CLOCK_MONOTONIC, &currtime);
38 uint64_t lcurrtime = currtime.tv_sec * 1000000000 + currtime.tv_nsec;
39 model->switch_to_master(new ModelAction(THREAD_SLEEP, std::memory_order_seq_cst, time, lcurrtime));
41 clock_gettime(CLOCK_MONOTONIC, &currtime);
42 uint64_t lendtime = currtime.tv_sec * 1000000000 + currtime.tv_nsec;
43 uint64_t elapsed = lendtime - lcurrtime;
44 rmtp->tv_sec = elapsed / 1000000000;
45 rmtp->tv_nsec = elapsed - rmtp->tv_sec * 1000000000;