nodestack: bugfix - rewrite 'may-read-from' and 'future values' as the same set
[model-checker.git] / nodestack.h
index d2e6491b2edec5891943351e9891b358f2b05594..a857084ba1fe8676b0b2c5b8e57fc8a873a77bc0 100644 (file)
@@ -10,8 +10,8 @@
 #include <inttypes.h>
 
 #include "mymemory.h"
-#include "modeltypes.h"
 #include "schedule.h"
+#include "promise.h"
 
 class ModelAction;
 class Thread;
@@ -32,17 +32,18 @@ class Thread;
 
 typedef int promise_t;
 
-struct future_value {
-       uint64_t value;
-       modelclock_t expiration;
-};
-
 struct fairness_info {
        unsigned int enabled_count;
        unsigned int turns;
        bool priority;
 };
 
+typedef enum {
+       READ_FROM_PAST,
+       READ_FROM_FUTURE,
+       READ_FROM_NONE,
+} read_from_type_t;
+
 /**
  * @brief A single node in a NodeStack
  *
@@ -61,6 +62,7 @@ public:
        /* return true = backtrack set is empty */
        bool backtrack_empty() const;
 
+       void clear_backtracking();
        void explore_child(ModelAction *act, enabled_type_t *is_enabled);
        /* return false = thread was already in backtrack */
        bool set_backtrack(thread_id_t id);
@@ -76,17 +78,19 @@ public:
         * occurred previously in the stack. */
        Node * get_parent() const { return parent; }
 
-       bool add_future_value(const ModelAction *writer, modelclock_t expiration);
-       struct future_value get_future_value() const;
-       bool increment_future_value();
-       bool future_value_empty() const;
-
-       void add_read_from(const ModelAction *act);
-       const ModelAction * get_read_from() const;
+       read_from_type_t get_read_from_status();
        bool increment_read_from();
        bool read_from_empty() const;
-       int get_read_from_size() const;
-       const ModelAction * get_read_from_at(int i) const;
+       unsigned int read_from_size() const;
+
+       void print_read_from_past();
+       void add_read_from_past(const ModelAction *act);
+       const ModelAction * get_read_from_past() const;
+       const ModelAction * get_read_from_past(int i) const;
+       int get_read_from_past_size() const;
+
+       bool add_future_value(struct future_value fv);
+       struct future_value get_future_value() const;
 
        void set_promise(unsigned int i, bool is_rmw);
        bool get_promise(unsigned int i) const;
@@ -104,13 +108,18 @@ public:
        bool increment_relseq_break();
        bool relseq_break_empty() const;
 
-       void print();
-       void print_may_read_from();
+       void print() const;
 
        MEMALLOC
 private:
        void explore(thread_id_t tid);
 
+       bool read_from_past_empty() const;
+       bool increment_read_from_past();
+       bool future_value_empty() const;
+       bool increment_future_value();
+       read_from_type_t read_from_status;
+
        ModelAction * const action;
        Node * const parent;
        const int num_threads;
@@ -120,11 +129,12 @@ private:
        int numBacktracks;
        enabled_type_t *enabled_array;
 
-       /** 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 *, ModelAlloc< const ModelAction * > > may_read_from;
-
-       unsigned int read_from_index;
+       /**
+        * The set of past ModelActions that this the action at this Node may
+        * read from. Only meaningful if this Node represents a 'read' action.
+        */
+       std::vector< const ModelAction *, ModelAlloc< const ModelAction * > > read_from_past;
+       unsigned int read_from_past_idx;
 
        std::vector< struct future_value, ModelAlloc<struct future_value> > future_values;
        std::vector< promise_t, ModelAlloc<promise_t> > promises;