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