clockvector: fix 'happens_before', change name to 'synchronized_since'
[c11tester.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 /**
53  *
54  * @return true if this ClockVector's thread has synchronized with act's
55  * thread, false otherwise. That is, this function returns:
56  * <BR><CODE>act <= cv[act->tid]</CODE>
57  */
58 bool ClockVector::synchronized_since(ModelAction *act)
59 {
60         int i = id_to_int(act->get_tid());
61
62         if (i < num_threads)
63                 return act->get_seq_number() <= clock[i];
64         return false;
65 }
66
67 void ClockVector::print()
68 {
69         int i;
70         printf("CV: (");
71         for (i = 0; i < num_threads; i++)
72                 printf("%2d%s", clock[i], (i == num_threads - 1) ? ")\n" : ", ");
73 }