hlsf error is solving
This commit is contained in:
@@ -77,21 +77,14 @@ namespace StgSharp.HighPerformance.Memory
|
||||
throw new OverflowException("Out of memory: insufficient block size returned from spare memory.");
|
||||
}
|
||||
long remainder = handle->Size - requestedOffset;
|
||||
if (remainder > 0)
|
||||
{
|
||||
Entry* extra = (Entry*)_entries.Allocate();
|
||||
extra->Position = handle->Position + (nuint)requestedOffset;
|
||||
extra->Size = (uint)remainder;
|
||||
extra->State = EntryState.Empty;
|
||||
extra->NextNear = handle->NextNear;
|
||||
extra->PreviousNear = handle;
|
||||
extra->NextNear->PreviousNear = extra;
|
||||
extra->PreviousNear->NextNear = extra;
|
||||
SliceMemory(extra);
|
||||
}
|
||||
SetEntryLevel(handle, handle->Position, (uint)requestedOffset);
|
||||
handle->State = EntryState.Alloc;
|
||||
handle->Size = requestedOffset;
|
||||
handle->Level = level;
|
||||
if (remainder > 0) {
|
||||
SliceMemory(handle->NextNear, remainder);
|
||||
}
|
||||
}
|
||||
if (handle->PreviousNear == null || handle->NextNear == null) {
|
||||
throw new HLSFPositionChainBreakException();
|
||||
}
|
||||
return new hlsfHandle(handle, size);
|
||||
}
|
||||
@@ -103,14 +96,15 @@ namespace StgSharp.HighPerformance.Memory
|
||||
/// <param name="e">
|
||||
///
|
||||
/// </param>
|
||||
private void SliceMemory(Entry* e)
|
||||
/// <param name="sizeToSlice">
|
||||
///
|
||||
/// </param>
|
||||
private void SliceMemory(Entry* e, long sizeToSlice)
|
||||
{
|
||||
Entry* cur = e->PreviousNear;
|
||||
Entry* next = e->NextNear;
|
||||
long remain = e->Size;
|
||||
long offset = (long)e->Position - (long)m_Buffer;
|
||||
long end = offset + remain;
|
||||
_entries.Free((nuint)e);
|
||||
Entry* next = e;
|
||||
long remain = sizeToSlice; // remained size to slice
|
||||
long offset = (long)e->Position - sizeToSlice - (long)m_Buffer; // offset of buffer to slice
|
||||
long end = (long)e->Position - (long)m_Buffer; // end offset of buffer to slice
|
||||
|
||||
int i = (BitOperations.TrailingZeroCount(remain) - 6) / 2;
|
||||
i = int.Min(10, i);
|
||||
@@ -125,21 +119,15 @@ namespace StgSharp.HighPerformance.Memory
|
||||
int newSize = count * size;
|
||||
|
||||
Entry* newEntry = (Entry*)_entries.Allocate();
|
||||
newEntry->PreviousNear = cur;
|
||||
newEntry->NextNear = next;
|
||||
cur->NextNear = newEntry;
|
||||
next->PreviousNear = newEntry;
|
||||
newEntry->Position = (nuint)offset + (nuint)m_Buffer;
|
||||
InsertEntryBefore(newEntry, next);
|
||||
SetEntryLevel(newEntry, (nuint)offset + (nuint)m_Buffer, newSize);
|
||||
newEntry->State = EntryState.Empty;
|
||||
newEntry->Size = (uint)newSize;
|
||||
newEntry->Level = i;
|
||||
|
||||
BucketNode* b = (BucketNode*)newEntry->Position;
|
||||
b->EntryRef = newEntry;
|
||||
PushLevel(i, count - 1, b);
|
||||
PushBucketToLevel(i, count - 1, b);
|
||||
offset += newSize;
|
||||
remain -= (long)newSize;
|
||||
cur = newEntry;
|
||||
remain -= newSize;
|
||||
}
|
||||
if (remain <= 0) {
|
||||
return;
|
||||
@@ -157,19 +145,13 @@ namespace StgSharp.HighPerformance.Memory
|
||||
int newSize = count * upper;
|
||||
|
||||
Entry* newEntry = (Entry*)_entries.Allocate();
|
||||
newEntry->PreviousNear = cur;
|
||||
newEntry->NextNear = next;
|
||||
cur->NextNear = newEntry;
|
||||
next->PreviousNear = newEntry;
|
||||
newEntry->Position = (nuint)offset + (nuint)m_Buffer;
|
||||
InsertEntryBefore(newEntry, next);
|
||||
SetEntryLevel(newEntry, (nuint)offset + (nuint)m_Buffer, newSize);
|
||||
newEntry->State = EntryState.Empty;
|
||||
newEntry->Size = (uint)newSize;
|
||||
newEntry->Level = i;
|
||||
|
||||
BucketNode* b = (BucketNode*)newEntry->Position;
|
||||
b->EntryRef = newEntry;
|
||||
PushLevel(i, count - 1, b);
|
||||
cur = newEntry;
|
||||
PushBucketToLevel(i, count - 1, b);
|
||||
offset += newSize;
|
||||
remain -= (long)newSize;
|
||||
if (remain <= 0) {
|
||||
@@ -188,22 +170,15 @@ namespace StgSharp.HighPerformance.Memory
|
||||
int newSize = count * size;
|
||||
|
||||
Entry* newEntry = (Entry*)_entries.Allocate();
|
||||
newEntry->PreviousNear = cur;
|
||||
newEntry->NextNear = next;
|
||||
cur->NextNear = newEntry;
|
||||
next->PreviousNear = newEntry;
|
||||
newEntry->Position = (nuint)offset + (nuint)m_Buffer;
|
||||
InsertEntryBefore(newEntry, next);
|
||||
SetEntryLevel(newEntry, (nuint)offset + (nuint)m_Buffer, newSize);
|
||||
newEntry->State = EntryState.Empty;
|
||||
newEntry->Size = (uint)newSize;
|
||||
newEntry->Level = i;
|
||||
|
||||
BucketNode* b = (BucketNode*)newEntry->Position;
|
||||
b->EntryRef = newEntry;
|
||||
b->NextLevel = null;
|
||||
b->PreviousLevel = null;
|
||||
PushLevel(i, count - 1, b);
|
||||
|
||||
cur = newEntry;
|
||||
PushBucketToLevel(i, count - 1, b);
|
||||
offset += newSize;
|
||||
remain -= (long)newSize;
|
||||
}
|
||||
@@ -236,20 +211,15 @@ namespace StgSharp.HighPerformance.Memory
|
||||
|
||||
// build new entry
|
||||
Entry* e = (Entry*)_entries.Allocate();
|
||||
e->Position = pos;
|
||||
e->Size = size;
|
||||
Entry* prev = _spareMemory->PreviousNear;
|
||||
e->NextNear = _spareMemory;
|
||||
e->PreviousNear = prev;
|
||||
prev->NextNear = e;
|
||||
_spareMemory->PreviousNear = e;
|
||||
SetEntryLevel(e, pos, size);
|
||||
InsertEntryBefore(e, _spareMemory);
|
||||
e->State = EntryState.Empty;
|
||||
e->Level = GetLevelFromSize(size);
|
||||
|
||||
// set fields of spare memory
|
||||
_spareMemory->Size -= size;
|
||||
_spareMemory->Position += (nuint)size;
|
||||
|
||||
|
||||
handle = e;
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user