add support for sleep sets...
[model-checker.git] / nodestack.cc
index f5cb6f0e2f4bcf1b8ee350485825f2afec0d28fb..76d167d82a9438e6cd941d114c5a172867ca0780 100644 (file)
@@ -4,6 +4,7 @@
 #include "action.h"
 #include "common.h"
 #include "model.h"
+#include "threads.h"
 
 /**
  * @brief Node constructor
@@ -46,7 +47,7 @@ Node::Node(ModelAction *act, Node *par, int nthreads, Node *prevfairness)
                                if (prevfi) {
                                        *fi=*prevfi;
                                }
-                               if (parent->enabled_array[i]) {
+                               if (parent->enabled_array[i]==THREAD_ENABLED) {
                                        fi->enabled_count++;
                                }
                                if (i==currtid) {
@@ -55,7 +56,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->enabled_array[i] == THREAD_ENABLED)
                                                fi->enabled_count--;
                                        if (i==prevtid) {
                                                fi->turns--;
@@ -215,15 +216,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 *)model_malloc(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;i<num_threads;i++)
-                       enabled_array[i]=false;
+                       enabled_array[i]=THREAD_DISABLED;
        }
 
        explore(act->get_tid());
@@ -264,13 +265,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;
 }
 
 /**
@@ -356,16 +362,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()
@@ -383,7 +391,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();
 
@@ -418,7 +426,7 @@ void NodeStack::pop_restofstack(int numAhead)
 {
        /* Diverging from previous execution; clear out remainder of list */
        unsigned int it=iter+numAhead;
-       for(unsigned i=it;i<node_list.size();i++)
+       for(unsigned int i=it;i<node_list.size();i++)
                delete node_list[i];
        node_list.resize(it);
 }