From 665a9313a4338e53b0f4e29c6688ecbaeec60293 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Tue, 12 Nov 2024 18:11:09 -0800 Subject: [PATCH] Valgrind annotations for new free list --- ConflictSet.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/ConflictSet.cpp b/ConflictSet.cpp index c4b1a47..a642cd8 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -700,8 +700,6 @@ constexpr int64_t kMaxFreeListBytes = 1 << 20; // doesn't meet the capacity constraints, it's freed and a new node is allocated // with the minimum capacity. The hope is that "unfit" nodes don't get stuck in // the free list. -// -// TODO valgrind annotations template struct NodeAllocator { static_assert(std::derived_from); @@ -738,6 +736,7 @@ template struct NodeAllocator { p->parent = freeList; freeList = p; freeListSize += sizeof(T) + p->partialKeyCapacity; + VALGRIND_MAKE_MEM_NOACCESS(p, sizeof(T) + p->partialKeyCapacity); } void deferRelease(T *p, Node *forwardTo) { @@ -759,6 +758,13 @@ template struct NodeAllocator { void releaseDeferred() { if (deferredList != nullptr) { deferredListFront->parent = freeList; +#ifndef NVALGRIND + for (auto *iter = deferredList; iter != freeList;) { + auto *tmp = iter; + iter = (T *)iter->parent; + VALGRIND_MAKE_MEM_NOACCESS(tmp, sizeof(T) + tmp->partialKeyCapacity); + } +#endif freeList = std::exchange(deferredList, nullptr); } for (T *n = std::exchange(deferredListOverflow, nullptr); n != nullptr;) { @@ -779,6 +785,7 @@ template struct NodeAllocator { assert(deferredList == nullptr); assert(deferredListOverflow == nullptr); for (T *iter = freeList; iter != nullptr;) { + VALGRIND_MAKE_MEM_DEFINED(iter, sizeof(T)); auto *tmp = iter; iter = (T *)iter->parent; removeNode(tmp); @@ -796,6 +803,7 @@ private: T *allocate_helper(int minCapacity, int maxCapacity) { if (freeList != nullptr) { + VALGRIND_MAKE_MEM_DEFINED(freeList, sizeof(T)); freeListSize -= sizeof(T) + freeList->partialKeyCapacity; assume(freeList->partialKeyCapacity >= 0); assume(minCapacity >= 0); @@ -804,6 +812,11 @@ private: freeList->partialKeyCapacity <= maxCapacity) { auto *result = freeList; freeList = (T *)freeList->parent; + VALGRIND_MAKE_MEM_UNDEFINED(result, + sizeof(T) + result->partialKeyCapacity); + VALGRIND_MAKE_MEM_DEFINED(&result->partialKeyCapacity, + sizeof(result->partialKeyCapacity)); + VALGRIND_MAKE_MEM_DEFINED(&result->type, sizeof(result->type)); return result; } else { auto *p = freeList;