model: add read-acquire/fence-release support
[c11tester.git] / datarace.h
index e3cab5d6612aeb7f5770122ad27201a5245435f1..d1f91b2057e2f98834f633766a71963dfa632187 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 <vector>
+#include "modeltypes.h"
+
+/* Forward declaration */
+class ClockVector;
+class ModelAction;
 
 struct ShadowTable {
        void * array[65536];
@@ -11,15 +20,36 @@ struct ShadowBaseTable {
        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. */
+       const 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);
-
+void raceCheckRead(thread_id_t thread, const void *location, ClockVector *currClock);
+bool checkDataRaces();
+void assert_race(struct DataRace *race);
 
+extern std::vector<struct DataRace *> unrealizedraces;
 
-/** Encoding idea:
+/** Basic encoding idea:
  *      (void *) Either:
  *      (1) points to a full record or
  *
@@ -29,12 +59,12 @@ void raceCheckRead(thread_id_t thread, void *location, ClockVector *currClock);
  * 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