mirror of
https://git.743378673.xyz/MeloNX/MeloNX.git
synced 2025-07-16 20:26:29 +02:00
Move solution and projects to src
This commit is contained in:
parent
cd124bda58
commit
cee7121058
3466 changed files with 55 additions and 55 deletions
58
src/ARMeilleure/Memory/ReservedRegion.cs
Normal file
58
src/ARMeilleure/Memory/ReservedRegion.cs
Normal file
|
@ -0,0 +1,58 @@
|
|||
using System;
|
||||
|
||||
namespace ARMeilleure.Memory
|
||||
{
|
||||
class ReservedRegion
|
||||
{
|
||||
public const int DefaultGranularity = 65536; // Mapping granularity in Windows.
|
||||
|
||||
public IJitMemoryBlock Block { get; }
|
||||
|
||||
public IntPtr Pointer => Block.Pointer;
|
||||
|
||||
private readonly ulong _maxSize;
|
||||
private readonly ulong _sizeGranularity;
|
||||
private ulong _currentSize;
|
||||
|
||||
public ReservedRegion(IJitMemoryAllocator allocator, ulong maxSize, ulong granularity = 0)
|
||||
{
|
||||
if (granularity == 0)
|
||||
{
|
||||
granularity = DefaultGranularity;
|
||||
}
|
||||
|
||||
Block = allocator.Reserve(maxSize);
|
||||
_maxSize = maxSize;
|
||||
_sizeGranularity = granularity;
|
||||
_currentSize = 0;
|
||||
}
|
||||
|
||||
public void ExpandIfNeeded(ulong desiredSize)
|
||||
{
|
||||
if (desiredSize > _maxSize)
|
||||
{
|
||||
throw new OutOfMemoryException();
|
||||
}
|
||||
|
||||
if (desiredSize > _currentSize)
|
||||
{
|
||||
// Lock, and then check again. We only want to commit once.
|
||||
lock (this)
|
||||
{
|
||||
if (desiredSize >= _currentSize)
|
||||
{
|
||||
ulong overflowBytes = desiredSize - _currentSize;
|
||||
ulong moreToCommit = (((_sizeGranularity - 1) + overflowBytes) / _sizeGranularity) * _sizeGranularity; // Round up.
|
||||
Block.Commit(_currentSize, moreToCommit);
|
||||
_currentSize += moreToCommit;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Block.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue