X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=sleeps.cc;h=0b4d32f65673285a75951d107aa2007e2c0d4356;hp=24e0eeaca56922d237e545a3101c07188a4e5944;hb=74ac6c2fab9f394a9992431079ed2dbede1144c0;hpb=1b16c934eb17b6ddac760bbce48d91b27332ce8c diff --git a/sleeps.cc b/sleeps.cc index 24e0eeac..0b4d32f6 100644 --- a/sleeps.cc +++ b/sleeps.cc @@ -4,6 +4,10 @@ #include "action.h" #include "model.h" +extern "C" { +int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); +} + unsigned int __sleep (unsigned int seconds) { model->switch_to_master( @@ -19,8 +23,28 @@ unsigned int sleep(unsigned int seconds) int usleep (useconds_t useconds) { - model->switch_to_master( - new ModelAction(NOOP, std::memory_order_seq_cst, NULL) - ); + struct timespec ts = { + .tv_sec = (long int) (useconds / 1000000), + .tv_nsec = (long int) (useconds % 1000000) * 1000l, + }; + return nanosleep(&ts, NULL); +} + +int nanosleep(const struct timespec *rqtp, struct timespec *rmtp) { + if (model) { + uint64_t time = rqtp->tv_sec * 1000000000 + rqtp->tv_nsec; + struct timespec currtime; + clock_gettime(CLOCK_MONOTONIC, &currtime); + uint64_t lcurrtime = currtime.tv_sec * 1000000000 + currtime.tv_nsec; + model->switch_to_master(new ModelAction(THREAD_SLEEP, std::memory_order_seq_cst, time, lcurrtime)); + if (rmtp != NULL) { + clock_gettime(CLOCK_MONOTONIC, &currtime); + uint64_t lendtime = currtime.tv_sec * 1000000000 + currtime.tv_nsec; + uint64_t elapsed = lendtime - lcurrtime; + rmtp->tv_sec = elapsed / 1000000000; + rmtp->tv_nsec = elapsed - rmtp->tv_sec * 1000000000; + } + } + return 0; }