X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=model.cc;h=c0cc93eb0a80523eefc48f2fe7ec3c8119d8619c;hb=075d78a2e09fd11b8b78b6c7b3852a42a279c4f2;hp=e11dcf716939e1a13f1dd08f6b252ab60fef1b9b;hpb=5d87d23f622d396fd2e1c94d61f901429c5f35ac;p=model-checker.git diff --git a/model.cc b/model.cc index e11dcf7..c0cc93e 100644 --- a/model.cc +++ b/model.cc @@ -12,7 +12,7 @@ #include "promise.h" #include "datarace.h" #include "mutex.h" -#include "threads.h" +#include "threads-model.h" #define INITIAL_THREAD_ID 0 @@ -260,7 +260,8 @@ bool ModelChecker::next_execution() DEBUG("Number of acquires waiting on pending release sequences: %zu\n", pending_rel_seqs->size()); - if (isfinalfeasible() || DBG_ENABLED()) + + if (isfinalfeasible() || (params.bound != 0 && priv->used_sequence_numbers > params.bound ) || DBG_ENABLED() ) print_summary(); if ((diverge = get_next_backtrack()) == NULL) @@ -1779,6 +1780,11 @@ void ModelChecker::mo_check_promises(thread_id_t tid, const ModelAction *write) //do we have a pwrite for the promise, if not, set it if (promise->get_write() == NULL ) { promise->set_write(write); + //The pwrite cannot happen before the promise + if (write->happens_before(act) && (write != act)) { + failed_promise = true; + return; + } } if (mo_graph->checkPromise(write, promise)) { failed_promise = true; @@ -1868,7 +1874,7 @@ void ModelChecker::build_reads_from_past(ModelAction *curr) curr->print(); } - if (curr->get_sleep_flag()) { + if (curr->get_sleep_flag() && ! curr->is_seqcst()) { if (sleep_can_read_from(curr, act)) curr->get_node()->add_read_from(act); } else @@ -2068,6 +2074,12 @@ bool ModelChecker::take_step() { if (!isfeasible()) return false; + if (params.bound != 0) { + if (priv->used_sequence_numbers > params.bound) { + return false; + } + } + DEBUG("(%d, %d)\n", curr ? id_to_int(curr->get_id()) : -1, next ? id_to_int(next->get_id()) : -1);