X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=model.cc;h=f1bc320b417e7c7f0938a73d50eff20b2a6b7301;hb=8a7dd35db7542ad66f87060cf637172249494e47;hp=1eac9283fa0ec0f024f313cc750cb54f8113fa7a;hpb=aee893bf48bb3d4c6df4b75f6cd867e52954ab2c;p=model-checker.git diff --git a/model.cc b/model.cc index 1eac928..f1bc320 100644 --- a/model.cc +++ b/model.cc @@ -13,6 +13,7 @@ ModelChecker::ModelChecker() /* Initialize default scheduler */ this->scheduler = new Scheduler(); + num_executions = 0; this->current_action = NULL; this->exploring = NULL; this->nextThread = THREAD_ID_T_NONE; @@ -29,17 +30,27 @@ ModelChecker::~ModelChecker() delete rootNode; } -void ModelChecker::assign_id(Thread *t) +void ModelChecker::reset_to_initial_state() { - t->set_id(++used_thread_id); + DEBUG("+++ Resetting to initial state +++\n"); + std::map::iterator it; + for (it = thread_map.begin(); it != thread_map.end(); it++) { + delete (*it).second; + } + thread_map.clear(); + action_trace = new action_list_t(); + currentNode = rootNode; + current_action = NULL; + used_thread_id = 1; // ? + /* scheduler reset ? */ } -void ModelChecker::add_system_thread(Thread *t) +int ModelChecker::get_next_id() { - this->system_thread = t; + return ++used_thread_id; } -Thread *ModelChecker::schedule_next_thread() +Thread * ModelChecker::schedule_next_thread() { Thread *t; if (nextThread == THREAD_ID_T_NONE) @@ -93,7 +104,18 @@ thread_id_t ModelChecker::advance_backtracking_state() return get_next_replay_thread(); } -ModelAction *ModelChecker::get_last_conflict(ModelAction *act) +bool ModelChecker::next_execution() +{ + num_executions++; + print_summary(); + if ((exploring = model->get_next_backtrack()) == NULL) + return false; + model->reset_to_initial_state(); + nextThread = get_next_replay_thread(); + return true; +} + +ModelAction * ModelChecker::get_last_conflict(ModelAction *act) { void *loc = act->get_location(); action_type type = act->get_type(); @@ -109,6 +131,7 @@ ModelAction *ModelChecker::get_last_conflict(ModelAction *act) default: break; } + /* linear search: from most recent to oldest */ action_list_t::reverse_iterator rit; for (rit = action_trace->rbegin(); rit != action_trace->rend(); rit++) { ModelAction *prev = *rit; @@ -118,7 +141,7 @@ ModelAction *ModelChecker::get_last_conflict(ModelAction *act) continue; /* Conflict from the same thread is not really a conflict */ if (id == prev->get_tid()) - return NULL; + continue; return prev; } return NULL; @@ -151,6 +174,16 @@ void ModelChecker::set_backtracking(ModelAction *act) backtrack_list.push_back(back); } +Backtrack * ModelChecker::get_next_backtrack() +{ + Backtrack *next; + if (backtrack_list.empty()) + return NULL; + next = backtrack_list.back(); + backtrack_list.pop_back(); + return next; +} + void ModelChecker::check_current_action(void) { ModelAction *next = this->current_action; @@ -159,6 +192,7 @@ void ModelChecker::check_current_action(void) DEBUG("trying to push NULL action...\n"); return; } + current_action = NULL; nextThread = advance_backtracking_state(); next->set_node(currentNode); set_backtracking(next); @@ -166,14 +200,19 @@ void ModelChecker::check_current_action(void) this->action_trace->push_back(next); } -void ModelChecker::print_trace(void) +void ModelChecker::print_summary(void) { action_list_t::iterator it; printf("\n"); printf("---------------------------------------------------------------------\n"); + printf("Number of executions: %d\n", num_executions); printf("Total nodes created: %d\n\n", TreeNode::getTotalNodes()); + scheduler->print(); + + printf("Trace:\n\n"); + for (it = action_trace->begin(); it != action_trace->end(); it++) { DBG(); (*it)->print(); @@ -184,19 +223,24 @@ void ModelChecker::print_trace(void) int ModelChecker::add_thread(Thread *t) { thread_map[t->get_id()] = t; + scheduler->add_thread(t); return 0; } +void ModelChecker::remove_thread(Thread *t) +{ + scheduler->remove_thread(t); +} + int ModelChecker::switch_to_master(ModelAction *act) { - Thread *old, *next; + Thread *old; DBG(); old = thread_current(); set_current_action(act); old->set_state(THREAD_READY); - next = system_thread; - return old->swap(next); + return Thread::swap(old, get_system_context()); } ModelAction::ModelAction(action_type_t type, memory_order order, void *loc, int value)