datarace: simplify raceCheck{Read,Write}() function interfaces
[c11tester.git] / datarace.h
index ef1ef8ca4a256eeaede006d24c7c806fa5844103..78903d336832bb7439d4a8ab61799dd48f2ceed5 100644 (file)
@@ -1,7 +1,16 @@
+/** @file datarace.h
+ *  @brief Data race detection code.
+ */
+
 #ifndef DATARACE_H
 #include "config.h"
 #include <stdint.h>
-#include "clockvector.h"
+#include "modeltypes.h"
+#include "stl-model.h"
+
+/* Forward declaration */
+class ClockVector;
+class ModelAction;
 
 struct ShadowTable {
        void * array[65536];
@@ -11,23 +20,38 @@ struct ShadowBaseTable {
        uint64_t array[65536];
 };
 
-#define MASK16BIT 0xffff
+struct DataRace {
+       /* Clock and thread associated with first action.  This won't change in
+                response to synchronization. */
 
-void initRaceDetector();
-void raceCheckWrite(thread_id_t thread, void *location, ClockVector *currClock);
-void raceCheckRead(thread_id_t thread, void *location, ClockVector *currClock);
+       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. */
+       const void *address;
+};
+
+#define MASK16BIT 0xffff
+
+void initRaceDetector();
+void raceCheckWrite(thread_id_t thread, void *location);
+void raceCheckRead(thread_id_t thread, const void *location);
+bool checkDataRaces();
+void assert_race(struct DataRace *race);
 
-/** Encoding idea:
- *      (void *) Either:
- *      (1) points to a full record or
- *
- * (2) encodes the information in a 64 bit word.  Encoding is as
- * follows: lowest bit set to 1, next 8 bits are read thread id, next
- * 23 bits are read clock vector, next 8 bites are write thread id,
- * next 23 bits are write clock vector.  */
+extern SnapVector<struct DataRace *> unrealizedraces;
 
+/**
+ * @brief A record of information for detecting data races
+ */
 struct RaceRecord {
        modelclock_t *readClock;
        thread_id_t *thread;
@@ -51,6 +75,17 @@ struct RaceRecord {
 #define WRITEMASK READMASK
 #define WRITEVECTOR(x) (((x)>>40)&WRITEMASK)
 
+/**
+ * The basic encoding idea is that (void *) either:
+ *  -# points to a full record (RaceRecord) or
+ *  -# encodes the information in a 64 bit word. Encoding is as
+ *     follows:
+ *     - lowest bit set to 1
+ *     - next 8 bits are read thread id
+ *     - next 23 bits are read clock vector
+ *     - next 8 bits are write thread id
+ *     - next 23 bits are write clock vector
+ */
 #define ENCODEOP(rdthread, rdtime, wrthread, wrtime) (0x1ULL | ((rdthread)<<1) | ((rdtime) << 9) | (((uint64_t)wrthread)<<32) | (((uint64_t)wrtime)<<40))
 
 #define MAXTHREADID (THREADMASK-1)