X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=promise.cc;h=86c3c584f12ba884d190c792b10f459e225c8330;hb=dc9c89654982c64264dfee7b1ea23e9a5e88e18e;hp=e3b8d65e48d7c542bcf7e27da0473bb012a39057;hpb=3eb987279c382e0000de844728aceef2f360acf6;p=model-checker.git diff --git a/promise.cc b/promise.cc index e3b8d65..86c3c58 100644 --- a/promise.cc +++ b/promise.cc @@ -4,6 +4,23 @@ #include "promise.h" #include "model.h" #include "schedule.h" +#include "action.h" +#include "threads-model.h" + +/** + * @brief Promise constructor + * @param read The read which reads from a promised future value + * @param fv The future value that is promised + */ +Promise::Promise(ModelAction *read, struct future_value fv) : + num_available_threads(0), + fv(fv), + read(read), + write(NULL) +{ + add_thread(fv.tid); + eliminate_thread(read->get_tid()); +} /** * Eliminate a thread which no longer can satisfy this promise. Once all @@ -59,7 +76,7 @@ bool Promise::thread_is_available(thread_id_t tid) const /** @brief Print debug info about the Promise */ void Promise::print() const { - model_print("Promised value %#" PRIx64 ", read from thread %d, available threads to resolve: ", value, read->get_tid()); + model_print("Promised value %#" PRIx64 ", read from thread %d, available threads to resolve: ", fv.value, id_to_int(read->get_tid())); for (unsigned int i = 0; i < available_thread.size(); i++) if (available_thread[i]) model_print("[%d]", i); @@ -74,11 +91,27 @@ void Promise::print() const */ bool Promise::has_failed() const { - for (unsigned int i = 0; i < available_thread.size(); i++) { - thread_id_t tid = int_to_id(i); - if (thread_is_available(tid) && model->is_enabled(tid)) - return false; - } - ASSERT(num_available_threads == 0); - return true; + return num_available_threads == 0; +} + +/** + * @brief Check if an action's thread and location are compatible for resolving + * this promise + * @param act The action to check against + * @return True if we are compatible; false otherwise + */ +bool Promise::is_compatible(const ModelAction *act) const +{ + return thread_is_available(act->get_tid()) && read->same_var(act); +} + +/** + * @brief Check if an action's thread and location are compatible for resolving + * this promise, and that the promise is thread-exclusive + * @param act The action to check against + * @return True if we are compatible and exclusive; false otherwise + */ +bool Promise::is_compatible_exclusive(const ModelAction *act) const +{ + return get_num_available_threads() == 1 && is_compatible(act); }