action: add clock vector field, destructor
[model-checker.git] / action.cc
1 #include <stdio.h>
2
3 #include "model.h"
4 #include "action.h"
5 #include "clockvector.h"
6
7 ModelAction::ModelAction(action_type_t type, memory_order order, void *loc, int value)
8 {
9         Thread *t = thread_current();
10         ModelAction *act = this;
11
12         act->type = type;
13         act->order = order;
14         act->location = loc;
15         act->tid = t->get_id();
16         act->value = value;
17         act->seq_number = model->get_next_seq_num();
18
19         cv = NULL;
20 }
21
22 ModelAction::~ModelAction()
23 {
24         if (cv)
25                 delete cv;
26 }
27
28 bool ModelAction::is_read()
29 {
30         return type == ATOMIC_READ;
31 }
32
33 bool ModelAction::is_write()
34 {
35         return type == ATOMIC_WRITE;
36 }
37
38 bool ModelAction::is_acquire()
39 {
40         switch (order) {
41         case memory_order_acquire:
42         case memory_order_acq_rel:
43         case memory_order_seq_cst:
44                 return true;
45         default:
46                 return false;
47         }
48 }
49
50 bool ModelAction::is_release()
51 {
52         switch (order) {
53         case memory_order_release:
54         case memory_order_acq_rel:
55         case memory_order_seq_cst:
56                 return true;
57         default:
58                 return false;
59         }
60 }
61
62 bool ModelAction::same_var(ModelAction *act)
63 {
64         return location == act->location;
65 }
66
67 bool ModelAction::same_thread(ModelAction *act)
68 {
69         return tid == act->tid;
70 }
71
72 bool ModelAction::is_dependent(ModelAction *act)
73 {
74         if (!is_read() && !is_write())
75                 return false;
76         if (!act->is_read() && !act->is_write())
77                 return false;
78         if (same_var(act) && !same_thread(act) &&
79                         (is_write() || act->is_write()))
80                 return true;
81         return false;
82 }
83
84 void ModelAction::print(void)
85 {
86         const char *type_str;
87         switch (this->type) {
88         case THREAD_CREATE:
89                 type_str = "thread create";
90                 break;
91         case THREAD_YIELD:
92                 type_str = "thread yield";
93                 break;
94         case THREAD_JOIN:
95                 type_str = "thread join";
96                 break;
97         case ATOMIC_READ:
98                 type_str = "atomic read";
99                 break;
100         case ATOMIC_WRITE:
101                 type_str = "atomic write";
102                 break;
103         default:
104                 type_str = "unknown type";
105         }
106
107         printf("(%4d) Thread: %d\tAction: %s\tMO: %d\tLoc: %14p\tValue: %d\n",
108                         seq_number, id_to_int(tid), type_str, order, location, value);
109 }