X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=datarace.h;h=2de2a3390759f6dafbc24aba83e4b42e0024117e;hb=18b7aceed37f1a27c766bc85abab2ac60c4bfed5;hp=e3cab5d6612aeb7f5770122ad27201a5245435f1;hpb=9b784333e1a62ed6d258e96502a5733041389c8f;p=c11tester.git diff --git a/datarace.h b/datarace.h index e3cab5d6..2de2a339 100644 --- a/datarace.h +++ b/datarace.h @@ -1,7 +1,15 @@ -#ifndef DATARACE_H +/** @file datarace.h + * @brief Data race detection code. + */ + +#ifndef __DATARACE_H__ +#define __DATARACE_H__ + #include "config.h" #include -#include "clockvector.h" +#include "modeltypes.h" +#include "classlist.h" +#include "hashset.h" struct ShadowTable { void * array[65536]; @@ -11,49 +19,88 @@ struct ShadowBaseTable { uint64_t array[65536]; }; -#define MASK16BIT 0xffff +struct DataRace { + /* Clock and thread associated with first action. This won't change in + response to synchronization. */ -void initRaceDetector(); -void raceCheckWrite(thread_id_t thread, void *location, ClockVector *currClock); -void raceCheckRead(thread_id_t thread, void *location, ClockVector *currClock); + thread_id_t oldthread; + modelclock_t oldclock; + /* Record whether this is a write, so we can tell the user. */ + bool isoldwrite; + + /* Model action associated with second action. This could change as + a result of synchronization. */ + ModelAction *newaction; + /* Record whether this is a write, so we can tell the user. */ + bool isnewwrite; + /* Address of data race. */ + const void *address; + void * backtrace[64]; + int numframes; +}; +#define MASK16BIT 0xffff -/** Encoding idea: - * (void *) Either: - * (1) points to a full record or - * - * (2) encodes the information in a 64 bit word. Encoding is as - * follows: lowest bit set to 1, next 8 bits are read thread id, next - * 23 bits are read clock vector, next 8 bites are write thread id, - * next 23 bits are write clock vector. */ +void initRaceDetector(); +void raceCheckWrite(thread_id_t thread, void *location); +void raceCheckRead(thread_id_t thread, const void *location); +void recordWrite(thread_id_t thread, void *location); +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 + */ struct RaceRecord { - int *readClock; + modelclock_t *readClock; thread_id_t *thread; - int capacity; - int numReads; + int numReads : 31; + int isAtomic : 1; thread_id_t writeThread; - int writeClock; + modelclock_t writeClock; }; +unsigned int race_hash(struct DataRace *race); +bool race_equals(struct DataRace *r1, struct DataRace *r2); + #define INITCAPACITY 4 #define ISSHORTRECORD(x) ((x)&0x1) -#define THREADMASK 0xff +#define THREADMASK 0x3f #define RDTHREADID(x) (((x)>>1)&THREADMASK) -#define READMASK 0x07fffff -#define READVECTOR(x) (((x)>>9)&READMASK) +#define READMASK 0x1ffffff +#define READVECTOR(x) (((x)>>7)&READMASK) #define WRTHREADID(x) (((x)>>32)&THREADMASK) #define WRITEMASK READMASK -#define WRITEVECTOR(x) (((x)>>40)&WRITEMASK) +#define WRITEVECTOR(x) (((x)>>38)&WRITEMASK) -#define ENCODEOP(rdthread, rdtime, wrthread, wrtime) (0x1ULL | ((rdthread)<<1) | ((rdtime) << 9) | (((uint64_t)wrthread)<<32) | (((uint64_t)wrtime)<<40)) +#define ATOMICMASK (0x1ULL << 63) +#define NONATOMICMASK ~(0x1ULL << 63) + +/** + * The basic encoding idea is that (void *) either: + * -# points to a full record (RaceRecord) or + * -# encodes the information in a 64 bit word. Encoding is as + * follows: + * - lowest bit set to 1 + * - next 6 bits are read thread id + * - 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)) #define MAXTHREADID (THREADMASK-1) #define MAXREADVECTOR (READMASK-1) #define MAXWRITEVECTOR (WRITEMASK-1) -#endif + +typedef HashSet RaceSet; + +#endif /* __DATARACE_H__ */