X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=nodestack.h;h=b440b11d58e3242b359a45be8fdac52267c99726;hb=620c53f1b91d3f9b51424ff57c652d247f6fbaac;hp=cf3c6db146675c0cb7f41d994f988925209fc976;hpb=9397658596cfa29f81242b5f06e80d1d9cdf6d14;p=c11tester.git
diff --git a/nodestack.h b/nodestack.h
index cf3c6db1..b440b11d 100644
--- a/nodestack.h
+++ b/nodestack.h
@@ -1,3 +1,7 @@
+/** @file nodestack.h
+ * @brief Stack of operations for use in backtracking.
+*/
+
#ifndef __NODESTACK_H__
#define __NODESTACK_H__
@@ -9,14 +13,37 @@
class ModelAction;
+/**
+ * A flag used for the promise counting/combination problem within a node,
+ * denoting whether a particular Promise is
+ *
- @b applicable: can be satisfied by this Node's ModelAction and
+ * - @b fulfilled: satisfied by this Node's ModelAction under the current
+ * configuration.
+ */
+typedef enum {
+ PROMISE_IGNORE = 0, /**< This promise is inapplicable; ignore it */
+ PROMISE_UNFULFILLED, /**< This promise is applicable but unfulfilled */
+ PROMISE_FULFILLED /**< This promise is applicable and fulfilled */
+} promise_t;
+
+/**
+ * @brief A single node in a NodeStack
+ *
+ * Represents a single node in the NodeStack. Each Node is associated with up
+ * to one action and up to one parent node. A node holds information
+ * regarding the last action performed (the "associated action"), the thread
+ * choices that have been explored (explored_children) and should be explored
+ * (backtrack), and the actions that the last action may read from.
+ */
class Node {
public:
- Node(ModelAction *act = NULL, int nthreads = 1);
+ Node(ModelAction *act = NULL, Node *par = NULL, int nthreads = 1);
~Node();
/* return true = thread choice has already been explored */
bool has_been_explored(thread_id_t tid);
/* return true = backtrack set is empty */
bool backtrack_empty();
+
void explore_child(ModelAction *act);
/* return false = thread was already in backtrack */
bool set_backtrack(thread_id_t id);
@@ -24,23 +51,60 @@ public:
bool is_enabled(Thread *t);
ModelAction * get_action() { return action; }
- void print();
+ /** @return the parent Node to this Node; that is, the action that
+ * occurred previously in the stack. */
+ Node * get_parent() const { return parent; }
+
+ bool add_future_value(uint64_t value);
+ uint64_t get_future_value();
+ bool increment_future_value();
+ bool future_value_empty();
+
+ void add_read_from(const ModelAction *act);
+ const ModelAction * get_read_from();
+ bool increment_read_from();
+ bool read_from_empty();
- static int get_total_nodes() { return total_nodes; }
+ void set_promise(unsigned int i);
+ bool get_promise(unsigned int i);
+ bool increment_promise();
+ bool promise_empty();
+
+ void print();
+ void print_may_read_from();
MEMALLOC
private:
void explore(thread_id_t tid);
- static int total_nodes;
ModelAction *action;
+ Node *parent;
int num_threads;
std::vector< bool, MyAlloc > explored_children;
std::vector< bool, MyAlloc > 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. */
+ std::vector< const ModelAction *, MyAlloc< const ModelAction * > > may_read_from;
+
+ unsigned int read_from_index;
+
+ std::vector< uint64_t, MyAlloc< uint64_t > > future_values;
+ std::vector< promise_t, MyAlloc > promises;
+ unsigned int future_index;
};
-typedef std::list > node_list_t;
+typedef std::list< Node *, MyAlloc< Node * > > node_list_t;
+/**
+ * @brief A stack of nodes
+ *
+ * Holds a Node linked-list that can be used for holding backtracking,
+ * may-read-from, and replay information. It is used primarily as a
+ * stack-like structure, in that backtracking points and replay nodes are
+ * only removed from the top (most recent).
+ */
class NodeStack {
public:
NodeStack();
@@ -49,6 +113,8 @@ public:
Node * get_head();
Node * get_next();
void reset_execution();
+ void pop_restofstack(int numAhead);
+ int get_total_nodes() { return total_nodes; }
void print();
@@ -56,6 +122,8 @@ public:
private:
node_list_t node_list;
node_list_t::iterator iter;
+
+ int total_nodes;
};
#endif /* __NODESTACK_H__ */