hlsf wrong slicing solving

This commit is contained in:
Youmu Liu
2025-11-26 20:52:12 +08:00
parent 23914f05ac
commit 83537c7be7
9 changed files with 108 additions and 172 deletions
@@ -108,7 +108,15 @@ namespace StgSharp.HighPerformance.Memory
/// </summary>
private void MergeAndRemoveFromBuckets(Entry* entry)
{
if (entry == null) {
// TODO
/*
* 1.有限回收,最多向上收集2层(算上当前总共3层)
* 2.单层内就可以通过前后链表遍历解决,很容易做到
* 3.由于SLAB分配器内部包含快速复用路径,因而可以考虑直接进行Free掉被合并的Entry。复用成本很低(因为SLAB既没有Version也没有IEnumerable,所以不会有额外的操作计数损耗)
* 4.后续提供HLSF.Collect全量整理API,从头遍历邻接块进行彻底的合并
*/
if (entry == null)
{
return;
}
@@ -130,14 +138,16 @@ namespace StgSharp.HighPerformance.Memory
// compute offset of current block and base position
ulong currentOffset = entry->Position - (ulong)m_Buffer;
if (prev == null ||
prev == _spareMemory ||
!AssertBackwardBoundary(currentOffset, prev, originLevel) ||
!IsAdjacentTo(entry, prev) ||
entry->Level != prev->Level ||
!TryRemoveFromBucket(originLevel, DetermineSegmentIndex(prev->Size, originLevel), (BucketNode*)prev->Position))
if (prev != null &&
prev != _spareMemory &&
AssertBackwardBoundary(currentOffset, prev, originLevel) &&
IsAdjacentTo(entry, prev) &&
TryRemoveFromBucket(originLevel, DetermineSegmentIndex(prev->Size, originLevel), (BucketNode*)prev->Position))
{
break;
// Merge
entry->Position = prev->Position;
entry->Size += prev->Size;
RemoveFromPositionChain(prev);
}
// Update linked list
@@ -148,11 +158,6 @@ namespace StgSharp.HighPerformance.Memory
}
entry->PreviousNear = prevPrev;
/**/
// Merge
entry->Position = prev->Position;
entry->Size += prev->Size;
RemoveFromPositionChain(prev);
}
while (true)
@@ -189,19 +194,6 @@ namespace StgSharp.HighPerformance.Memory
} while (originLevel < entry->Level);
}
private void RecycleEntry(Entry* entry)
{
if (entry is null) {
return;
}
entry->PreviousNear = null;
entry->NextNear = null;
// Console.WriteLine("entry recycled.");
_entries.Free((nuint)entry);
}
/// <summary>
/// Remove node from position linked list
/// </summary>
@@ -246,6 +238,7 @@ namespace StgSharp.HighPerformance.Memory
internal enum EntryState : uint
{
Spare,
Empty,
Allocated