tsan: introduce kAccessFree

Add kAccessFree memory access flag (similar to kAccessVptr).
In preparation for MemoryAccess refactoring.

Reviewed By: melver

Differential Revision: https://reviews.llvm.org/D107464
This commit is contained in:
Dmitry Vyukov 2021-08-04 16:42:05 +02:00
parent 7ed22a6fa9
commit d41233e9cf
2 changed files with 8 additions and 7 deletions

View File

@ -698,7 +698,8 @@ enum : AccessType {
kAccessWrite = 0,
kAccessRead = 1 << 0,
kAccessAtomic = 1 << 1,
kAccessVptr = 1 << 2,
kAccessVptr = 1 << 2, // read or write of an object virtual table pointer
kAccessFree = 1 << 3, // synthetic memory access during memory freeing
};
void MemoryAccess(ThreadState *thr, uptr pc, uptr addr,
@ -741,9 +742,13 @@ void MemoryAccess(ThreadState *thr, uptr pc, uptr addr, uptr size,
bool is_atomic = typ & kAccessAtomic;
if (typ & kAccessVptr)
thr->is_vptr_access = true;
if (typ & kAccessFree)
thr->is_freeing = true;
MemoryAccess(thr, pc, addr, size_log, is_write, is_atomic);
if (typ & kAccessVptr)
thr->is_vptr_access = false;
if (typ & kAccessFree)
thr->is_freeing = false;
}
void MemoryResetRange(ThreadState *thr, uptr pc, uptr addr, uptr size);

View File

@ -132,12 +132,8 @@ void MutexDestroy(ThreadState *thr, uptr pc, uptr addr, u32 flagz) {
// Imitate a memory write to catch unlock-destroy races.
// Do this outside of sync mutex, because it can report a race which locks
// sync mutexes.
if (IsAppMem(addr)) {
CHECK(!thr->is_freeing);
thr->is_freeing = true;
MemoryAccess(thr, pc, addr, 1, kAccessWrite);
thr->is_freeing = false;
}
if (IsAppMem(addr))
MemoryAccess(thr, pc, addr, 1, kAccessWrite | kAccessFree);
// s will be destroyed and freed in MetaMap::FreeBlock.
}