X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=model.h;h=74cb4e1f29aaf2c649fce027fc9dd10c714eb562;hb=278ff43e5570a6cd8a42aa03070c5b59d079a999;hp=31e88fe53a264a8d6c821941383d4cd9695b9884;hpb=dcd84cc88d70497bdc173c4bb78ce30afe4fb5c5;p=model-checker.git diff --git a/model.h b/model.h index 31e88fe..74cb4e1 100644 --- a/model.h +++ b/model.h @@ -1,18 +1,111 @@ +/** @file model.h + * @brief Core model checker. + */ + #ifndef __MODEL_H__ #define __MODEL_H__ +#include +#include + +#include "mymemory.h" +#include "hashtable.h" +#include "config.h" +#include "modeltypes.h" +#include "stl-model.h" +#include "context.h" +#include "params.h" + +/* Forward declaration */ +class Node; +class NodeStack; +class CycleGraph; +class Promise; +class Scheduler; +class Thread; +class ClockVector; +class TraceAnalysis; +class ModelExecution; +class ModelAction; + +typedef SnapList action_list_t; + +/** @brief Model checker execution stats */ +struct execution_stats { + int num_total; /**< @brief Total number of executions */ + int num_infeasible; /**< @brief Number of infeasible executions */ + int num_buggy_executions; /** @brief Number of buggy executions */ + int num_complete; /**< @brief Number of feasible, non-buggy, complete executions */ + int num_redundant; /**< @brief Number of redundant, aborted executions */ +}; + +/** @brief The central structure for model-checking */ class ModelChecker { public: - ModelChecker(); + ModelChecker(struct model_params params); ~ModelChecker(); - struct scheduler *scheduler; - struct thread *system_thread; - void add_system_thread(struct thread *t); - void assign_id(struct thread *t); + void run(); + + /** @returns the context for the main model-checking system thread */ + ucontext_t * get_system_context() { return &system_context; } + + ModelExecution * get_execution() const { return execution; } + + int get_execution_number() const { return execution_number; } + + Thread * get_thread(thread_id_t tid) const; + Thread * get_thread(const ModelAction *act) const; + + Thread * get_current_thread() const; + + void switch_from_master(Thread *thread); + uint64_t switch_to_master(ModelAction *act); + bool assert_bug(const char *msg, ...); + void assert_user_bug(const char *msg); + + const model_params params; + void add_trace_analysis(TraceAnalysis *a) { + trace_analyses.push_back(a); + } + + MEMALLOC private: - int used_thread_id; + /** The scheduler to use: tracks the running/ready Threads */ + Scheduler * const scheduler; + NodeStack * const node_stack; + ModelExecution *execution; + + int execution_number; + + unsigned int get_num_threads() const; + + void execute_sleep_set(); + + bool next_execution(); + bool should_terminate_execution(); + + Thread * get_next_thread(); + void reset_to_initial_state(); + + + ModelAction *diverge; + ModelAction *earliest_diverge; + + ucontext_t system_context; + + ModelVector trace_analyses; + + /** @brief The cumulative execution stats */ + struct execution_stats stats; + void record_stats(); + void run_trace_analyses(); + void print_bugs() const; + void print_execution(bool printbugs) const; + void print_stats() const; + + friend void user_main_wrapper(); }; extern ModelChecker *model;