split header out to action.h
[c11tester.git] / model.h
1 #ifndef __MODEL_H__
2 #define __MODEL_H__
3
4 #include <list>
5 #include <map>
6 #include <cstddef>
7 #include <ucontext.h>
8
9 #include "schedule.h"
10 #include "libthreads.h"
11 #include "libatomic.h"
12 #include "threads.h"
13 #include "action.h"
14
15 /* Forward declaration */
16 class TreeNode;
17
18 class Backtrack {
19 public:
20         Backtrack(ModelAction *d, action_list_t *t) {
21                 diverge = d;
22                 actionTrace = t;
23                 iter = actionTrace->begin();
24         }
25         ModelAction * get_diverge() { return diverge; }
26         action_list_t * get_trace() { return actionTrace; }
27         void advance_state() { iter++; }
28         ModelAction * get_state() {
29                 return iter == actionTrace->end() ? NULL : *iter;
30         }
31 private:
32         ModelAction *diverge;
33         action_list_t *actionTrace;
34         /* points to position in actionTrace as we replay */
35         action_list_t::iterator iter;
36 };
37
38 class ModelChecker {
39 public:
40         ModelChecker();
41         ~ModelChecker();
42         class Scheduler *scheduler;
43
44         void set_system_context(ucontext_t *ctxt) { system_context = ctxt; }
45         ucontext_t * get_system_context(void) { return system_context; }
46
47         void set_current_action(ModelAction *act) { current_action = act; }
48         void check_current_action(void);
49         void print_summary(void);
50         Thread * schedule_next_thread();
51
52         int add_thread(Thread *t);
53         void remove_thread(Thread *t);
54         Thread * get_thread(thread_id_t tid) { return thread_map[tid]; }
55
56         int get_next_id();
57
58         int switch_to_master(ModelAction *act);
59
60         bool next_execution();
61 private:
62         int used_thread_id;
63         int num_executions;
64
65         ModelAction * get_last_conflict(ModelAction *act);
66         void set_backtracking(ModelAction *act);
67         thread_id_t advance_backtracking_state();
68         thread_id_t get_next_replay_thread();
69         Backtrack * get_next_backtrack();
70         void reset_to_initial_state();
71
72         class ModelAction *current_action;
73         Backtrack *exploring;
74         thread_id_t nextThread;
75
76         ucontext_t *system_context;
77         action_list_t *action_trace;
78         std::map<thread_id_t, class Thread *> thread_map;
79         class TreeNode *rootNode, *currentNode;
80         std::list<class Backtrack *> backtrack_list;
81 };
82
83 extern ModelChecker *model;
84
85 #endif /* __MODEL_H__ */