hlsf error is solving
This commit is contained in:
@@ -61,12 +61,32 @@ namespace StgSharp.HighPerformance.Memory
|
||||
/// Determine segment index based on size and originLevel
|
||||
/// </summary>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private int DetermineSegmentIndex(long size, int level)
|
||||
private static int DetermineSegmentIndex(long size, int level)
|
||||
{
|
||||
level = int.Min(level, MaxLevel);
|
||||
return (int)((size - 1) / levelSizeArray[level]);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static void InsertEntryAfter(Entry* entry, Entry* position)
|
||||
{
|
||||
Entry* next = position->NextNear;
|
||||
entry->NextNear = next;
|
||||
entry->PreviousNear = position;
|
||||
next->PreviousNear = entry;
|
||||
position->NextNear = entry;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static void InsertEntryBefore(Entry* entry, Entry* position)
|
||||
{
|
||||
Entry* prev = position->PreviousNear;
|
||||
entry->NextNear = position;
|
||||
entry->PreviousNear = prev;
|
||||
prev->NextNear = entry;
|
||||
position->PreviousNear = entry;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Used in Free operations, efficiently remove from buckets and merge adjacent blocks.
|
||||
/// Current Entry will serve as the final merged block. The Merge will be in lazy
|
||||
@@ -74,12 +94,52 @@ namespace StgSharp.HighPerformance.Memory
|
||||
/// </summary>
|
||||
private void MergeAndRemoveFromBuckets(Entry* entry)
|
||||
{
|
||||
// TODO 后续提供HLSF.Collect全量整理API,从头遍历邻接块进行彻底的合并
|
||||
if (entry == null)
|
||||
{
|
||||
if (entry == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
Console.WriteLine("============ Merge start =======================");
|
||||
try
|
||||
{
|
||||
Console.WriteLine("forward from entry");
|
||||
Entry* __cur = entry;
|
||||
int __cnt = 0;
|
||||
while (__cur != null && __cur != _spareMemory && __cnt < 512)
|
||||
{
|
||||
Console.WriteLine(EntryToString(__cur));
|
||||
__cur = __cur->NextNear;
|
||||
__cnt++;
|
||||
if (__cur == entry)
|
||||
{
|
||||
Console.WriteLine("(looped back to start)");
|
||||
break;
|
||||
}
|
||||
}
|
||||
Console.WriteLine(EntryToString(__cur));
|
||||
Console.WriteLine("MergeAndRemoveFromBuckets: backward from entry");
|
||||
__cur = entry;
|
||||
__cnt = 0;
|
||||
while (__cur != null && __cur != _spareMemory && __cnt < 512)
|
||||
{
|
||||
Console.WriteLine(EntryToString(__cur));
|
||||
__cur = __cur->PreviousNear;
|
||||
__cnt++;
|
||||
if (__cur == entry)
|
||||
{
|
||||
Console.WriteLine("(looped back to start)");
|
||||
break;
|
||||
}
|
||||
}
|
||||
Console.WriteLine(EntryToString(__cur));
|
||||
}
|
||||
catch { }
|
||||
finally
|
||||
{
|
||||
Console.WriteLine("==========================================");
|
||||
}
|
||||
/**/
|
||||
|
||||
long size = entry->Size;
|
||||
int originLevel = entry->Level;
|
||||
int segment = DetermineSegmentIndex(size, originLevel);
|
||||
@@ -88,8 +148,8 @@ namespace StgSharp.HighPerformance.Memory
|
||||
// previous direction merge
|
||||
Entry* p = entry->PreviousNear;
|
||||
if (p == null ||
|
||||
p == _spareMemory ||
|
||||
p->State != EntryState.Empty ||
|
||||
!AssertAdjacentTo(entry, p) ||
|
||||
p->Level != entry->Level ||
|
||||
!AssertBoundary(p, entry, originLevel))
|
||||
{
|
||||
@@ -108,8 +168,8 @@ namespace StgSharp.HighPerformance.Memory
|
||||
// next direction merge
|
||||
Entry* n = entry->NextNear;
|
||||
if (n == null ||
|
||||
n == _spareMemory ||
|
||||
n->State != EntryState.Empty ||
|
||||
!AssertAdjacentTo(entry, n) ||
|
||||
n->Level != entry->Level ||
|
||||
!AssertBoundary(n, entry, originLevel))
|
||||
{
|
||||
@@ -149,6 +209,14 @@ namespace StgSharp.HighPerformance.Memory
|
||||
_entries.Free((nuint)entry);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static void SetEntryLevel(Entry* entry, nuint position, long size)
|
||||
{
|
||||
entry ->Position = position;
|
||||
entry->Size = size;
|
||||
entry->Level = GetLevelFromSize(size);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Entry structure - streamlined version (only position and state information) Stored in
|
||||
/// external SLAB
|
||||
|
||||
Reference in New Issue
Block a user