X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=nodestack.cc;h=7471c744d1a19e5b57c3ebce764fbb754dc79b86;hb=8c82e3813dcbe9f61197a45d0543abc5d131a0fa;hp=378dd8f4eebf3a5636a6203edd4eb4f381252343;hpb=20d006a8c581117c6636e835cdbe36dac5d6ef93;p=model-checker.git diff --git a/nodestack.cc b/nodestack.cc index 378dd8f..7471c74 100644 --- a/nodestack.cc +++ b/nodestack.cc @@ -4,6 +4,7 @@ #include "action.h" #include "common.h" #include "model.h" +#include "threads-model.h" /** * @brief Node constructor @@ -31,7 +32,11 @@ Node::Node(ModelAction *act, Node *par, int nthreads, Node *prevfairness) may_read_from(), read_from_index(0), future_values(), - future_index(-1) + future_index(-1), + relseq_break_writes(), + relseq_break_index(0), + misc_index(0), + misc_max(0) { if (act) { act->set_node(this); @@ -46,7 +51,7 @@ Node::Node(ModelAction *act, Node *par, int nthreads, Node *prevfairness) if (prevfi) { *fi=*prevfi; } - if (parent->enabled_array[i]) { + if (parent->is_enabled(int_to_id(i))) { fi->enabled_count++; } if (i==currtid) { @@ -55,7 +60,7 @@ Node::Node(ModelAction *act, Node *par, int nthreads, Node *prevfairness) } //Do window processing if (prevfairness != NULL) { - if (prevfairness -> parent->enabled_array[i]) + if (prevfairness -> parent->is_enabled(int_to_id(i))) fi->enabled_count--; if (i==prevtid) { fi->turns--; @@ -77,7 +82,7 @@ Node::~Node() if (action) delete action; if (enabled_array) - MYFREE(enabled_array); + model_free(enabled_array); } /** Prints debugging info for the ModelAction associated with this Node */ @@ -121,6 +126,8 @@ bool Node::get_promise(unsigned int i) { * @return true if we have a valid combination. */ bool Node::increment_promise() { + DBG(); + for (unsigned int i = 0; i < promises.size(); i++) { if (promises[i] == PROMISE_UNFULFILLED) { promises[i] = PROMISE_FULFILLED; @@ -146,6 +153,24 @@ bool Node::promise_empty() { return true; } + +void Node::set_misc_max(int i) { + misc_max=i; +} + +int Node::get_misc() { + return misc_index; +} + +bool Node::increment_misc() { + return (misc_index=misc_max; +} + + /** * Adds a value from a weakly ordered future write to backtrack to. * @param value is the value to backtrack to. @@ -156,7 +181,7 @@ bool Node::add_future_value(uint64_t value, modelclock_t expiration) { if (future_values[i].value == value) { if (future_values[i].expiration>=expiration) return false; - if (future_index < i) { + if (future_index < ((int) i)) { suitableindex=i; } } @@ -176,7 +201,7 @@ bool Node::add_future_value(uint64_t value, modelclock_t expiration) { * @return true if the future_values set is empty. */ bool Node::future_value_empty() { - return ((future_index + 1) >= future_values.size()); + return ((future_index + 1) >= ((int)future_values.size())); } /** @@ -213,15 +238,15 @@ bool Node::read_from_empty() { * Mark the appropriate backtracking information for exploring a thread choice. * @param act The ModelAction to explore */ -void Node::explore_child(ModelAction *act, bool * is_enabled) +void Node::explore_child(ModelAction *act, enabled_type_t * is_enabled) { if ( ! enabled_array ) - enabled_array=(bool *)MYMALLOC(sizeof(bool)*num_threads); + enabled_array=(enabled_type_t *)model_malloc(sizeof(enabled_type_t)*num_threads); if (is_enabled != NULL) - memcpy(enabled_array, is_enabled, sizeof(bool)*num_threads); + memcpy(enabled_array, is_enabled, sizeof(enabled_type_t)*num_threads); else { for(int i=0;iget_tid()); @@ -262,13 +287,18 @@ thread_id_t Node::get_next_backtrack() bool Node::is_enabled(Thread *t) { int thread_id=id_to_int(t->get_id()); - return thread_id < num_threads && enabled_array[thread_id]; + return thread_id < num_threads && (enabled_array[thread_id] != THREAD_DISABLED); } bool Node::is_enabled(thread_id_t tid) { int thread_id=id_to_int(tid); - return thread_id < num_threads && enabled_array[thread_id]; + return thread_id < num_threads && (enabled_array[thread_id] != THREAD_DISABLED); +} + +bool Node::has_priority(thread_id_t tid) +{ + return fairness[id_to_int(tid)].priority; } /** @@ -286,12 +316,12 @@ void Node::add_read_from(const ModelAction *act) * @return The first element in future_values */ uint64_t Node::get_future_value() { - ASSERT(future_index= ((int)relseq_break_writes.size())); } void Node::explore(thread_id_t tid) @@ -344,16 +436,18 @@ void Node::explore(thread_id_t tid) explored_children[i] = true; } -NodeStack::NodeStack() - : total_nodes(0) +NodeStack::NodeStack() : + node_list(1, new Node()), + iter(0), + total_nodes(0) { - node_list.push_back(new Node()); total_nodes++; - iter = 0; } NodeStack::~NodeStack() { + for (unsigned int i = 0; i < node_list.size(); i++) + delete node_list[i]; } void NodeStack::print() @@ -371,7 +465,7 @@ void NodeStack::print() /** Note: The is_enabled set contains what actions were enabled when * act was chosen. */ -ModelAction * NodeStack::explore_action(ModelAction *act, bool * is_enabled) +ModelAction * NodeStack::explore_action(ModelAction *act, enabled_type_t * is_enabled) { DBG(); @@ -406,6 +500,8 @@ void NodeStack::pop_restofstack(int numAhead) { /* Diverging from previous execution; clear out remainder of list */ unsigned int it=iter+numAhead; + for(unsigned int i=it;i