X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=model.h;h=62c762711bcb8300765483ee075ec9747d412d5f;hb=12b1a10eeff58161619bafcfd8e288b3e2c76621;hp=fa1bb6fca29b9ee9b8d4f6c18acb7791c75b6ad7;hpb=6a0e918d9c3b534d025afdaeac5d931d0a6f323e;p=model-checker.git diff --git a/model.h b/model.h index fa1bb6f..62c7627 100644 --- a/model.h +++ b/model.h @@ -10,22 +10,22 @@ #include #include -#include "schedule.h" #include "mymemory.h" -#include "libthreads.h" -#include "threads.h" #include "action.h" -#include "clockvector.h" #include "hashtable.h" #include "workqueue.h" +#include "config.h" +#include "modeltypes.h" /* Forward declaration */ class NodeStack; class CycleGraph; class Promise; +class Scheduler; +class Thread; /** @brief Shorthand for a list of release sequence heads */ -typedef std::vector< const ModelAction *, MyAlloc > rel_heads_list_t; +typedef std::vector< const ModelAction *, ModelAlloc > rel_heads_list_t; /** * Model checker parameter structure. Holds run-time configuration options for @@ -66,18 +66,18 @@ public: /** Prints an execution summary with trace information. */ void print_summary(); +#if SUPPORT_MOD_ORDER_DUMP + void dumpGraph(char *filename); +#endif void add_thread(Thread *t); void remove_thread(Thread *t); - Thread * get_thread(thread_id_t tid) { return thread_map->get(id_to_int(tid)); } - Thread * get_thread(ModelAction *act) { return get_thread(act->get_tid()); } + Thread * get_thread(thread_id_t tid); + Thread * get_thread(ModelAction *act); thread_id_t get_next_id(); int get_num_threads(); - modelclock_t get_next_seq_num(); - - /** @return The currently executing Thread. */ - Thread * get_current_thread() { return scheduler->get_current_thread(); } + Thread * get_current_thread(); int switch_to_master(ModelAction *act); ClockVector * get_cv(thread_id_t tid); @@ -91,6 +91,11 @@ public: void finish_execution(); bool isfeasibleprefix(); void set_assert() {asserted=true;} + + /** @brief Alert the model-checker that an incorrectly-ordered + * synchronization was made */ + void set_bad_synchronization() { bad_synchronization = true; } + const model_params params; MEMALLOC @@ -105,6 +110,8 @@ private: int num_feasible_executions; bool promises_expired(); + modelclock_t get_next_seq_num(); + /** * Stores the ModelAction for the current thread action. Call this * immediately before switching from user- to system-context to pass @@ -122,7 +129,7 @@ private: bool take_step(); - void check_recency(ModelAction *curr); + void check_recency(ModelAction *curr, const ModelAction *rf); ModelAction * get_last_conflict(ModelAction *act); void set_backtracking(ModelAction *act); Thread * get_next_thread(ModelAction *curr); @@ -146,6 +153,7 @@ private: void do_complete_join(ModelAction *join); ModelAction *diverge; + ModelAction *earliest_diverge; ucontext_t system_context; action_list_t *action_trace; @@ -196,6 +204,8 @@ private: bool failed_promise; bool too_many_reads; bool asserted; + /** @brief Incorrectly-ordered synchronization was made */ + bool bad_synchronization; }; extern ModelChecker *model;