singrdk/base/Kernel/Singularity/Eventing/UnmanagedBuffer.cs

102 lines
2.6 KiB
C#

////////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// File: UnmanagedBuffer.cs
//
// Note:
//
using System;
using System.Threading;
using System.Runtime.CompilerServices;
using Microsoft.Singularity;
using Microsoft.Singularity.V1.Services;
namespace Microsoft.Singularity.Eventing
{
[CLSCompliant(false)]
public class UnmanagedMemoryBuffer {
public UnmanagedMemoryBuffer Link;
private ulong BufferSize;
private unsafe byte * bufferMemory;
public UnmanagedMemoryBuffer()
{
Link = null;
}
public unsafe byte * GetBuffer() {
return bufferMemory;
}
public ulong GetSize() {
return BufferSize;
}
public bool AllocateBuffer(ulong Size)
{
unsafe {
// Allocate the memory indicated as parameter, as nonGC
#if SINGULARITY_KERNEL
UIntPtr pages = Microsoft.Singularity.Memory.MemoryManager.PagesFromBytes(Size);
bufferMemory = (byte *)Microsoft.Singularity.Memory.MemoryManager.KernelAllocate(
pages, null, 0, System.GCs.PageType.NonGC).ToPointer();
// Allocation at page granularity. Preserve the actual size of the buffer
BufferSize = (ulong)pages * Microsoft.Singularity.Memory.MemoryManager.PageSize;
#else // !SINGULARITY_KERNEL
bufferMemory = (byte *)PageTableService.Allocate(Size);
BufferSize = Size;
#endif //SINGULARITY_KERNEL
if (bufferMemory == null) {
BufferSize = 0;
return false;
}
}
return true;
}
~UnmanagedMemoryBuffer()
{
unsafe {
// Allocate the memory indicated as parameter, as nonGC
#if SINGULARITY_KERNEL
UIntPtr pages = Microsoft.Singularity.Memory.MemoryManager.PagesFromBytes(BufferSize);
if (bufferMemory != null) {
Microsoft.Singularity.Memory.MemoryManager.KernelFree((UIntPtr)bufferMemory, pages, null);
}
#else // !SINGULARITY_KERNEL
if (bufferMemory != null) {
PageTableService.Free((UIntPtr)bufferMemory, BufferSize);
}
#endif //SINGULARITY_KERNEL
}
}
}
}