0b4d32f65673285a75951d107aa2007e2c0d4356
[c11tester.git] / sleeps.cc
1 #include <time.h>
2 #include <unistd.h>
3
4 #include "action.h"
5 #include "model.h"
6
7 extern "C" {
8 int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
9 }
10
11 unsigned int __sleep (unsigned int seconds)
12 {
13         model->switch_to_master(
14                 new ModelAction(NOOP, std::memory_order_seq_cst, NULL)
15                 );
16         return 0;
17 }
18
19 unsigned int sleep(unsigned int seconds)
20 {
21         return __sleep(seconds);
22 }
23
24 int usleep (useconds_t useconds)
25 {
26         struct timespec ts = {
27                 .tv_sec = (long int) (useconds / 1000000),
28                 .tv_nsec = (long int) (useconds % 1000000) * 1000l,
29         };
30         return nanosleep(&ts, NULL);
31 }
32
33 int nanosleep(const struct timespec *rqtp, struct timespec *rmtp) {
34         if (model) {
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));
40                 if (rmtp != NULL) {
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;
46                 }
47         }
48
49         return 0;
50 }