5 #include "clockvector.h"
8 ModelAction::ModelAction(action_type_t type, memory_order order, void *loc, int value)
10 Thread *t = thread_current();
11 ModelAction *act = this;
16 act->tid = t->get_id();
18 act->seq_number = model->get_next_seq_num();
23 ModelAction::~ModelAction()
29 bool ModelAction::is_read()
31 return type == ATOMIC_READ;
34 bool ModelAction::is_write()
36 return type == ATOMIC_WRITE;
39 bool ModelAction::is_acquire()
42 case memory_order_acquire:
43 case memory_order_acq_rel:
44 case memory_order_seq_cst:
51 bool ModelAction::is_release()
54 case memory_order_release:
55 case memory_order_acq_rel:
56 case memory_order_seq_cst:
63 bool ModelAction::same_var(ModelAction *act)
65 return location == act->location;
68 bool ModelAction::same_thread(ModelAction *act)
70 return tid == act->tid;
73 bool ModelAction::is_dependent(ModelAction *act)
75 if (!is_read() && !is_write())
77 if (!act->is_read() && !act->is_write())
79 if (same_var(act) && !same_thread(act) &&
80 (is_write() || act->is_write()))
85 void ModelAction::create_cv(ModelAction *parent)
89 cv = new ClockVector(parent->cv, this);
91 cv = new ClockVector();
94 void ModelAction::read_from(ModelAction *act)
97 if (act->is_release() && this->is_acquire())
102 void ModelAction::print(void)
104 const char *type_str;
105 switch (this->type) {
107 type_str = "thread create";
110 type_str = "thread yield";
113 type_str = "thread join";
116 type_str = "atomic read";
119 type_str = "atomic write";
122 type_str = "unknown type";
125 printf("(%3d) Thread: %-2d Action: %-13s MO: %d Loc: %14p Value: %d",
126 seq_number, id_to_int(tid), type_str, order, location, value);