/** This function looks up the entry in the shadow table corresponding to a
* given address.*/
-static uint64_t * lookupAddressEntry(const void *address)
+static inline uint64_t * lookupAddressEntry(const void *address)
{
struct ShadowTable *currtable = root;
#if BIT48
/** This function just updates metadata on atomic write. */
void recordCalloc(void *location, size_t size) {
- thread_id_t thread = thread_current()->get_id();
+ thread_id_t thread = thread_current_id();
for(;size != 0;size--) {
uint64_t *shadow = lookupAddressEntry(location);
uint64_t shadowval = *shadow;
int newCapacity = copytoindex * 2;
thread_id_t *newthread = (thread_id_t *)snapshot_malloc(sizeof(thread_id_t) * newCapacity);
modelclock_t *newreadClock = (modelclock_t *)snapshot_malloc(sizeof(modelclock_t) * newCapacity);
- std::memcpy(newthread, record->thread, copytoindex * sizeof(thread_id_t));
- std::memcpy(newreadClock, record->readClock, copytoindex * sizeof(modelclock_t));
+ real_memcpy(newthread, record->thread, copytoindex * sizeof(thread_id_t));
+ real_memcpy(newreadClock, record->readClock, copytoindex * sizeof(modelclock_t));
snapshot_free(record->readClock);
snapshot_free(record->thread);
record->readClock = newreadClock;
void raceCheckRead64(thread_id_t thread, const void *location)
{
+ int old_flag = GET_MODEL_FLAG;
+ ENTER_MODEL_FLAG;
+
uint64_t old_shadowval, new_shadowval;
old_shadowval = new_shadowval = INVALIDSHADOWVAL;
#ifdef COLLECT_STAT
if (shadow[7]==old_shadowval)
shadow[7] = new_shadowval;
else goto L7;
+ RESTORE_MODEL_FLAG(old_flag);
return;
}
raceCheckRead_otherIt(thread, (const void *)(((uintptr_t)location) + 6));
L7:
raceCheckRead_otherIt(thread, (const void *)(((uintptr_t)location) + 7));
+ RESTORE_MODEL_FLAG(old_flag);
}
void raceCheckRead32(thread_id_t thread, const void *location)
{
+ int old_flag = GET_MODEL_FLAG;
+ ENTER_MODEL_FLAG;
+
uint64_t old_shadowval, new_shadowval;
old_shadowval = new_shadowval = INVALIDSHADOWVAL;
#ifdef COLLECT_STAT
if (shadow[3]==old_shadowval)
shadow[3] = new_shadowval;
else goto L3;
+ RESTORE_MODEL_FLAG(old_flag);
return;
}
raceCheckRead_otherIt(thread, (const void *)(((uintptr_t)location) + 2));
L3:
raceCheckRead_otherIt(thread, (const void *)(((uintptr_t)location) + 3));
+ RESTORE_MODEL_FLAG(old_flag);
}
void raceCheckRead16(thread_id_t thread, const void *location)
{
+ int old_flag = GET_MODEL_FLAG;
+ ENTER_MODEL_FLAG;
+
uint64_t old_shadowval, new_shadowval;
old_shadowval = new_shadowval = INVALIDSHADOWVAL;
#ifdef COLLECT_STAT
if (CHECKBOUNDARY(location, 1)) {
if (shadow[1]==old_shadowval) {
shadow[1] = new_shadowval;
+ RESTORE_MODEL_FLAG(old_flag);
return;
}
}
raceCheckRead_otherIt(thread, (const void *)(((uintptr_t)location) + 1));
+ RESTORE_MODEL_FLAG(old_flag);
}
void raceCheckRead8(thread_id_t thread, const void *location)
{
+ int old_flag = GET_MODEL_FLAG;
+ ENTER_MODEL_FLAG;
+
uint64_t old_shadowval, new_shadowval;
old_shadowval = new_shadowval = INVALIDSHADOWVAL;
#ifdef COLLECT_STAT
load8_count++;
#endif
raceCheckRead_firstIt(thread, location, &old_shadowval, &new_shadowval);
+ RESTORE_MODEL_FLAG(old_flag);
}
static inline uint64_t * raceCheckWrite_firstIt(thread_id_t thread, const void * location, uint64_t *old_val, uint64_t *new_val)
void raceCheckWrite64(thread_id_t thread, const void *location)
{
+ int old_flag = GET_MODEL_FLAG;
+ ENTER_MODEL_FLAG;
uint64_t old_shadowval, new_shadowval;
old_shadowval = new_shadowval = INVALIDSHADOWVAL;
#ifdef COLLECT_STAT
if (shadow[7]==old_shadowval)
shadow[7] = new_shadowval;
else goto L7;
+ RESTORE_MODEL_FLAG(old_flag);
return;
}
raceCheckWrite_otherIt(thread, (const void *)(((uintptr_t)location) + 6));
L7:
raceCheckWrite_otherIt(thread, (const void *)(((uintptr_t)location) + 7));
+ RESTORE_MODEL_FLAG(old_flag);
}
void raceCheckWrite32(thread_id_t thread, const void *location)
{
+ int old_flag = GET_MODEL_FLAG;
+ ENTER_MODEL_FLAG;
+
uint64_t old_shadowval, new_shadowval;
old_shadowval = new_shadowval = INVALIDSHADOWVAL;
#ifdef COLLECT_STAT
if (shadow[3]==old_shadowval)
shadow[3] = new_shadowval;
else goto L3;
+ RESTORE_MODEL_FLAG(old_flag);
return;
}
raceCheckWrite_otherIt(thread, (const void *)(((uintptr_t)location) + 2));
L3:
raceCheckWrite_otherIt(thread, (const void *)(((uintptr_t)location) + 3));
+ RESTORE_MODEL_FLAG(old_flag);
}
void raceCheckWrite16(thread_id_t thread, const void *location)
{
+ int old_flag = GET_MODEL_FLAG;
+ ENTER_MODEL_FLAG;
+
uint64_t old_shadowval, new_shadowval;
old_shadowval = new_shadowval = INVALIDSHADOWVAL;
#ifdef COLLECT_STAT
if (CHECKBOUNDARY(location, 1)) {
if (shadow[1]==old_shadowval) {
shadow[1] = new_shadowval;
+ RESTORE_MODEL_FLAG(old_flag);
return;
}
}
raceCheckWrite_otherIt(thread, (const void *)(((uintptr_t)location) + 1));
+ RESTORE_MODEL_FLAG(old_flag);
}
void raceCheckWrite8(thread_id_t thread, const void *location)
{
+ int old_flag = GET_MODEL_FLAG;
+ ENTER_MODEL_FLAG;
+
uint64_t old_shadowval, new_shadowval;
old_shadowval = new_shadowval = INVALIDSHADOWVAL;
#ifdef COLLECT_STAT
store8_count++;
#endif
raceCheckWrite_firstIt(thread, location, &old_shadowval, &new_shadowval);
+ RESTORE_MODEL_FLAG(old_flag);
}
#ifdef COLLECT_STAT