clockvector: add ClockVector class
[cdsspec-compiler.git] / clockvector.cc
1 #include <algorithm>
2 #include <cstring>
3
4 #include "model.h"
5 #include "action.h"
6 #include "clockvector.h"
7 #include "common.h"
8
9 ClockVector::ClockVector(ClockVector *parent, ModelAction *act)
10 {
11         num_threads = parent ? parent->num_threads : 1;
12         if (act && act->get_type() == THREAD_CREATE)
13                 num_threads++;
14         clock = (int *)myMalloc(num_threads * sizeof(int));
15         if (parent)
16                 std::memcpy(clock, parent->clock, parent->num_threads * sizeof(int));
17         else
18                 clock[0] = 0;
19
20         if (act)
21                 clock[id_to_int(act->get_tid())] = act->get_seq_number();
22 }
23
24 ClockVector::~ClockVector()
25 {
26         myFree(clock);
27 }
28
29 void ClockVector::merge(ClockVector *cv)
30 {
31         int *clk = clock;
32         bool resize = false;
33
34         ASSERT(cv != NULL);
35
36         if (cv->num_threads > num_threads) {
37                 resize = true;
38                 clk = (int *)myMalloc(cv->num_threads * sizeof(int));
39         }
40
41         /* Element-wise maximum */
42         for (int i = 0; i < num_threads; i++)
43                 clk[i] = std::max(clock[i], cv->clock[i]);
44
45         if (resize) {
46                 for (int i = num_threads; i < cv->num_threads; i++)
47                         clk[i] = cv->clock[i];
48                 num_threads = cv->num_threads;
49                 myFree(clock);
50         }
51         clock = clk;
52 }
53
54 bool ClockVector::happens_before(ModelAction *act, thread_id_t id)
55 {
56         int i = id_to_int(id);
57
58         if (i < num_threads)
59                 return act->get_seq_number() < clock[i];
60         return false;
61 }