X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=model.cc;h=cffaea874740ada79a5ee89e0901e31e9dbcdb2c;hb=1bdb456ee7767a75d266716459a85743740acc33;hp=78729bd38ac4d9da05d25527450f6668f38be997;hpb=651e9182baf50ef1e235ad7a587730b989bb44c7;p=c11tester.git diff --git a/model.cc b/model.cc index 78729bd3..cffaea87 100644 --- a/model.cc +++ b/model.cc @@ -33,14 +33,14 @@ ModelChecker::ModelChecker() : params(), restart_flag(false), scheduler(new Scheduler()), - execution(new ModelExecution(this, scheduler)), history(new ModelHistory()), + execution(new ModelExecution(this, scheduler)), execution_number(1), trace_analyses(), inspect_plugin(NULL) { memset(&stats,0,sizeof(struct execution_stats)); - init_thread = new Thread(execution->get_next_id(), (thrd_t *) model_malloc(sizeof(thrd_t)), &user_main_wrapper, NULL, NULL); // L: user_main_wrapper passes the user program + init_thread = new Thread(execution->get_next_id(), (thrd_t *) model_malloc(sizeof(thrd_t)), &user_main_wrapper, NULL, NULL); #ifdef TLS init_thread->setTLS((char *)get_tls_addr()); #endif @@ -264,6 +264,7 @@ bool ModelChecker::next_execution() // test code execution_number ++; reset_to_initial_state(); + history->set_new_exec_flag(); return false; } @@ -362,7 +363,7 @@ bool ModelChecker::should_terminate_execution() /* Infeasible -> don't take any more steps */ if (execution->is_infeasible()) return true; - else if (execution->isfeasibleprefix() && execution->have_fatal_bug_reports()) { + else if (execution->isfeasibleprefix() && execution->have_bug_reports()) { execution->set_assert(); return true; } else if (execution->isFinished()) { @@ -392,20 +393,6 @@ void ModelChecker::startMainThread() { main_thread_startup(); } -static bool is_nonsc_write(const ModelAction *act) { - if (act->get_type() == ATOMIC_WRITE) { - std::memory_order order = act->get_mo(); - switch(order) { - case std::memory_order_relaxed: - case std::memory_order_release: - return true; - default: - return false; - } - } - return false; -} - /** @brief Run ModelChecker for the user program */ void ModelChecker::run() { @@ -423,12 +410,11 @@ void ModelChecker::run() * thread which just took a step--plus the first step * for any newly-created thread */ - ModelAction * pending; for (unsigned int i = 0;i < get_num_threads();i++) { thread_id_t tid = int_to_id(i); Thread *thr = get_thread(tid); - if (!thr->is_model_thread() && !thr->is_complete() && ((!(pending=thr->get_pending())) || is_nonsc_write(pending)) ) { - switch_from_master(thr); // L: context swapped, and action type of thr changed. + if (!thr->is_model_thread() && !thr->is_complete() && !thr->get_pending()) { + switch_from_master(thr); if (thr->is_waiting_on(thr)) assert_bug("Deadlock detected (thread %u)", i); } @@ -473,6 +459,12 @@ void ModelChecker::run() t = get_next_thread(); if (!t || t->is_model_thread()) break; + if (t->just_woken_up()) { + t->set_wakeup_state(false); + t->set_pending(NULL); + t = NULL; + continue; // Allow this thread to stash the next pending action + } /* Consume the next action for a Thread */ ModelAction *curr = t->get_pending(); @@ -490,4 +482,9 @@ void ModelChecker::run() /* Have the trace analyses dump their output. */ for (unsigned int i = 0;i < trace_analyses.size();i++) trace_analyses[i]->finish(); + + /* unlink tmp file created by last child process */ + char filename[256]; + snprintf_(filename, sizeof(filename), "C11FuzzerTmp%d", getpid()); + unlink(filename); }