[compiler-rt] [scudo] Added test fixture for cache tests. (PR #102230)
Christopher Ferris via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 6 15:11:48 PDT 2024
================
@@ -265,3 +265,99 @@ TEST_F(MapAllocatorWithReleaseTest, SecondaryThreadsRace) {
Allocator->getStats(&Str);
Str.output();
}
+
+struct MapAllocatorCacheTest : public Test {
+ static constexpr scudo::u32 MarkerBytes = 0xDEADBEEF;
+
+ static void testUnmapCallback(scudo::MemMapT &MemMap) {
+ scudo::u32 *Ptr = reinterpret_cast<scudo::u32 *>(MemMap.getBase());
+ *Ptr = MarkerBytes;
+ }
+
+ using Config = scudo::DefaultConfig;
+ using SecondaryConfig = scudo::SecondaryConfig<Config>;
+ using CacheConfig = SecondaryConfig::CacheConfig;
+ using CacheT = scudo::MapAllocatorCache<CacheConfig, testUnmapCallback>;
+
+ std::unique_ptr<CacheT> Cache = std::make_unique<CacheT>();
+
+ const scudo::uptr PageSize = scudo::getPageSizeCached();
+ static constexpr scudo::uptr DefaultAllocSize = scudo::uptr(1U) << 16;
+
+ scudo::Options Options = getOptionsForConfig<SecondaryConfig>();
+
+ void SetUp() override { Cache->init(/*ReleaseToOsInterval=*/-1); }
+
+ void TearDown() override { Cache->unmapTestOnly(); }
+
+ scudo::MemMapT allocate(scudo::uptr Size) {
+ scudo::uptr MapSize = scudo::roundUp(Size, PageSize);
+ scudo::ReservedMemoryT ReservedMemory;
+ CHECK(ReservedMemory.create(0U, MapSize, nullptr, MAP_ALLOWNOMEM));
+
+ scudo::MemMapT MemMap = ReservedMemory.dispatch(
+ ReservedMemory.getBase(), ReservedMemory.getCapacity());
+ MemMap.remap(MemMap.getBase(), MemMap.getCapacity(), "scudo:test",
+ MAP_RESIZABLE | MAP_ALLOWNOMEM);
+ return MemMap;
+ }
+
+ void fillCacheWithSameSizeBlocks(std::vector<scudo::MemMapT> &MemMaps,
+ scudo::uptr NumEntries, scudo::uptr Size) {
+ for (scudo::uptr I = 0; I < NumEntries; I++)
+ MemMaps.emplace_back(allocate(Size));
+ for (scudo::uptr I = 0; I < NumEntries; I++) {
+ scudo::MemMapT &MemMap = MemMaps[I];
+ Cache->store(Options, MemMap.getBase(), MemMap.getCapacity(),
+ MemMap.getBase(), MemMap);
+ }
+ }
+};
+
+TEST_F(MapAllocatorCacheTest, CacheOrder) {
+ std::vector<scudo::MemMapT> MemMaps;
----------------
cferris1000 wrote:
That's fine with me. Since this is in only two tests, it's not too bad to copy it. But if you are adding more new tests with this, I would recommend the cleanup go in a cleanup function. Or, if you really wanted to be tricky, there is a way to do this with a vector of unique_ptrs and a custom destroy function. But that feels like overkill.
https://github.com/llvm/llvm-project/pull/102230
More information about the llvm-commits
mailing list