From 8587e516d89ec5d8da43fc28b7d89fc4d65e343e Mon Sep 17 00:00:00 2001
From: Brian Norris <banorris@uci.edu>
Date: Thu, 21 Jun 2012 00:54:01 -0700
Subject: [PATCH] nodestack: add 'may_read_from' set

Each Node (at least, each Node that is a 'read') will be associated with a
may_read_from set - the set of all possible ModelActions to read from. For now,
this interface handles only actions that exist in the past. It won't properly
retain information from future actions.
---
 nodestack.cc | 12 +++++++++++-
 nodestack.h  |  9 +++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/nodestack.cc b/nodestack.cc
index 65afd7c..87b3ee5 100644
--- a/nodestack.cc
+++ b/nodestack.cc
@@ -9,7 +9,8 @@ Node::Node(ModelAction *act, int nthreads)
 	num_threads(nthreads),
 	explored_children(num_threads),
 	backtrack(num_threads),
-	numBacktracks(0)
+	numBacktracks(0),
+	may_read_from()
 {
 }
 
@@ -99,6 +100,15 @@ bool Node::is_enabled(Thread *t)
 	return id_to_int(t->get_id()) < num_threads;
 }
 
+/**
+ * Add an action to the may_read_from set.
+ * @param act is the action to add
+ */
+void Node::add_read_from(ModelAction *act)
+{
+	may_read_from.insert(act);
+}
+
 void Node::explore(thread_id_t tid)
 {
 	int i = id_to_int(tid);
diff --git a/nodestack.h b/nodestack.h
index a73ce44..74ac245 100644
--- a/nodestack.h
+++ b/nodestack.h
@@ -7,12 +7,15 @@
 
 #include <list>
 #include <vector>
+#include <set>
 #include <cstddef>
 #include "threads.h"
 #include "mymemory.h"
 
 class ModelAction;
 
+typedef std::set< ModelAction *, std::less< ModelAction *>, MyAlloc< ModelAction * > > action_set_t;
+
 class Node {
 public:
 	Node(ModelAction *act = NULL, int nthreads = 1);
@@ -28,6 +31,8 @@ public:
 	bool is_enabled(Thread *t);
 	ModelAction * get_action() { return action; }
 
+	void add_read_from(ModelAction *act);
+
 	void print();
 
 	MEMALLOC
@@ -39,6 +44,10 @@ private:
 	std::vector< bool, MyAlloc<bool> > explored_children;
 	std::vector< bool, MyAlloc<bool> > backtrack;
 	int numBacktracks;
+
+	/** The set of ModelActions that this the action at this Node may read
+	 *  from. Only meaningful if this Node represents a 'read' action. */
+	action_set_t may_read_from;
 };
 
 typedef std::list<class Node *, MyAlloc< class Node * > > node_list_t;
-- 
2.34.1