X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=fuzzer.cc;h=7e488ce85fe84dbf6126b81b90aa9c48f8bf2c6f;hp=5b5be9ff4441942fbfd22461d13b0c3788a9c7d6;hb=HEAD;hpb=7594d7ae8eda38fbb5a3ac3d6f33fffbb365b7bd diff --git a/fuzzer.cc b/fuzzer.cc index 5b5be9ff..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(); @@ -36,5 +36,50 @@ bool Fuzzer::shouldWake(const ModelAction *sleep) { clock_gettime(CLOCK_MONOTONIC, &currtime); uint64_t lcurrtime = currtime.tv_sec * 1000000000 + currtime.tv_nsec; - return ((sleep->get_time()+sleep->get_value()) >= lcurrtime); + return ((sleep->get_time()+sleep->get_value()) < lcurrtime); +} + +/* Decide whether wait should spuriously fail or not */ +bool Fuzzer::waitShouldFail(ModelAction * wait) +{ + 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; }