X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=nodestack.cc;h=b9142435c5267f276d10ed9b9c5c315801bfd6f7;hb=7417fdabc7a66c6c05aa87cafb5961aacebffa48;hp=01273479a69ed90919c3b60765fe8a814d2a584b;hpb=5f5f526a141aa4727cb37920212623c8afffa1f6;p=c11tester.git diff --git a/nodestack.cc b/nodestack.cc index 01273479..b9142435 100644 --- a/nodestack.cc +++ b/nodestack.cc @@ -27,6 +27,7 @@ Node::Node(ModelAction *act, Node *par, int nthreads, Node *prevfairness) : read_from_status(READ_FROM_PAST), action(act), + uninit_action(NULL), parent(par), num_threads(nthreads), explored_children(num_threads), @@ -45,7 +46,8 @@ Node::Node(ModelAction *act, Node *par, int nthreads, Node *prevfairness) : relseq_break_writes(), relseq_break_index(0), misc_index(0), - misc_max(0) + misc_max(0), + yield_data(NULL) { ASSERT(act); act->set_node(this); @@ -86,18 +88,82 @@ Node::Node(ModelAction *act, Node *par, int nthreads, Node *prevfairness) : } } +int Node::get_yield_data(int tid1, int tid2) const { + if (tid1get_tid()); + + for(int u = 0; u < num_threads; u++) { + for(int v = 0; v < num_threads; v++) { + int yield_state=parent->get_yield_data(u, v); + bool next_enabled=scheduler->is_enabled(int_to_id(v)); + bool curr_enabled=parent->is_enabled(int_to_id(v)); + if (!next_enabled) { + //Compute intersection of ES and E + yield_state&=~YIELD_E; + //Check to see if we disabled the thread + if (u==curr_tid && curr_enabled) + yield_state|=YIELD_D; + } + yield_data[YIELD_INDEX(u, v, num_threads)]=yield_state; + } + yield_data[YIELD_INDEX(u, curr_tid, num_threads)]=(yield_data[YIELD_INDEX(u, curr_tid, num_threads)]&~YIELD_P)|YIELD_S; + } + //handle curr.yield(t) part of computation + if (action->is_yield()) { + for(int v = 0; v < num_threads; v++) { + int yield_state=yield_data[YIELD_INDEX(curr_tid, v, num_threads)]; + if ((yield_state & (YIELD_E | YIELD_D)) && (!(yield_state & YIELD_S))) + yield_state |= YIELD_P; + yield_state &= YIELD_P; + if (scheduler->is_enabled(int_to_id(v))) { + yield_state|=YIELD_E; + } + yield_data[YIELD_INDEX(curr_tid, v, num_threads)]=yield_state; + } + } +} + /** @brief Node desctructor */ Node::~Node() { delete action; + if (uninit_action) + delete uninit_action; if (enabled_array) model_free(enabled_array); + if (yield_data) + model_free(yield_data); } /** Prints debugging info for the ModelAction associated with this Node */ void Node::print() const { action->print(); + model_print(" thread status: "); + if (enabled_array) { + for (int i = 0; i < num_threads; i++) { + char str[20]; + enabled_type_to_string(enabled_array[i], str); + model_print("[%d: %s]", i, str); + } + model_print("\n"); + } else + model_print("(info not available)\n"); model_print(" backtrack: %s", backtrack_empty() ? "empty" : "non-empty "); for (int i = 0; i < (int)backtrack.size(); i++) if (backtrack[i] == true) @@ -314,6 +380,11 @@ bool Node::has_priority(thread_id_t tid) const return fairness[id_to_int(tid)].priority; } +bool Node::has_priority_over(thread_id_t tid1, thread_id_t tid2) const +{ + return get_yield_data(id_to_int(tid1), id_to_int(tid2)) & YIELD_P; +} + /*********************************** read from ********************************/ /**