X-Git-Url: http://plrg.eecs.uci.edu/git/?p=model-checker.git;a=blobdiff_plain;f=datarace.cc;h=f0d3dc619489d780ea7e9be237b2007d428a4b33;hp=0fd263cc08cf946a8f3806d02614d1a80593a275;hb=88ccfdff63126a0fa70c094c7ed7e66f68e1b861;hpb=fb2ab76b04c83faa654c8819c8e39b1e5fcc7d75 diff --git a/datarace.cc b/datarace.cc index 0fd263c..f0d3dc6 100644 --- a/datarace.cc +++ b/datarace.cc @@ -5,14 +5,17 @@ struct ShadowTable *root; +/** This function initialized the data race detector. */ void initRaceDetector() { root=(struct ShadowTable *) calloc(sizeof(struct ShadowTable),1); } +/** This function looks up the entry in the shadow table corresponding to a + * given address.*/ static uint64_t * lookupAddressEntry(void * address) { struct ShadowTable *currtable=root; -#ifdef BIT48 - currtable=(struct ShadowTable *) currtable->array[(((uintptr_t)address)>>32)&0xffff]; +#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]=calloc(sizeof(struct ShadowTable),1)); } @@ -40,6 +43,10 @@ static bool clock_may_race(ClockVector *clock1, thread_id_t tid1, return tid1 != tid2 && clock2 != 0 && clock1->getClock(tid2) <= clock2; } +/** + * Expands a record from the compact form to the full form. This is + * necessary for multiple readers or for very large thread ids or time + * stamps. */ static void expandRecord(uint64_t * shadow) { uint64_t shadowval=*shadow; @@ -63,10 +70,12 @@ static void expandRecord(uint64_t * shadow) { *shadow=(uint64_t) record; } +/** This function is called when we detect a data race.*/ static void reportDataRace() { printf("The reportDataRace method should report useful things about this datarace!\n"); } +/** This function does race detection for a write on an expanded record. */ void fullRaceCheckWrite(thread_id_t thread, uint64_t * shadow, ClockVector *currClock) { struct RaceRecord * record=(struct RaceRecord *) (*shadow); @@ -101,6 +110,7 @@ void fullRaceCheckWrite(thread_id_t thread, uint64_t * shadow, ClockVector *curr record->writeClock=ourClock; } +/** This function does race detection on a write. */ void raceCheckWrite(thread_id_t thread, void *location, ClockVector *currClock) { uint64_t * shadow=lookupAddressEntry(location); uint64_t shadowval=*shadow; @@ -143,6 +153,7 @@ void raceCheckWrite(thread_id_t thread, void *location, ClockVector *currClock) *shadow = ENCODEOP(0, 0, threadid, ourClock); } +/** This function does race detection on a read for an expanded record. */ void fullRaceCheckRead(thread_id_t thread, uint64_t * shadow, ClockVector *currClock) { struct RaceRecord * record=(struct RaceRecord *) (*shadow); @@ -200,6 +211,7 @@ void fullRaceCheckRead(thread_id_t thread, uint64_t * shadow, ClockVector *currC record->numReads=copytoindex+1; } +/** This function does race detection on a read. */ void raceCheckRead(thread_id_t thread, void *location, ClockVector *currClock) { uint64_t * shadow=lookupAddressEntry(location); uint64_t shadowval=*shadow;