Merge branch 'fences'
authorBrian Norris <banorris@uci.edu>
Tue, 12 Feb 2013 19:48:41 +0000 (11:48 -0800)
committerBrian Norris <banorris@uci.edu>
Tue, 12 Feb 2013 19:48:41 +0000 (11:48 -0800)
1  2 
action.cc

diff --combined action.cc
index 72ca472657e79f370773aae58c414fe645b0890d,6a545d82a0badac66c25eb58cd124de6d8f892f0..d5eb581a23d4e7ec5b7ffe3aefeff54fb263ae94
+++ b/action.cc
@@@ -31,7 -31,6 +31,7 @@@ ModelAction::ModelAction(action_type_t 
        location(loc),
        value(value),
        reads_from(NULL),
 +      reads_from_promise(NULL),
        last_fence_release(NULL),
        node(NULL),
        seq_number(ACTION_INITIAL_CLOCK),
@@@ -299,15 -298,13 +299,13 @@@ bool ModelAction::could_synchronize_wit
        if (!same_var(act))
                return false;
  
-       // Explore interleavings of seqcst writes/fences to guarantee total
+       // Explore interleavings of seqcst writes to guarantee total
        // order of seq_cst operations that don't commute
-       if ((could_be_write() || act->could_be_write() || is_fence() || act->is_fence())
-                       && is_seqcst() && act->is_seqcst())
+       if ((could_be_write() || act->could_be_write()) && is_seqcst() && act->is_seqcst())
                return true;
  
-       // Explore synchronizing read/write/fence pairs
-       if (is_acquire() && act->is_release() && (is_read() || is_fence()) &&
-                       (act->could_be_write() || act->is_fence()))
+       // Explore synchronizing read/write pairs
+       if (is_acquire() && act->is_release() && is_read() && act->could_be_write())
                return true;
  
        // lock just released...we can grab lock
@@@ -394,22 -391,10 +392,22 @@@ Node * ModelAction::get_node() cons
  void ModelAction::set_read_from(const ModelAction *act)
  {
        reads_from = act;
 +      reads_from_promise = NULL;
        if (act && act->is_uninitialized())
                model->assert_bug("May read from uninitialized atomic\n");
  }
  
 +/**
 + * Set this action's read-from promise
 + * @param promise The promise to read from
 + */
 +void ModelAction::set_read_from_promise(const Promise *promise)
 +{
 +      ASSERT(is_read());
 +      reads_from_promise = promise;
 +      reads_from = NULL;
 +}
 +
  /**
   * Synchronize the current thread with the thread corresponding to the
   * ModelAction parameter.
@@@ -511,10 -496,8 +509,10 @@@ void ModelAction::print() cons
        }
  
        uint64_t valuetoprint;
 -      if (type == ATOMIC_READ && reads_from != NULL)
 +      if (is_read() && reads_from)
                valuetoprint = reads_from->value;
 +      else if (is_read() && reads_from_promise)
 +              valuetoprint = reads_from_promise->get_value();
        else
                valuetoprint = value;
  
                model_print("\n");
  }
  
 -/** @brief Print nicely-formatted info about this ModelAction */
 +/** @brief Get a (likely) unique hash for this ModelAction */
  unsigned int ModelAction::hash() const
  {
        unsigned int hash = (unsigned int)this->type;