X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=fuzzer.cc;h=7e488ce85fe84dbf6126b81b90aa9c48f8bf2c6f;hb=HEAD;hp=371838dcb1977c912a346a7a995e4e9cc3083425;hpb=236e7f6ba12d26eb02a1348858168ed939bcfa0a;p=c11tester.git diff --git a/fuzzer.cc b/fuzzer.cc index 371838dc..7e488ce8 100644 --- a/fuzzer.cc +++ b/fuzzer.cc @@ -16,7 +16,7 @@ Thread * Fuzzer::selectThread(int * threadlist, int numthreads) { return model->get_thread(curr_tid); } -Thread * Fuzzer::selectNotify(action_list_t * waiters) { +Thread * Fuzzer::selectNotify(simple_action_list_t * waiters) { int numwaiters = waiters->size(); int random_index = random() % numwaiters; sllnode * it = waiters->begin(); @@ -39,7 +39,47 @@ 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 random() & 1; + 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) +{ + struct timespec currtime; + clock_gettime(CLOCK_MONOTONIC, &currtime); + uint64_t lcurrtime = currtime.tv_sec * 1000000000 + currtime.tv_nsec; + + return (wait->get_time() < lcurrtime); +} + +bool Fuzzer::randomizeWaitTime(ModelAction * timed_wait) +{ + uint64_t abstime = timed_wait->get_time(); + struct timespec currtime; + clock_gettime(CLOCK_MONOTONIC, &currtime); + uint64_t lcurrtime = currtime.tv_sec * 1000000000 + currtime.tv_nsec; + if (abstime <= lcurrtime) + return false; + + // Shorten wait time + if ((random() & 1) == 0) { + uint64_t tmp = abstime - lcurrtime; + uint64_t time_to_expire = random() % tmp + lcurrtime; + timed_wait->set_time(time_to_expire); + } + + return true; }