#include "clockvector.h"
#include "config.h"
#include "action.h"
+#include "execution.h"
+#include "stl-model.h"
static struct ShadowTable *root;
-SnapVector<struct DataRace *> unrealizedraces;
+static SnapVector<DataRace *> *unrealizedraces;
static void *memory_base;
static void *memory_top;
+static const ModelExecution * get_execution()
+{
+ return model->get_execution();
+}
/** This function initialized the data race detector. */
void initRaceDetector()
root = (struct ShadowTable *)snapshot_calloc(sizeof(struct ShadowTable), 1);
memory_base = snapshot_calloc(sizeof(struct ShadowBaseTable) * SHADOWBASETABLES, 1);
memory_top = ((char *)memory_base) + sizeof(struct ShadowBaseTable) * SHADOWBASETABLES;
+ unrealizedraces = new SnapVector<DataRace *>();
}
void * table_calloc(size_t size)
race->newaction = newaction;
race->isnewwrite = isnewwrite;
race->address = address;
- unrealizedraces.push_back(race);
+ unrealizedraces->push_back(race);
/* If the race is realized, bail out now. */
if (checkDataRaces())
*/
bool checkDataRaces()
{
- if (model->isfeasibleprefix()) {
+ if (get_execution()->isfeasibleprefix()) {
bool race_asserted = false;
/* Prune the non-racing unrealized dataraces */
- for (unsigned i = 0; i < unrealizedraces.size(); i++) {
- struct DataRace *race = unrealizedraces[i];
+ for (unsigned i = 0; i < unrealizedraces->size(); i++) {
+ struct DataRace *race = (*unrealizedraces)[i];
if (clock_may_race(race->newaction->get_cv(), race->newaction->get_tid(), race->oldclock, race->oldthread)) {
assert_race(race);
race_asserted = true;
}
snapshot_free(race);
}
- unrealizedraces.clear();
+ unrealizedraces->clear();
return race_asserted;
}
return false;
if (clock_may_race(currClock, thread, readClock, readThread)) {
/* We have a datarace */
- reportDataRace(readThread, readClock, false, model->get_parent_action(thread), true, location);
+ reportDataRace(readThread, readClock, false, get_execution()->get_parent_action(thread), true, location);
}
}
if (clock_may_race(currClock, thread, writeClock, writeThread)) {
/* We have a datarace */
- reportDataRace(writeThread, writeClock, true, model->get_parent_action(thread), true, location);
+ reportDataRace(writeThread, writeClock, true, get_execution()->get_parent_action(thread), true, location);
}
record->numReads = 0;
{
uint64_t *shadow = lookupAddressEntry(location);
uint64_t shadowval = *shadow;
- ClockVector *currClock = model->get_cv(thread);
+ ClockVector *currClock = get_execution()->get_cv(thread);
/* Do full record */
if (shadowval != 0 && !ISSHORTRECORD(shadowval)) {
if (clock_may_race(currClock, thread, readClock, readThread)) {
/* We have a datarace */
- reportDataRace(readThread, readClock, false, model->get_parent_action(thread), true, location);
+ reportDataRace(readThread, readClock, false, get_execution()->get_parent_action(thread), true, location);
}
/* Check for datarace against last write. */
if (clock_may_race(currClock, thread, writeClock, writeThread)) {
/* We have a datarace */
- reportDataRace(writeThread, writeClock, true, model->get_parent_action(thread), true, location);
+ reportDataRace(writeThread, writeClock, true, get_execution()->get_parent_action(thread), true, location);
}
*shadow = ENCODEOP(0, 0, threadid, ourClock);
}
if (clock_may_race(currClock, thread, writeClock, writeThread)) {
/* We have a datarace */
- reportDataRace(writeThread, writeClock, true, model->get_parent_action(thread), false, location);
+ reportDataRace(writeThread, writeClock, true, get_execution()->get_parent_action(thread), false, location);
}
/* Shorten vector when possible */
{
uint64_t *shadow = lookupAddressEntry(location);
uint64_t shadowval = *shadow;
- ClockVector *currClock = model->get_cv(thread);
+ ClockVector *currClock = get_execution()->get_cv(thread);
/* Do full record */
if (shadowval != 0 && !ISSHORTRECORD(shadowval)) {
if (clock_may_race(currClock, thread, writeClock, writeThread)) {
/* We have a datarace */
- reportDataRace(writeThread, writeClock, true, model->get_parent_action(thread), false, location);
+ reportDataRace(writeThread, writeClock, true, get_execution()->get_parent_action(thread), false, location);
}
modelclock_t readClock = READVECTOR(shadowval);
*shadow = ENCODEOP(threadid, ourClock, id_to_int(writeThread), writeClock);
}
+
+bool haveUnrealizedRaces()
+{
+ return !unrealizedraces->empty();
+}