X-Git-Url: http://plrg.eecs.uci.edu/git/?p=model-checker.git;a=blobdiff_plain;f=model.h;h=23c42ebb199a6ce30b5859b80ca8d5537038d0a3;hp=fa1bb6fca29b9ee9b8d4f6c18acb7791c75b6ad7;hb=081ec029e06a68012f1a3fd119671148bfac9605;hpb=6a0e918d9c3b534d025afdaeac5d931d0a6f323e diff --git a/model.h b/model.h index fa1bb6f..23c42eb 100644 --- a/model.h +++ b/model.h @@ -10,7 +10,6 @@ #include #include -#include "schedule.h" #include "mymemory.h" #include "libthreads.h" #include "threads.h" @@ -18,14 +17,16 @@ #include "clockvector.h" #include "hashtable.h" #include "workqueue.h" +#include "config.h" /* Forward declaration */ class NodeStack; class CycleGraph; class Promise; +class Scheduler; /** @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 +67,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 +92,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 +111,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 +130,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 +154,7 @@ private: void do_complete_join(ModelAction *join); ModelAction *diverge; + ModelAction *earliest_diverge; ucontext_t system_context; action_list_t *action_trace; @@ -196,6 +205,8 @@ private: bool failed_promise; bool too_many_reads; bool asserted; + /** @brief Incorrectly-ordered synchronization was made */ + bool bad_synchronization; }; extern ModelChecker *model;