X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=datarace.h;h=78903d336832bb7439d4a8ab61799dd48f2ceed5;hb=a6ce579c6437ebead8fee2c8df1530d223591318;hp=33a5c26770df7deacc5ad4f14cacf9c7a3702880;hpb=20926923f6de1790fdd368d5e7fa1738abe7b9a6;p=model-checker.git diff --git a/datarace.h b/datarace.h index 33a5c26..78903d3 100644 --- a/datarace.h +++ b/datarace.h @@ -5,7 +5,12 @@ #ifndef DATARACE_H #include "config.h" #include -#include "clockvector.h" +#include "modeltypes.h" +#include "stl-model.h" + +/* Forward declaration */ +class ClockVector; +class ModelAction; struct ShadowTable { void * array[65536]; @@ -15,23 +20,38 @@ 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; +}; +#define MASK16BIT 0xffff +void initRaceDetector(); +void raceCheckWrite(thread_id_t thread, void *location); +void raceCheckRead(thread_id_t thread, const void *location); +bool checkDataRaces(); +void assert_race(struct DataRace *race); -/** Basic 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. */ +extern SnapVector unrealizedraces; +/** + * @brief A record of information for detecting data races + */ struct RaceRecord { modelclock_t *readClock; thread_id_t *thread; @@ -55,6 +75,17 @@ struct RaceRecord { #define WRITEMASK READMASK #define WRITEVECTOR(x) (((x)>>40)&WRITEMASK) +/** + * 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 8 bits are read thread id + * - next 23 bits are read clock vector + * - next 8 bits are write thread id + * - next 23 bits are write clock vector + */ #define ENCODEOP(rdthread, rdtime, wrthread, wrtime) (0x1ULL | ((rdthread)<<1) | ((rdtime) << 9) | (((uint64_t)wrthread)<<32) | (((uint64_t)wrtime)<<40)) #define MAXTHREADID (THREADMASK-1)