#include <algorithm>
#include <cstring>
+#include <stdlib.h>
#include "model.h"
#include "action.h"
ClockVector::ClockVector(ClockVector *parent, ModelAction *act)
{
- num_threads = parent ? parent->num_threads : 1;
- if (act && act->get_type() == THREAD_CREATE)
- num_threads++;
- clock = (int *)myMalloc(num_threads * sizeof(int));
+ num_threads = model->get_num_threads();
+ clock = (int *)MYMALLOC(num_threads * sizeof(int));
+ memset(clock, 0, num_threads * sizeof(int));
if (parent)
std::memcpy(clock, parent->clock, parent->num_threads * sizeof(int));
- else
- clock[0] = 0;
if (act)
clock[id_to_int(act->get_tid())] = act->get_seq_number();
ClockVector::~ClockVector()
{
- myFree(clock);
+ MYFREE(clock);
}
void ClockVector::merge(ClockVector *cv)
if (cv->num_threads > num_threads) {
resize = true;
- clk = (int *)myMalloc(cv->num_threads * sizeof(int));
+ clk = (int *)MYMALLOC(cv->num_threads * sizeof(int));
}
/* Element-wise maximum */
for (int i = num_threads; i < cv->num_threads; i++)
clk[i] = cv->clock[i];
num_threads = cv->num_threads;
- myFree(clock);
+ MYFREE(clock);
}
clock = clk;
}
-bool ClockVector::happens_before(ModelAction *act, thread_id_t id)
+/**
+ *
+ * @return true if this ClockVector's thread has synchronized with act's
+ * thread, false otherwise. That is, this function returns:
+ * <BR><CODE>act <= cv[act->tid]</CODE>
+ */
+bool ClockVector::synchronized_since(ModelAction *act)
{
- int i = id_to_int(id);
+ int i = id_to_int(act->get_tid());
if (i < num_threads)
- return act->get_seq_number() < clock[i];
+ return act->get_seq_number() <= clock[i];
return false;
}
+
+void ClockVector::print()
+{
+ int i;
+ printf("CV: (");
+ for (i = 0; i < num_threads; i++)
+ printf("%2d%s", clock[i], (i == num_threads - 1) ? ")\n" : ", ");
+}