X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;ds=sidebyside;f=datarace.h;h=f026556add051292ea4c57daaac4ad42255f1576;hb=8127a0c80483af6e238f8cf2b6910a1e7da22416;hp=7c84121541312758ff469ebdc3946df5fdebb333;hpb=56fc136acfee3e083b77b8bc2bd1149bf4e26f2e;p=c11tester.git diff --git a/datarace.h b/datarace.h index 7c841215..f026556a 100644 --- a/datarace.h +++ b/datarace.h @@ -44,10 +44,15 @@ struct DataRace { void initRaceDetector(); void raceCheckWrite(thread_id_t thread, void *location); +void atomraceCheckWrite(thread_id_t thread, void *location); void raceCheckRead(thread_id_t thread, const void *location); +void atomraceCheckRead(thread_id_t thread, const void *location); void recordWrite(thread_id_t thread, void *location); -bool checkDataRaces(); +void recordCalloc(void *location, size_t size); void assert_race(struct DataRace *race); +bool hasNonAtomicStore(const void *location); +void setAtomicStoreFlag(const void *location); +void getStoreThreadAndClock(const void *address, thread_id_t * thread, modelclock_t * clock); /** * @brief A record of information for detecting data races @@ -55,8 +60,8 @@ void assert_race(struct DataRace *race); struct RaceRecord { modelclock_t *readClock; thread_id_t *thread; - int capacity; - int numReads; + int numReads : 31; + int isAtomic : 1; thread_id_t writeThread; modelclock_t writeClock; }; @@ -78,6 +83,9 @@ bool race_equals(struct DataRace *r1, struct DataRace *r2); #define WRITEMASK READMASK #define WRITEVECTOR(x) (((x)>>38)&WRITEMASK) +#define ATOMICMASK (0x1ULL << 63) +#define NONATOMICMASK ~(0x1ULL << 63) + /** * The basic encoding idea is that (void *) either: * -# points to a full record (RaceRecord) or @@ -88,6 +96,7 @@ bool race_equals(struct DataRace *r1, struct DataRace *r2); * - next 25 bits are read clock vector * - next 6 bits are write thread id * - next 25 bits are write clock vector + * - highest bit is 1 if the write is from an atomic */ #define ENCODEOP(rdthread, rdtime, wrthread, wrtime) (0x1ULL | ((rdthread)<<1) | ((rdtime) << 7) | (((uint64_t)wrthread)<<32) | (((uint64_t)wrtime)<<38))