Implement spurious wakeup for ATOMIC_WAIT
[c11tester.git] / fuzzer.cc
index e102d9c34431a13dea089d9437857640e2691cfd..f3be1d3ff3cd1630398cb3671ce8f5ba241fc8f3 100644 (file)
--- a/fuzzer.cc
+++ b/fuzzer.cc
@@ -39,7 +39,29 @@ bool Fuzzer::shouldWake(const ModelAction *sleep) {
        return ((sleep->get_time()+sleep->get_value()) < lcurrtime);
 }
 
-bool Fuzzer::shouldWait(const ModelAction * act)
+/* Decide whether wait should spuriously fail or not */
+bool Fuzzer::waitShouldFail(ModelAction * wait)
 {
-       return true;
+       if ((random() & 1) == 0) {
+               struct timespec currtime;
+        clock_gettime(CLOCK_MONOTONIC, &currtime);
+        uint64_t lcurrtime = currtime.tv_sec * 1000000000 + currtime.tv_nsec;
+
+               // The time after which wait fail spuriously, in nanoseconds
+               uint64_t time = random() % 1000000;
+               wait->set_time(time + lcurrtime);
+               return true;
+       }
+
+       return false;
+}
+
+bool Fuzzer::waitShouldWakeUp(const ModelAction * wait)
+{
+       uint64_t time_to_expire = wait->get_time();
+       struct timespec currtime;
+       clock_gettime(CLOCK_MONOTONIC, &currtime);
+       uint64_t lcurrtime = currtime.tv_sec * 1000000000 + currtime.tv_nsec;
+
+       return (time_to_expire < lcurrtime);
 }