nodestack: don't perform linear search to check if backtrack is empty
authorBrian Norris <banorris@uci.edu>
Tue, 19 Jun 2012 23:33:52 +0000 (16:33 -0700)
committerBrian Norris <banorris@uci.edu>
Tue, 19 Jun 2012 23:33:52 +0000 (16:33 -0700)
Add a simple add/remove counter to record when threads are 'added' and
'removed' from the backtracking set.

nodestack.cc
nodestack.h

index c9878a339ec384febedaa95385e31cac478cc169..65afd7c89c1071e1abadf304cbf461a2c9923ec4 100644 (file)
@@ -8,7 +8,8 @@ Node::Node(ModelAction *act, int nthreads)
        : action(act),
        num_threads(nthreads),
        explored_children(num_threads),
-       backtrack(num_threads)
+       backtrack(num_threads),
+       numBacktracks(0)
 {
 }
 
@@ -47,11 +48,7 @@ bool Node::has_been_explored(thread_id_t tid)
  */
 bool Node::backtrack_empty()
 {
-       unsigned int i;
-       for (i = 0; i < backtrack.size(); i++)
-               if (backtrack[i] == true)
-                       return false;
-       return true;
+       return numBacktracks == 0;
 }
 
 /**
@@ -79,6 +76,7 @@ bool Node::set_backtrack(thread_id_t id)
        if (backtrack[i])
                return false;
        backtrack[i] = true;
+       numBacktracks++;
        return true;
 }
 
@@ -92,6 +90,7 @@ thread_id_t Node::get_next_backtrack()
        if (i >= backtrack.size())
                return THREAD_ID_T_NONE;
        backtrack[i] = false;
+       numBacktracks--;
        return int_to_id(i);
 }
 
@@ -103,7 +102,10 @@ bool Node::is_enabled(Thread *t)
 void Node::explore(thread_id_t tid)
 {
        int i = id_to_int(tid);
-       backtrack[i] = false;
+       if (backtrack[i]) {
+               backtrack[i] = false;
+               numBacktracks--;
+       }
        explored_children[i] = true;
 }
 
index d3eab13561149cb6ca89da2d1928332ead695e4a..a73ce44034fba9bc44d76ebe27f8912c21132c83 100644 (file)
@@ -38,6 +38,7 @@ private:
        int num_threads;
        std::vector< bool, MyAlloc<bool> > explored_children;
        std::vector< bool, MyAlloc<bool> > backtrack;
+       int numBacktracks;
 };
 
 typedef std::list<class Node *, MyAlloc< class Node * > > node_list_t;