#include "config.h"
#include "action.h"
-struct ShadowTable *root;
+static struct ShadowTable *root;
SnapVector<struct DataRace *> unrealizedraces;
-void *memory_base;
-void *memory_top;
+static void *memory_base;
+static void *memory_top;
/** This function initialized the data race detector. */
*/
void assert_race(struct DataRace *race)
{
- 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",
+ model->assert_bug(
+ "Data race detected @ address %p:\n"
+ " Access 1: %5s in thread %2d @ clock %3u\n"
+ " Access 2: %5s in thread %2d @ clock %3u",
+ race->address,
race->isoldwrite ? "write" : "read",
- id_to_int(race->oldthread), race->oldclock);
- ptr += sprintf(ptr, " Access 2: %5s in thread %2d @ clock %3u",
+ id_to_int(race->oldthread),
+ race->oldclock,
race->isnewwrite ? "write" : "read",
- id_to_int(race->newaction->get_tid()), race->newaction->get_seq_number());
- model->assert_bug(buf);
+ id_to_int(race->newaction->get_tid()),
+ race->newaction->get_seq_number()
+ );
}
/** This function does race detection for a write on an expanded record. */
}
/** This function does race detection on a write. */
-void raceCheckWrite(thread_id_t thread, void *location, ClockVector *currClock)
+void raceCheckWrite(thread_id_t thread, void *location)
{
uint64_t *shadow = lookupAddressEntry(location);
uint64_t shadowval = *shadow;
+ ClockVector *currClock = model->get_cv(thread);
/* Do full record */
if (shadowval != 0 && !ISSHORTRECORD(shadowval)) {
}
/** This function does race detection on a read. */
-void raceCheckRead(thread_id_t thread, const void *location, ClockVector *currClock)
+void raceCheckRead(thread_id_t thread, const void *location)
{
uint64_t *shadow = lookupAddressEntry(location);
uint64_t shadowval = *shadow;
+ ClockVector *currClock = model->get_cv(thread);
/* Do full record */
if (shadowval != 0 && !ISSHORTRECORD(shadowval)) {