-/** This function does race detection on a write. */
-void raceCheckWrite(thread_id_t thread, void *location)
-{
- uint64_t *shadow = lookupAddressEntry(location);
- uint64_t shadowval = *shadow;
- ClockVector *currClock = get_execution()->get_cv(thread);
- if (currClock == NULL)
- return;
-
- struct DataRace * race = NULL;
- /* Do full record */
- if (shadowval != 0 && !ISSHORTRECORD(shadowval)) {
- race = fullRaceCheckWrite(thread, location, shadow, currClock);
- goto Exit;
- }
-
- {
- int threadid = id_to_int(thread);
- modelclock_t ourClock = currClock->getClock(thread);
-
- /* Thread ID is too large or clock is too large. */
- if (threadid > MAXTHREADID || ourClock > MAXWRITEVECTOR) {
- expandRecord(shadow);
- race = fullRaceCheckWrite(thread, location, shadow, currClock);
- goto Exit;
- }
-
-
-
- {
- /* Check for datarace against last read. */
- modelclock_t readClock = READVECTOR(shadowval);
- thread_id_t readThread = int_to_id(RDTHREADID(shadowval));
-
- if (clock_may_race(currClock, thread, readClock, readThread)) {
- /* We have a datarace */
- race = reportDataRace(readThread, readClock, false, get_execution()->get_parent_action(thread), true, location);
- goto ShadowExit;
- }
- }
-
- {
- /* Check for datarace against last write. */
-
- modelclock_t writeClock = WRITEVECTOR(shadowval);
- thread_id_t writeThread = int_to_id(WRTHREADID(shadowval));
-
- if (clock_may_race(currClock, thread, writeClock, writeThread)) {
- /* We have a datarace */
- race = reportDataRace(writeThread, writeClock, true, get_execution()->get_parent_action(thread), true, location);
- goto ShadowExit;
- }
- }
-
-ShadowExit:
- *shadow = ENCODEOP(0, 0, threadid, ourClock);
- }
-
-Exit:
- if (race) {
- race->numframes=backtrace(race->backtrace, sizeof(race->backtrace)/sizeof(void*));
- if (raceset->add(race))
- assert_race(race);
- else model_free(race);
- }
-}
-
-