From 122aad1259a2df612ad39c640551be8da9cb26b9 Mon Sep 17 00:00:00 2001 From: Brian Norris Date: Fri, 16 Nov 2012 14:38:26 -0800 Subject: [PATCH] datarace: redirect "Data race @ ..." messages to model-checker bug list Data race information was previously printed in multiple ways: through the datarace.cc printRace() method and through the model-checker assert_bug() method. Start unifying that. Other notes: - Data race objects probably should be freed (even though they are snapshotted). I fix this. - Races could be printed more than once previously, since the unrealizedraces vector was never cleared of realized races. Now, we clear this vector every time we process it (in a feasible execution), either stashing a bug message or dropping the race entirely. --- datarace.cc | 54 +++++++++++++++++++++++++++++++---------------------- datarace.h | 2 +- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/datarace.cc b/datarace.cc index 448929b..8d913c7 100644 --- a/datarace.cc +++ b/datarace.cc @@ -106,43 +106,53 @@ static void reportDataRace(thread_id_t oldthread, modelclock_t oldclock, bool is model->assert_bug("Data race", true); } -/** This function goes through the list of unrealized data races, - * removes the impossible ones, and print the realized ones. */ - +/** + * @brief Check and report data races + * + * If the trace is feasible (a feasible prefix), clear out the list of + * unrealized data races, asserting any realized ones as execution bugs so that + * the model-checker will end the execution. + * + * @return True if any data races were realized + */ bool checkDataRaces() { if (model->isfeasibleprefix()) { + bool race_asserted = false; /* Prune the non-racing unrealized dataraces */ - unsigned int i,newloc=0; - for(i=0;inewaction->get_cv(), race->newaction->get_tid(), race->oldclock, race->oldthread)) { - unrealizedraces[newloc++]=race; + assert_race(race); + race_asserted = true; } + snapshot_free(race); } - if (newloc!=i) - unrealizedraces.resize(newloc); - - if (unrealizedraces.size()!=0) { - /* We have an actual realized race. */ - for(i=0;iaddress); - printf(" Access 1: %5s in thread %2d @ clock %3u\n", + char buf[200]; + char *ptr = buf; + ptr += sprintf(ptr, "Data race detected @ address %p:\n", race->address); + ptr += sprintf(ptr, " Access 1: %5s in thread %2d @ clock %3u\n", race->isoldwrite ? "write" : "read", id_to_int(race->oldthread), race->oldclock); - printf(" Access 2: %5s in thread %2d @ clock %3u\n", + ptr += sprintf(ptr, " Access 2: %5s in thread %2d @ clock %3u", race->isnewwrite ? "write" : "read", id_to_int(race->newaction->get_tid()), race->newaction->get_seq_number()); + model->assert_bug(buf); } /** This function does race detection for a write on an expanded record. */ diff --git a/datarace.h b/datarace.h index 2fb1a7f..d1f91b2 100644 --- a/datarace.h +++ b/datarace.h @@ -45,7 +45,7 @@ void initRaceDetector(); void raceCheckWrite(thread_id_t thread, void *location, ClockVector *currClock); void raceCheckRead(thread_id_t thread, const void *location, ClockVector *currClock); bool checkDataRaces(); -void printRace(struct DataRace *race); +void assert_race(struct DataRace *race); extern std::vector unrealizedraces; -- 2.34.1