[compiler-rt] [scudo] Separated committed and decommitted entries. (PR #101409)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 1 21:43:22 PDT 2024
================
@@ -475,66 +506,86 @@ template <typename Config> class MapAllocatorCache {
u32 FreeIndex = AvailableHead;
AvailableHead = Entries[AvailableHead].Next;
- if (EntriesCount == 0) {
- LRUTail = static_cast<u16>(FreeIndex);
- } else {
- // Check list order
- if (EntriesCount > 1)
- DCHECK_GE(Entries[LRUHead].Time, Entries[Entries[LRUHead].Next].Time);
- Entries[LRUHead].Prev = static_cast<u16>(FreeIndex);
- }
-
Entries[FreeIndex] = Entry;
- Entries[FreeIndex].Next = LRUHead;
- Entries[FreeIndex].Prev = CachedBlock::InvalidEntry;
- LRUHead = static_cast<u16>(FreeIndex);
+ pushFront(FreeIndex, ListType);
EntriesCount++;
+ if (Entries[EntryLists[ListType].Head].Next != CachedBlock::InvalidEntry) {
+ DCHECK_GE(Entries[EntryLists[ListType].Head].Time,
+ Entries[Entries[EntryLists[ListType].Head].Next].Time);
+ }
// Availability stack should not have available entries when all entries
// are in use
if (EntriesCount == Config::getEntriesArraySize())
DCHECK_EQ(AvailableHead, CachedBlock::InvalidEntry);
}
- void remove(uptr I) REQUIRES(Mutex) {
- DCHECK(Entries[I].isValid());
-
- Entries[I].invalidate();
-
- if (I == LRUHead)
- LRUHead = Entries[I].Next;
+ // Joins the entries adjacent to Entries[I], effectively
+ // unlinking Entries[I] from the list
+ void unlink(uptr I, EntryListT ListType) REQUIRES(Mutex) {
+ if (I == EntryLists[ListType].Head)
+ EntryLists[ListType].Head = Entries[I].Next;
else
Entries[Entries[I].Prev].Next = Entries[I].Next;
- if (I == LRUTail)
- LRUTail = Entries[I].Prev;
+ if (I == EntryLists[ListType].Tail)
+ EntryLists[ListType].Tail = Entries[I].Prev;
else
Entries[Entries[I].Next].Prev = Entries[I].Prev;
+ }
+ // Invalidates Entries[I], removes Entries[I] from list, and pushes
+ // Entries[I] onto the stack of available entries
+ void remove(uptr I, EntryListT ListType) REQUIRES(Mutex) {
+ DCHECK(Entries[I].isValid());
+
+ Entries[I].invalidate();
+
+ unlink(I, ListType);
Entries[I].Next = AvailableHead;
AvailableHead = static_cast<u16>(I);
EntriesCount--;
// Cache should not have valid entries when not empty
if (EntriesCount == 0) {
- DCHECK_EQ(LRUHead, CachedBlock::InvalidEntry);
- DCHECK_EQ(LRUTail, CachedBlock::InvalidEntry);
+ DCHECK_EQ(EntryLists[COMMITTED].Head, CachedBlock::InvalidEntry);
+ DCHECK_EQ(EntryLists[COMMITTED].Tail, CachedBlock::InvalidEntry);
+ DCHECK_EQ(EntryLists[DECOMMITTED].Head, CachedBlock::InvalidEntry);
+ DCHECK_EQ(EntryLists[DECOMMITTED].Tail, CachedBlock::InvalidEntry);
}
}
+ inline void pushFront(uptr I, EntryListT ListType) REQUIRES(Mutex) {
+ if (EntryLists[ListType].Tail == CachedBlock::InvalidEntry)
+ EntryLists[ListType].Tail = static_cast<u16>(I);
----------------
ChiaHungDuan wrote:
In this case, it's an empty list and we need to update both Head and Tail
https://github.com/llvm/llvm-project/pull/101409
More information about the llvm-commits
mailing list