X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=datarace.cc;h=f0d3dc619489d780ea7e9be237b2007d428a4b33;hb=84e24d516d4e9dbd30f1fff7e9a185d1540d20eb;hp=1040a3b0df2d4871f21515e62d2d94e5a6651313;hpb=1555554a743a69644432215413e0dad83a18a235;p=model-checker.git diff --git a/datarace.cc b/datarace.cc index 1040a3b..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); @@ -76,6 +85,9 @@ void fullRaceCheckWrite(thread_id_t thread, uint64_t * shadow, ClockVector *curr modelclock_t readClock = record->readClock[i]; thread_id_t readThread = record->thread[i]; + /* Note that readClock can't actuall be zero here, so it could be + optimized. */ + if (clock_may_race(currClock, thread, readClock, readThread)) { /* We have a datarace */ reportDataRace(); @@ -98,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; @@ -140,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); @@ -161,9 +175,13 @@ void fullRaceCheckRead(thread_id_t thread, uint64_t * shadow, ClockVector *currC modelclock_t readClock = record->readClock[i]; thread_id_t readThread = record->thread[i]; - /* TODO: should this have different logic than all the other - * 'clock_may_race' calls? */ - if (readThread != thread && currClock->getClock(readThread) <= readClock) { + /* Note that is not really a datarace check as reads cannott + actually race. It is just determining that this read subsumes + another in the sense that either this read races or neither + read races. Note that readClock can't actually be zero, so it + could be optimized. */ + + if (clock_may_race(currClock, thread, readClock, readThread)) { /* Still need this read in vector */ if (copytoindex!=i) { record->readClock[copytoindex]=record->readClock[i]; @@ -193,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;