ec90a5a4826a06d42a7cb3cff1599ec621a99c25
[c11tester.git] / history.cc
1 #include <inttypes.h>
2 #include "history.h"
3 #include "action.h"
4 #include "funcnode.h"
5
6 /** @brief Constructor */
7 ModelHistory::ModelHistory() :
8         func_counter(0), /* function id starts with 0 */
9         func_map(),
10         func_atomics(),
11         work_list(2)    /* we have at least two threads */
12 {}
13
14 void ModelHistory::enter_function(const uint32_t func_id, thread_id_t tid)
15 {
16         uint32_t id = id_to_int(tid);
17         if ( work_list.size() <= id )
18                 work_list.resize( id + 1 );
19
20         func_id_list_t * func_list = work_list[id];
21         if (func_list == NULL) {
22                 func_list = new func_id_list_t();
23                 work_list[id] = func_list;
24         }
25
26         func_list->push_back(func_id);
27 }
28
29 void ModelHistory::exit_function(const uint32_t func_id, thread_id_t tid)
30 {
31         func_id_list_t * func_list = work_list[ id_to_int(tid) ];
32         uint32_t last_func_id = func_list->back();
33
34         if (last_func_id == func_id) {
35                 func_list->pop_back();
36         } else {
37                 model_print("trying to exit with a wrong function id\n");
38                 model_print("--- last_func: %d, func_id: %d\n", last_func_id, func_id);
39         }
40 }
41
42 void ModelHistory::add_func_atomic(ModelAction *act, thread_id_t tid) {
43         /* return if thread i has not entered any function or has exited
44            from all functions */
45         uint32_t id = id_to_int(tid);
46         if ( work_list.size() <= id )
47                 return;
48         else if (work_list[id] == NULL)
49                 return;
50
51         /* get the function id that thread i is currently in */
52         func_id_list_t * func_list = work_list[id];
53         uint32_t func_id = func_list->back();
54
55         if ( func_atomics.size() <= func_id )
56                 func_atomics.resize( func_id + 1 );
57
58         FuncNode * func_node = func_atomics[func_id];
59         if (func_node == NULL) {
60                 func_node = new FuncNode();
61                 func_atomics[func_id] = func_node;
62         }
63
64         func_node->add_action(act);
65 }
66
67 void ModelHistory::print() {
68         for (uint32_t i = 0; i < func_atomics.size(); i++ ) {
69                 FuncNode * funcNode = func_atomics[i];
70                 func_inst_list_t * inst_list = funcNode->get_inst_list();
71
72                 if (funcNode == NULL)
73                         continue;
74
75                 model_print("function with id: %d has following actions\n", i);
76                 func_inst_list_t::iterator it;
77                 for (it = inst_list->begin(); it != inst_list->end(); it++) {
78                         FuncInst *inst = *it;
79                         model_print("type: %d, at: %s\n", inst->get_type(), inst->get_position());
80                 }
81         }
82 }