99 lines
3.6 KiB
C#
99 lines
3.6 KiB
C#
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Microsoft Research Singularity - Singularity ABI
|
||
|
//
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//
|
||
|
// File: MemoryInfoService.cs
|
||
|
//
|
||
|
// Note:
|
||
|
//
|
||
|
|
||
|
using System.Runtime.CompilerServices;
|
||
|
|
||
|
namespace Microsoft.Singularity.V1.Services
|
||
|
{
|
||
|
//
|
||
|
// Design Issue: Singularity SysCalls should be generated from a description
|
||
|
// since there is tricky code here to ensure proper locking
|
||
|
// objects and validation of parameters occur.
|
||
|
//
|
||
|
public struct MemoryInfoService
|
||
|
{
|
||
|
//
|
||
|
// System call boundary must be unsafe to pass pointers
|
||
|
// to basic types across the GC domains. But this should not be
|
||
|
// directly accessable to application programs, but behind a
|
||
|
// trusted safe wrapper that validates parameters and
|
||
|
// enforces type safety.
|
||
|
//
|
||
|
[OutsideGCDomain]
|
||
|
[NoHeapAllocation]
|
||
|
[StackBound(1170)] // How do we get these values?
|
||
|
[MethodImpl(MethodImplOptions.InternalCall)]
|
||
|
internal static extern unsafe int MemoryUsageInfo(
|
||
|
ulong *totalMemoryFree,
|
||
|
ulong *totalMemoryInUse,
|
||
|
ulong *kernelHeapInUse,
|
||
|
ulong *kernelStackInUse,
|
||
|
ulong *totalSIPHeapInUse,
|
||
|
ulong *totalSIPStackInUse,
|
||
|
ulong *kernelStackReservation,
|
||
|
ulong *kernelHeapReservation
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// The signature offered to our caller is safe
|
||
|
//
|
||
|
public static int MemoryUsageInfo(
|
||
|
out ulong totalMemoryFree,
|
||
|
out ulong totalMemoryInUse,
|
||
|
out ulong kernelHeapInUse,
|
||
|
out ulong kernelStackInUse,
|
||
|
out ulong totalSIPHeapInUse,
|
||
|
out ulong totalSIPStackInUse,
|
||
|
out ulong kernelStackReservation,
|
||
|
out ulong kernelHeapReservation
|
||
|
)
|
||
|
{
|
||
|
int retval;
|
||
|
|
||
|
// This keeps unsafe blocks well contained
|
||
|
unsafe {
|
||
|
|
||
|
//
|
||
|
// Note: Would it be more efficient to declare local stack
|
||
|
// variables and reference these under fixed rather
|
||
|
// than locking the caller supplied references which
|
||
|
// may point to class fields and involve more complicated
|
||
|
// GC interactions?
|
||
|
//
|
||
|
fixed (ulong*
|
||
|
ptotalMemoryFree = &totalMemoryFree,
|
||
|
ptotalMemoryInUse = &totalMemoryInUse,
|
||
|
pkernelHeapInUse = &kernelHeapInUse,
|
||
|
pkernelStackInUse = &kernelStackInUse,
|
||
|
ptotalSIPHeapInUse = &totalSIPHeapInUse,
|
||
|
ptotalSIPStackInUse = &totalSIPStackInUse,
|
||
|
pkernelStackReservation = &kernelStackReservation,
|
||
|
pkernelHeapReservation = &kernelHeapReservation
|
||
|
) {
|
||
|
|
||
|
retval = MemoryInfoService.MemoryUsageInfo(
|
||
|
ptotalMemoryFree,
|
||
|
ptotalMemoryInUse,
|
||
|
pkernelHeapInUse,
|
||
|
pkernelStackInUse,
|
||
|
ptotalSIPHeapInUse,
|
||
|
ptotalSIPStackInUse,
|
||
|
pkernelStackReservation,
|
||
|
pkernelHeapReservation
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return retval;
|
||
|
}
|
||
|
}
|
||
|
}
|