X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=action.cc;h=2390ecc7bd39f115380172075d14cd9e1c56cbe8;hb=3f77119600ac3aa246258dec2776056d09f8e4e0;hp=acecd5a6e20f6b512cef0d9e136db4422d8078d8;hpb=87d6ae25425840ccad0ef6edef6e279967e83be6;p=model-checker.git diff --git a/action.cc b/action.cc index acecd5a..2390ecc 100644 --- a/action.cc +++ b/action.cc @@ -31,6 +31,7 @@ ModelAction::ModelAction(action_type_t type, memory_order order, void *loc, location(loc), value(value), reads_from(NULL), + reads_from_promise(NULL), last_fence_release(NULL), node(NULL), seq_number(ACTION_INITIAL_CLOCK), @@ -252,10 +253,11 @@ void ModelAction::copy_typeandorder(ModelAction * act) */ Thread * ModelAction::get_thread_operand() const { - if (type == THREAD_CREATE) - /* THREAD_CREATE uses (Thread *) for location */ - return (Thread *)get_location(); - else if (type == THREAD_JOIN) + if (type == THREAD_CREATE) { + /* THREAD_CREATE stores its (Thread *) in a thrd_t::priv */ + thrd_t *thrd = (thrd_t *)get_location(); + return thrd->priv; + } else if (type == THREAD_JOIN) /* THREAD_JOIN uses (Thread *) for location */ return (Thread *)get_location(); else @@ -300,13 +302,11 @@ bool ModelAction::could_synchronize_with(const ModelAction *act) const // Explore interleavings of seqcst writes/fences 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_fence() || act->is_fence()) && 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 @@ -393,10 +393,22 @@ Node * ModelAction::get_node() const 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. @@ -498,8 +510,10 @@ void ModelAction::print() const } 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; @@ -542,7 +556,7 @@ void ModelAction::print() const 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;