- struct RaceRecord * record=(struct RaceRecord *)calloc(1,sizeof(struct RaceRecord));
- record->writeThread=writeThread;
- record->writeClock=writeClock;
+ struct RaceRecord *record = (struct RaceRecord *)snapshot_calloc(1, sizeof(struct RaceRecord));
+ record->writeThread = writeThread;
+ record->writeClock = writeClock;
+
+ if (readClock != 0) {
+ record->capacity = INITCAPACITY;
+ record->thread = (thread_id_t *)snapshot_malloc(sizeof(thread_id_t) * record->capacity);
+ record->readClock = (modelclock_t *)snapshot_malloc(sizeof(modelclock_t) * record->capacity);
+ record->numReads = 1;
+ record->thread[0] = readThread;
+ record->readClock[0] = readClock;
+ }
+ *shadow = (uint64_t) record;
+}
+
+/** This function is called when we detect a data race.*/
+static void reportDataRace(thread_id_t oldthread, modelclock_t oldclock, bool isoldwrite, ModelAction *newaction, bool isnewwrite, const void *address)
+{
+ struct DataRace *race = (struct DataRace *)snapshot_malloc(sizeof(struct DataRace));
+ race->oldthread = oldthread;
+ race->oldclock = oldclock;
+ race->isoldwrite = isoldwrite;
+ race->newaction = newaction;
+ race->isnewwrite = isnewwrite;
+ race->address = address;
+ unrealizedraces.push_back(race);
+
+ /* If the race is realized, bail out now. */
+ if (checkDataRaces())
+ model->switch_to_master(NULL);
+}