forked from OSchip/llvm-project
[scudo] Don't track free/use stats for transfer batches.
The Scudo C unit tests are currently non-hermetic. In particular, adding or removing a transfer batch is a global state of the allocator that persists between tests. This can cause flakiness in ScudoWrappersCTest.MallInfo, because the creation or teardown of a batch causes mallinfo's uordblks or fordblks to move up or down by the size of a transfer batch on malloc/free. It's my opinion that uordblks and fordblks should track the statistics related to the user's malloc() and free() usage, and not the state of the internal allocator structures. Thus, excluding the transfer batches from stat collection does the trick and makes these tests pass. Repro instructions of the bug: 1. ninja ./projects/compiler-rt/lib/scudo/standalone/tests/ScudoCUnitTest-x86_64-Test 2. ./projects/compiler-rt/lib/scudo/standalone/tests/ScudoCUnitTest-x86_64-Test --gtest_filter=ScudoWrappersCTest.MallInfo Reviewed By: cryptoad Differential Revision: https://reviews.llvm.org/D101653
This commit is contained in:
parent
39bbfb7726
commit
e8f7241e0b
|
@ -135,6 +135,7 @@ private:
|
|||
struct PerClass {
|
||||
u32 Count;
|
||||
u32 MaxCount;
|
||||
// Note: ClassSize is zero for the transfer batch.
|
||||
uptr ClassSize;
|
||||
CompactPtrT Chunks[2 * TransferBatch::MaxNumCached];
|
||||
};
|
||||
|
@ -154,7 +155,13 @@ private:
|
|||
PerClass *P = &PerClassArray[I];
|
||||
const uptr Size = SizeClassAllocator::getSizeByClassId(I);
|
||||
P->MaxCount = 2 * TransferBatch::getMaxCached(Size);
|
||||
P->ClassSize = Size;
|
||||
if (I != BatchClassId) {
|
||||
P->ClassSize = Size;
|
||||
} else {
|
||||
// ClassSize in this struct is only used for malloc/free stats, which
|
||||
// should only track user allocations, not internal movements.
|
||||
P->ClassSize = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue