X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=model.h;h=74cb4e1f29aaf2c649fce027fc9dd10c714eb562;hb=2d0d4ac38e05905a6633b3f2d5112ccadd45c27f;hp=97e9849f0bbb441c5af72999e3453bc9adbe5745;hpb=9e9096d119abfeed4753a5944b31916ae559e22e;p=model-checker.git diff --git a/model.h b/model.h index 97e9849..74cb4e1 100644 --- a/model.h +++ b/model.h @@ -1,98 +1,111 @@ /** @file model.h - * @brief Core model checker. + * @brief Core model checker. */ #ifndef __MODEL_H__ #define __MODEL_H__ -#include -#include -#include #include -#include +#include -#include "schedule.h" #include "mymemory.h" -#include -#include "libthreads.h" -#include "libatomic.h" -#include "threads.h" -#include "action.h" -#include "clockvector.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(); - /** The scheduler to use: tracks the running/ready Threads */ - Scheduler *scheduler; - - /** Stores the context for the main model-checking system thread (call - * once) - * @param ctxt The system context structure - */ - void set_system_context(ucontext_t *ctxt) { system_context = ctxt; } + void run(); /** @returns the context for the main model-checking system thread */ - ucontext_t * get_system_context(void) { return system_context; } + ucontext_t * get_system_context() { return &system_context; } - void check_current_action(void); - void print_summary(void); - Thread * schedule_next_thread(); + ModelExecution * get_execution() const { return execution; } - int add_thread(Thread *t); - void remove_thread(Thread *t); - Thread * get_thread(thread_id_t tid) { return (*thread_map)[id_to_int(tid)]; } + int get_execution_number() const { return execution_number; } - thread_id_t get_next_id(); - int get_num_threads(); - modelclock_t get_next_seq_num(); + Thread * get_thread(thread_id_t tid) const; + Thread * get_thread(const ModelAction *act) const; - int switch_to_master(ModelAction *act); - ClockVector * get_cv(thread_id_t tid); - bool next_execution(); + 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 next_thread_id; - modelclock_t used_sequence_numbers; - int num_executions; - - /** - * Stores the ModelAction for the current thread action. Call this - * immediately before switching from user- to system-context to pass - * data between them. - * @param act The ModelAction created by the user-thread action - */ - void set_current_action(ModelAction *act) { current_action = act; } - - ModelAction * get_last_conflict(ModelAction *act); - void set_backtracking(ModelAction *act); - thread_id_t get_next_replay_thread(); - ModelAction * get_next_backtrack(); + /** 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(); - void add_action_to_lists(ModelAction *act); - ModelAction * get_last_action(thread_id_t tid); - ModelAction * get_parent_action(thread_id_t tid); - void build_reads_from_past(ModelAction *curr); - ModelAction *current_action; ModelAction *diverge; - thread_id_t nextThread; - - ucontext_t *system_context; - action_list_t *action_trace; - std::map *thread_map; - std::map > *obj_thrd_map; - std::vector *thrd_last_action; - NodeStack *node_stack; - ModelAction *next_backtrack; + 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;