X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=datarace.cc;h=bdfade358e60595d1157e94cd2fcd0b5a18d0b86;hp=448929b295641d7546cdcdbf7524ae69b206b43f;hb=4159ba45e83f6542e3a3320e83bca9fbaf2da3ea;hpb=3133d403d1abd0ac735b4d4662708fcef1cb5d5f diff --git a/datarace.cc b/datarace.cc index 448929b2..bdfade35 100644 --- a/datarace.cc +++ b/datarace.cc @@ -103,46 +103,56 @@ static void reportDataRace(thread_id_t oldthread, modelclock_t oldclock, bool is /* If the race is realized, bail out now. */ if (checkDataRaces()) - model->assert_bug("Data race", true); + model->switch_to_master(NULL); } -/** 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. */