singrdk/base/Libraries/Singularity.V1/Services/MemoryInfoService.cs

99 lines
3.6 KiB
C#
Raw Permalink Normal View History

2008-11-17 18:29:00 -05:00
////////////////////////////////////////////////////////////////////////////////
//
// 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;
}
}
}