X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=execution.cc;h=cd3ef4b01d93ff7daf1e4b29e0fc6e521f0f716c;hp=05591751b14a8db61ba0a7e3ff6619c311260e1d;hb=626e8f932c7cb841ef6ba75c86fe7be2aaa9f869;hpb=c111168a06e136dd46714c4297497ada8b670723 diff --git a/execution.cc b/execution.cc index 05591751..cd3ef4b0 100644 --- a/execution.cc +++ b/execution.cc @@ -63,13 +63,17 @@ ModelExecution::ModelExecution(ModelChecker *m, Scheduler *scheduler) : thrd_last_fence_release(), priv(new struct model_snapshot_members ()), mo_graph(new CycleGraph()), +#ifdef NEWFUZZER + fuzzer(new NewFuzzer()), +#else fuzzer(new Fuzzer()), +#endif isfinished(false) { /* Initialize a model-checker thread, for special ModelActions */ model_thread = new Thread(get_next_id()); add_thread(model_thread); - fuzzer->register_engine(this); + fuzzer->register_engine(m, this); scheduler->register_engine(this); #ifdef TLS pthread_key_create(&pthreadkey, tlsdestructor); @@ -275,7 +279,9 @@ ModelAction * ModelExecution::convertNonAtomicStore(void * location) { add_normal_write_to_lists(act); add_write_to_lists(act); w_modification_order(act); +#ifdef NEWFUZZER model->get_history()->process_action(act, act->get_tid()); +#endif return act; } @@ -1135,7 +1141,7 @@ void ModelExecution::add_action_to_lists(ModelAction *act, bool canprune) for(uint i = oldsize;i < priv->next_thread_id;i++) new (&(*vec)[i]) action_list_t(); } - if (!canprune) + if (!canprune && (act->is_read() || act->is_write())) act->setThrdMapRef((*vec)[tid].add_back(act)); // Update thrd_last_action, the last action taken by each thread @@ -1153,15 +1159,6 @@ void ModelExecution::add_action_to_lists(ModelAction *act, bool canprune) if (act->is_wait()) { void *mutex_loc = (void *) act->get_value(); act->setActionRef(get_safe_ptr_action(&obj_map, mutex_loc)->add_back(act)); - - SnapVector *vec = get_safe_ptr_vect_action(&obj_thrd_map, mutex_loc); - if ((int)vec->size() <= tid) { - uint oldsize = vec->size(); - vec->resize(priv->next_thread_id); - for(uint i = oldsize;i < priv->next_thread_id;i++) - new (&(*vec)[i]) action_list_t(); - } - act->setThrdMapRef((*vec)[tid].add_back(act)); } } @@ -1652,8 +1649,9 @@ Thread * ModelExecution::take_step(ModelAction *curr) ASSERT(curr); /* Process this action in ModelHistory for records */ +#ifdef NEWFUZZER model->get_history()->process_action( curr, curr->get_tid() ); - +#endif if (curr_thrd->is_blocked() || curr_thrd->is_complete()) scheduler->remove_thread(curr_thrd); @@ -1727,7 +1725,7 @@ ClockVector * ModelExecution::computeMinimalCV() { /** Sometimes we need to remove an action that is the most recent in the thread. This happens if it is mo before action in other threads. In that case we need to create a replacement latest ModelAction */ void ModelExecution::fixupLastAct(ModelAction *act) { - ModelAction *newact = new ModelAction(ATOMIC_NOP, std::memory_order_seq_cst, get_thread(act->get_tid())); + ModelAction *newact = new ModelAction(ATOMIC_NOP, std::memory_order_seq_cst, NULL, VALUE_NONE, get_thread(act->get_tid())); newact->set_seq_number(get_next_seq_num()); newact->create_cv(act); newact->set_last_fence_release(act->get_last_fence_release());