X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=datarace.cc;h=732d6ff748b6e77187c10f0bf5dcd6b6b834b025;hb=caa1df880547acce2804221c8e6995170a5121eb;hp=f5501fe07629d39cd588156c8f219495640a6ecc;hpb=f4d77c40b4029cdc18f4aaa5a4e01dfbcfca5f7b;p=model-checker.git diff --git a/datarace.cc b/datarace.cc index f5501fe..732d6ff 100644 --- a/datarace.cc +++ b/datarace.cc @@ -1,17 +1,33 @@ #include "datarace.h" #include "model.h" -#include "threads.h" +#include "threads-model.h" #include #include #include "mymemory.h" #include "clockvector.h" +#include "config.h" struct ShadowTable *root; std::vector unrealizedraces; +void *memory_base; +void *memory_top; + /** 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; +} + +void * table_calloc(size_t size) { + if ((((char *)memory_base)+size)>memory_top) { + return snapshot_calloc(size, 1); + } else { + void *tmp=memory_base; + memory_base=((char *)memory_base)+size; + return tmp; + } } /** This function looks up the entry in the shadow table corresponding to a @@ -21,13 +37,13 @@ static uint64_t * lookupAddressEntry(void * address) { #if BIT48 currtable=(struct ShadowTable *) currtable->array[(((uintptr_t)address)>>32)&MASK16BIT]; if (currtable==NULL) { - currtable = (struct ShadowTable *)(root->array[(((uintptr_t)address)>>32)&MASK16BIT] = snapshot_calloc(sizeof(struct ShadowTable), 1)); + currtable = (struct ShadowTable *)(root->array[(((uintptr_t)address)>>32)&MASK16BIT] = table_calloc(sizeof(struct ShadowTable))); } #endif struct ShadowBaseTable * basetable=(struct ShadowBaseTable *) currtable->array[(((uintptr_t)address)>>16)&MASK16BIT]; if (basetable==NULL) { - basetable = (struct ShadowBaseTable *)(currtable->array[(((uintptr_t)address)>>16)&MASK16BIT] = snapshot_calloc(sizeof(struct ShadowBaseTable), 1)); + basetable = (struct ShadowBaseTable *)(currtable->array[(((uintptr_t)address)>>16)&MASK16BIT] = table_calloc(sizeof(struct ShadowBaseTable))); } return &basetable->array[((uintptr_t)address)&MASK16BIT]; } @@ -120,11 +136,15 @@ bool checkDataRaces() { return false; } -void printRace(struct DataRace * race) { - printf("Datarace detected\n"); - printf("Location %p\n", race->address); - printf("Initial access: thread %u clock %u, iswrite %u\n", id_to_int(race->oldthread), race->oldclock, race->isoldwrite); - printf("Second access: thread %u clock %u, iswrite %u\n", id_to_int(race->newaction->get_tid()), race->newaction->get_seq_number(), race->isnewwrite); +void printRace(struct DataRace *race) +{ + printf("Datarace detected @ address %p:\n", race->address); + printf(" 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", + race->isnewwrite ? "write" : "read", + id_to_int(race->newaction->get_tid()), race->newaction->get_seq_number()); } /** This function does race detection for a write on an expanded record. */