From: weiyu Date: Sat, 12 Dec 2020 01:11:26 +0000 (-0800) Subject: seed random number generator with time X-Git-Url: http://demsky.eecs.uci.edu/git/?p=c11tester.git;a=commitdiff_plain;h=ba9cc8ef093a985673efc0d440898ae3b6fe0bb5 seed random number generator with time --- diff --git a/libthreads.cc b/libthreads.cc index 4d61e536..3ed4937d 100644 --- a/libthreads.cc +++ b/libthreads.cc @@ -12,6 +12,7 @@ */ int thrd_create(thrd_t *t, thrd_start_t start_routine, void *arg) { + createModelIfNotExist(); struct thread_params params = { start_routine, arg }; /* seq_cst is just a 'don't care' parameter */ model->switch_thread(new ModelAction(THREAD_CREATE, std::memory_order_seq_cst, t, (uint64_t)¶ms)); @@ -20,6 +21,7 @@ int thrd_create(thrd_t *t, thrd_start_t start_routine, void *arg) int thrd_join(thrd_t t) { + createModelIfNotExist(); Thread *th = t.priv; model->switch_thread(new ModelAction(THREAD_JOIN, std::memory_order_seq_cst, th, id_to_int(thrd_to_id(t)))); return 0; @@ -28,10 +30,12 @@ int thrd_join(thrd_t t) /** A no-op, for now */ void thrd_yield(void) { + createModelIfNotExist(); model->switch_thread(new ModelAction(THREAD_YIELD, std::memory_order_seq_cst, thread_current(), VALUE_NONE)); } thrd_t thrd_current(void) { + createModelIfNotExist(); return thread_current()->get_thrd_t(); } diff --git a/model.cc b/model.cc index 3f811d7d..c190e38c 100644 --- a/model.cc +++ b/model.cc @@ -22,6 +22,14 @@ ModelChecker *model = NULL; int inside_model = 0; +uint64_t get_nanotime() +{ + struct timespec currtime; + clock_gettime(CLOCK_MONOTONIC, &currtime); + + return currtime.tv_nsec; +} + void placeholder(void *) { ASSERT(0); } @@ -524,12 +532,16 @@ bool ModelChecker::handleChosenThread(Thread *old) void ModelChecker::startChecker() { startExecution(); //Need to initial random number generator state to avoid resets on rollback - initstate(423121, random_state, sizeof(random_state)); + //initstate(423121, random_state, sizeof(random_state)); + uint64_t seed = get_nanotime(); + srandom(seed); snapshot = take_snapshot(); //reset random number generator state - setstate(random_state); + //setstate(random_state); + seed = get_nanotime(); + srandom(seed); install_trace_analyses(get_execution()); redirect_output();