+/** @file datarace.h
+ * @brief Data race detection code.
+ */
+
#ifndef DATARACE_H
#include "config.h"
#include <stdint.h>
#include "clockvector.h"
+#include <vector>
struct ShadowTable {
void * array[65536];
uint64_t array[65536];
};
+struct DataRace {
+ /* Clock and thread associated with first action. This won't change in
+ response to synchronization. */
+
+ thread_id_t oldthread;
+ modelclock_t oldclock;
+ /* Record whether this is a write, so we can tell the user. */
+ bool isoldwrite;
+
+ /* Model action associated with second action. This could change as
+ a result of synchronization. */
+ ModelAction *newaction;
+ /* Record whether this is a write, so we can tell the user. */
+ bool isnewwrite;
+
+ /* Address of data race. */
+ void *address;
+};
+
#define MASK16BIT 0xffff
void initRaceDetector();
void raceCheckWrite(thread_id_t thread, void *location, ClockVector *currClock);
void raceCheckRead(thread_id_t thread, void *location, ClockVector *currClock);
+bool checkDataRaces();
+void printRace(struct DataRace *race);
+extern std::vector<struct DataRace *> unrealizedraces;
-
-/** Encoding idea:
+/** Basic encoding idea:
* (void *) Either:
* (1) points to a full record or
*
* next 23 bits are write clock vector. */
struct RaceRecord {
- int *readClock;
+ modelclock_t *readClock;
thread_id_t *thread;
int capacity;
int numReads;
thread_id_t writeThread;
- int writeClock;
+ modelclock_t writeClock;
};
#define INITCAPACITY 4