hlsf wrong slicing solving
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
//
|
||||
// -----------------------------------------------------------------------
|
||||
// -----------------------------------------------------------------------
|
||||
using System;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
@@ -50,6 +51,7 @@ namespace StgSharp.HighPerformance.Memory
|
||||
/// </returns>
|
||||
private bool AssertBackwardBoundary(ulong currentOffset, Entry* target, int level)
|
||||
{
|
||||
level = int.Min(level, MaxLevel);
|
||||
int nextLevelSize = levelSizeArray[level] * 4;
|
||||
ulong targetHead = target->Position - (ulong)m_Buffer;
|
||||
return (currentOffset / (ulong)nextLevelSize) == (targetHead / (ulong)nextLevelSize);
|
||||
@@ -72,6 +74,7 @@ namespace StgSharp.HighPerformance.Memory
|
||||
/// </returns>
|
||||
private bool AssertForwardBoundary(ulong currentOffset, Entry* target, int level)
|
||||
{
|
||||
level = int.Min(level, MaxLevel);
|
||||
int nextLevelSize = levelSizeArray[level] * 4;
|
||||
ulong targetTail = target->Position - (ulong)m_Buffer + target->Size - 1;
|
||||
return (currentOffset / (ulong)nextLevelSize) == (targetTail / (ulong)nextLevelSize);
|
||||
@@ -83,6 +86,7 @@ namespace StgSharp.HighPerformance.Memory
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private int DetermineSegmentIndex(uint size, int level)
|
||||
{
|
||||
level = int.Min(level, MaxLevel);
|
||||
return (int)(size - 1) / levelSizeArray[level];
|
||||
}
|
||||
|
||||
@@ -113,7 +117,7 @@ namespace StgSharp.HighPerformance.Memory
|
||||
int originLevel = entry->Level;
|
||||
int segment = DetermineSegmentIndex(size, originLevel);
|
||||
|
||||
RemoveFromBucket(originLevel, segment, (BucketNode*)entry->Position);
|
||||
// RemoveFromBucket(originLevel, segment, (BucketNode*)entry->Position);
|
||||
|
||||
do
|
||||
{
|
||||
@@ -121,8 +125,7 @@ namespace StgSharp.HighPerformance.Memory
|
||||
while (true)
|
||||
{
|
||||
// backward merging - simplified to single attempt
|
||||
ulong p = entry->PreviousNear;
|
||||
Entry* prev = (Entry*)p;
|
||||
Entry* prev = entry->PreviousNear;
|
||||
|
||||
// compute offset of current block and base position
|
||||
ulong currentOffset = entry->Position - (ulong)m_Buffer;
|
||||
@@ -138,23 +141,24 @@ namespace StgSharp.HighPerformance.Memory
|
||||
}
|
||||
|
||||
// Update linked list
|
||||
Entry* prevPrev = (Entry*)prev->PreviousNear;
|
||||
/*
|
||||
Entry* prevPrev = prev->PreviousNear;
|
||||
if (prevPrev != null) {
|
||||
prevPrev->NextNear = (ulong)entry;
|
||||
prevPrev->NextNear = entry;
|
||||
}
|
||||
entry->PreviousNear = (ulong)prevPrev;
|
||||
entry->PreviousNear = prevPrev;
|
||||
/**/
|
||||
|
||||
// Merge
|
||||
entry->Position = prev->Position;
|
||||
entry->Size += prev->Size;
|
||||
RecycleEntry(prev);
|
||||
RemoveFromPositionChain(prev);
|
||||
}
|
||||
|
||||
while (true)
|
||||
{
|
||||
// forward merging - simplified to single attempt
|
||||
ulong n = entry->NextNear;
|
||||
Entry* next = (Entry*)n;
|
||||
Entry* next = entry->NextNear;
|
||||
|
||||
ulong currentOffset = entry->Position - (ulong)m_Buffer;
|
||||
|
||||
@@ -169,15 +173,17 @@ namespace StgSharp.HighPerformance.Memory
|
||||
}
|
||||
|
||||
// Update linked list
|
||||
Entry* nextNext = (Entry*)next->NextNear;
|
||||
/*
|
||||
Entry* nextNext = next->NextNear;
|
||||
if (nextNext != null) {
|
||||
nextNext->PreviousNear = (ulong)entry;
|
||||
nextNext->PreviousNear = entry;
|
||||
}
|
||||
entry->NextNear = (ulong)nextNext;
|
||||
entry->NextNear = nextNext;
|
||||
/**/
|
||||
|
||||
// Merge
|
||||
entry->Size += next->Size;
|
||||
RecycleEntry(next);
|
||||
RemoveFromPositionChain(next);
|
||||
}
|
||||
entry->Level = GetLevelFromSize(entry->Size);
|
||||
} while (originLevel < entry->Level);
|
||||
@@ -189,8 +195,10 @@ namespace StgSharp.HighPerformance.Memory
|
||||
return;
|
||||
}
|
||||
|
||||
entry->PreviousNear = EmptyHandle;
|
||||
entry->NextNear = EmptyHandle;
|
||||
entry->PreviousNear = null;
|
||||
entry->NextNear = null;
|
||||
|
||||
// Console.WriteLine("entry recycled.");
|
||||
_entries.Free((nuint)entry);
|
||||
}
|
||||
|
||||
@@ -199,8 +207,8 @@ namespace StgSharp.HighPerformance.Memory
|
||||
/// </summary>
|
||||
private void RemoveFromPositionChain(Entry* entry)
|
||||
{
|
||||
Entry* prev = (Entry*)entry->PreviousNear;
|
||||
Entry* next = (Entry*)entry->NextNear;
|
||||
Entry* prev = entry->PreviousNear;
|
||||
Entry* next = entry->NextNear;
|
||||
|
||||
if (prev != null) {
|
||||
prev->NextNear = entry->NextNear;
|
||||
@@ -210,8 +218,10 @@ namespace StgSharp.HighPerformance.Memory
|
||||
}
|
||||
|
||||
// Clear node pointers
|
||||
entry->NextNear = EmptyHandle;
|
||||
entry->PreviousNear = EmptyHandle;
|
||||
entry->NextNear = null;
|
||||
entry->PreviousNear = null;
|
||||
|
||||
// Console.WriteLine("entry recycled.");
|
||||
_entries.Free((nuint)entry);
|
||||
}
|
||||
|
||||
@@ -223,11 +233,11 @@ namespace StgSharp.HighPerformance.Memory
|
||||
internal struct Entry
|
||||
{
|
||||
|
||||
[FieldOffset(8)] internal Entry* NextNear; // Position linked list: next pointer
|
||||
[FieldOffset(16)] internal Entry* PreviousNear; // Position linked list: previous pointer
|
||||
|
||||
[FieldOffset(28)] internal int Level; // Level of the block in the allocator
|
||||
[FieldOffset(24)] internal uint Size; // Block size information
|
||||
[FieldOffset(32)] internal ulong LockBuffer;
|
||||
[FieldOffset(8)] internal ulong NextNear; // Position linked list: next pointer
|
||||
[FieldOffset(16)] internal ulong PreviousNear; // Position linked list: previous pointer
|
||||
[FieldOffset(32)] public EntryState State;
|
||||
[FieldOffset(0)] public nuint Position; // Memory block position
|
||||
|
||||
@@ -246,7 +256,7 @@ namespace StgSharp.HighPerformance.Memory
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static bool IsNullOrEmptyEntryIndex(ulong index)
|
||||
{
|
||||
return index == EmptyHandle;
|
||||
return index == 0;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
|
||||
Reference in New Issue
Block a user