working on L4's tlsf

This commit is contained in:
Youmu Liu
2026-05-14 20:15:07 +08:00
parent c9fb11b47b
commit b87943495d
5 changed files with 126 additions and 139 deletions
@@ -51,12 +51,57 @@ namespace StgSharp.HighPerformance.Memory
}
[StructLayout(LayoutKind.Explicit, Size = 64, Pack = 64)]
private unsafe struct CacheLineHead
internal enum AllocationState : byte
{
[FieldOffset(0)] internal Tlsf.Handle AllocatorEntry;
[FieldOffset(0)] internal readonly M512 Buffer;
SpareOrCollect = 0,
Free = 1,
Alloc = 2,
}
[StructLayout(LayoutKind.Explicit, Size = 64, Pack = 64)]
private unsafe struct CacheLineMetadata
{
#region lsf area
internal const ulong Mask48Bits = 0x0000FFFFFFFFFFFF;
[FieldOffset(0)] private readonly M512 FillingMask;
[FieldOffset(16)] private ulong PositionMask;
[FieldOffset(24)] private ulong SizeMask;
[FieldOffset(30)] internal AllocationState State;
[FieldOffset(31)] internal sbyte Level;
[FieldOffset(0)] public int NextLevel;
[FieldOffset(4)] public int NextNear;
[FieldOffset(8)] public int PreviousLevel;
[FieldOffset(12)] public int PreviousNear;
public Ptr64 Position
{
readonly get => PositionMask;
set => PositionMask = value;
}
public Ptr64 SizeForAllocator
{
readonly get => (Ptr64)(SizeMask & Mask48Bits);
set => SizeMask = (SizeMask & ~Mask48Bits) | ((ulong)value & Mask48Bits);
}
public Ptr64 SizeForSpare
{
readonly get => SizeMask;
set => SizeMask = value;
}
public static uint SizeOf { get; } = (uint)Unsafe.SizeOf<CacheLineMetadata>();
#endregion
#region reference counting and state information
@@ -65,21 +110,13 @@ namespace StgSharp.HighPerformance.Memory
#endregion
#region hlsf entry alias
public readonly Ptr64 Address => AllocatorEntry.Address;
public readonly Ptr64 Size => AllocatorEntry.Size;
#endregion
#region cache line information
[FieldOffset(32)] internal short Predictor;
[FieldOffset(34)] internal ushort Profile;
[FieldOffset(36)] internal nuint Origin;
#endregion
#endregion
}
}