HLSf use nuint rather than long, L4 now uses hlsf rather than array to alloc cache line.

This commit is contained in:
Youmu Liu
2026-04-20 18:10:14 +08:00
parent 1b7c929be4
commit 2e2d64a2ce
38 changed files with 796 additions and 465 deletions
@@ -2,8 +2,8 @@
// -----------------------------------------------------------------------
// file="HLSFAllocator.BucketNode"
// Project: StgSharp
// AuthorGroup: Nitload Space
// Copyright (c) Nitload Space. All rights reserved.
// AuthorGroup: Nitload
// Copyright (c) Nitload. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
@@ -30,18 +30,22 @@ using System.Reflection.Metadata;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace StgSharp.Mathematics.Memory
namespace StgSharp.HighPerformance.Memory
{
public unsafe partial class HybridLayerSegregatedFitAllocator
{
private void PushBucketToLevel(int levelIndex, int sizeIndex, BucketNode* node)
private void PushBucketToLevel(
int levelIndex,
int sizeIndex,
BucketNode* node
)
{
if (node == null || node->EntryRef == null) {
if ((node == null) || (node->EntryRef == null)) {
return;
}
Index index = (levelIndex > MaxLevel) ? ^1 : (3 * levelIndex) + sizeIndex;
Index index = (levelIndex > MaxLevel) ? (^1) : ((3 * levelIndex) + sizeIndex);
if (_bucketHeads[index] is null)
{
_bucketHeads[index] = node;
@@ -69,9 +73,13 @@ namespace StgSharp.Mathematics.Memory
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void RemoveFromBucket(int levelIndex, int sizeIndex, BucketNode* node)
private void RemoveFromBucket(
int levelIndex,
int sizeIndex,
BucketNode* node
)
{
Index index = (levelIndex > MaxLevel) ? ^1 : (3 * levelIndex) + sizeIndex;
Index index = (levelIndex > MaxLevel) ? (^1) : ((3 * levelIndex) + sizeIndex);
if (_bucketHeads[index] == node)
{
if (TryPopLevel(levelIndex, sizeIndex, out _)) {
@@ -94,9 +102,13 @@ namespace StgSharp.Mathematics.Memory
return;
}
private bool TryPopLevel(int levelIndex, int sizeIndex, out BucketNode* node)
private bool TryPopLevel(
int levelIndex,
int sizeIndex,
out BucketNode* node
)
{
Index index = levelIndex > MaxLevel ? ^1 : (3 * levelIndex) + sizeIndex;
Index index = (levelIndex > MaxLevel) ? (^1) : ((3 * levelIndex) + sizeIndex);
BucketNode* head = _bucketHeads[index];
@@ -125,9 +137,13 @@ namespace StgSharp.Mathematics.Memory
return true;
}
private bool TryRemoveFromBucket(int levelIndex, int sizeIndex, BucketNode* node)
private bool TryRemoveFromBucket(
int levelIndex,
int sizeIndex,
BucketNode* node
)
{
Index index = levelIndex > 9 ? ^1 : (3 * levelIndex) + sizeIndex;
Index index = (levelIndex > 9) ? (^1) : ((3 * levelIndex) + sizeIndex);
if (_bucketHeads[index] == node)
{
bool ok = TryPopLevel(levelIndex, sizeIndex, out _);