ServiceMemoryGates.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WCF / System.ServiceModel.Activation / System / ServiceModel / Activation / ServiceMemoryGates.cs / 1305376 / ServiceMemoryGates.cs

                            //---------------------------------------------------------------------------- 
// Copyright (c) Microsoft Corporation.  All rights reserved.
//---------------------------------------------------------------------------
namespace System.ServiceModel.Activation
{ 
    using System.ComponentModel;
    using System.Runtime; 
    using System.Runtime.CompilerServices; 
    using System.Runtime.InteropServices;
    using System.Security; 
    using System.ServiceModel.Channels;
    using System.Threading;

    static class ServiceMemoryGates 
    {
        [Fx.Tag.SecurityNote(Critical = "Uses SecurityCritical helper methods to check memory status." + 
            "Allocates unmanaged resources, can only be called with admin-specified value.")] 
        [SecurityCritical]
        internal static void Check(int minFreeMemoryPercentage) 
        {
            // Boundary check percentage, if out of bounds Gate is turned off.
            // 0 is defined as disabled. Configuration defines 99 as max allowed so we disable
            // if we receive something out of range 
            if (minFreeMemoryPercentage < 1 || minFreeMemoryPercentage > 99)
            { 
                return; 
            }
 
            UnsafeNativeMethods.MEMORYSTATUSEX memoryStatus = new UnsafeNativeMethods.MEMORYSTATUSEX();
            GetGlobalMemoryStatus(ref memoryStatus);

            ulong threshold = memoryStatus.ullTotalPageFile / 100 * (ulong)minFreeMemoryPercentage; 
            if (memoryStatus.ullAvailPageFile < threshold)
            { 
                // Yield this thread -- this will also ensure that we have a full time slice when we 
                // do our alloc/free
                Thread.Sleep(0); 

                // Commit 1.5 times of the threshold. This should force the page file to grow, if
                // possible. (GlobalMemoryStatusEx only returns information about the current pagefile,
                // not about the maximum pagefile.) 
                uint sizeToAlloc = 0;
                if (threshold < (ulong)int.MaxValue) 
                { 
                    sizeToAlloc = (uint)threshold / 2 * 3;
                } 

                if (sizeToAlloc > 0)
                {
                    ForcePageFileToGrow(sizeToAlloc); 

                    GetGlobalMemoryStatus(ref memoryStatus); 
                    threshold = memoryStatus.ullTotalPageFile / 100 * (ulong)minFreeMemoryPercentage; 
                }
 
                if (memoryStatus.ullAvailPageFile < threshold)
                {
                    throw FxTrace.Exception.AsError(new InsufficientMemoryException(
                        SR.Hosting_MemoryGatesCheckFailed(memoryStatus.ullAvailPageFile, 
                        minFreeMemoryPercentage)));
                } 
            } 
        }
 
        [Fx.Tag.SecurityNote(Critical = "Uses UnsafeNativeMethods, caller must guard parameter.")]
        [SecurityCritical]
        static void ForcePageFileToGrow(uint sizeToAlloc)
        { 
            RuntimeHelpers.PrepareConstrainedRegions();
            try 
            {} 
            finally
            { 
                // We don't care if this actually succeeds or not, we are just trying to grow the page
                // file.
                IntPtr ptr = UnsafeNativeMethods.VirtualAlloc(IntPtr.Zero, (UIntPtr)sizeToAlloc, UnsafeNativeMethods.MEM_COMMIT,
                    (uint)UnsafeNativeMethods.PAGE_READWRITE); 

                if (ptr != IntPtr.Zero) 
                { 
                    UnsafeNativeMethods.VirtualFree(ptr, (UIntPtr)sizeToAlloc, UnsafeNativeMethods.MEM_DECOMMIT);
                } 
            }
        }

        [Fx.Tag.SecurityNote(Critical = "Uses UnsafeNativeMethods to fetch memory status structure, caller must not leak it.")] 
        [SecurityCritical]
        static void GetGlobalMemoryStatus(ref UnsafeNativeMethods.MEMORYSTATUSEX memoryStatus) 
        { 
            memoryStatus.dwLength = (uint)Marshal.SizeOf(typeof(UnsafeNativeMethods.MEMORYSTATUSEX));
 
            if (!UnsafeNativeMethods.GlobalMemoryStatusEx(ref memoryStatus))
            {
                int error = Marshal.GetLastWin32Error();
                // Treat as the worst case. 
                throw FxTrace.Exception.AsError(
                    new InvalidOperationException(SR.Hosting_GetGlobalMemoryFailed, new Win32Exception(error))); 
            } 
        }
    } 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//---------------------------------------------------------------------------- 
// Copyright (c) Microsoft Corporation.  All rights reserved.
//---------------------------------------------------------------------------
namespace System.ServiceModel.Activation
{ 
    using System.ComponentModel;
    using System.Runtime; 
    using System.Runtime.CompilerServices; 
    using System.Runtime.InteropServices;
    using System.Security; 
    using System.ServiceModel.Channels;
    using System.Threading;

    static class ServiceMemoryGates 
    {
        [Fx.Tag.SecurityNote(Critical = "Uses SecurityCritical helper methods to check memory status." + 
            "Allocates unmanaged resources, can only be called with admin-specified value.")] 
        [SecurityCritical]
        internal static void Check(int minFreeMemoryPercentage) 
        {
            // Boundary check percentage, if out of bounds Gate is turned off.
            // 0 is defined as disabled. Configuration defines 99 as max allowed so we disable
            // if we receive something out of range 
            if (minFreeMemoryPercentage < 1 || minFreeMemoryPercentage > 99)
            { 
                return; 
            }
 
            UnsafeNativeMethods.MEMORYSTATUSEX memoryStatus = new UnsafeNativeMethods.MEMORYSTATUSEX();
            GetGlobalMemoryStatus(ref memoryStatus);

            ulong threshold = memoryStatus.ullTotalPageFile / 100 * (ulong)minFreeMemoryPercentage; 
            if (memoryStatus.ullAvailPageFile < threshold)
            { 
                // Yield this thread -- this will also ensure that we have a full time slice when we 
                // do our alloc/free
                Thread.Sleep(0); 

                // Commit 1.5 times of the threshold. This should force the page file to grow, if
                // possible. (GlobalMemoryStatusEx only returns information about the current pagefile,
                // not about the maximum pagefile.) 
                uint sizeToAlloc = 0;
                if (threshold < (ulong)int.MaxValue) 
                { 
                    sizeToAlloc = (uint)threshold / 2 * 3;
                } 

                if (sizeToAlloc > 0)
                {
                    ForcePageFileToGrow(sizeToAlloc); 

                    GetGlobalMemoryStatus(ref memoryStatus); 
                    threshold = memoryStatus.ullTotalPageFile / 100 * (ulong)minFreeMemoryPercentage; 
                }
 
                if (memoryStatus.ullAvailPageFile < threshold)
                {
                    throw FxTrace.Exception.AsError(new InsufficientMemoryException(
                        SR.Hosting_MemoryGatesCheckFailed(memoryStatus.ullAvailPageFile, 
                        minFreeMemoryPercentage)));
                } 
            } 
        }
 
        [Fx.Tag.SecurityNote(Critical = "Uses UnsafeNativeMethods, caller must guard parameter.")]
        [SecurityCritical]
        static void ForcePageFileToGrow(uint sizeToAlloc)
        { 
            RuntimeHelpers.PrepareConstrainedRegions();
            try 
            {} 
            finally
            { 
                // We don't care if this actually succeeds or not, we are just trying to grow the page
                // file.
                IntPtr ptr = UnsafeNativeMethods.VirtualAlloc(IntPtr.Zero, (UIntPtr)sizeToAlloc, UnsafeNativeMethods.MEM_COMMIT,
                    (uint)UnsafeNativeMethods.PAGE_READWRITE); 

                if (ptr != IntPtr.Zero) 
                { 
                    UnsafeNativeMethods.VirtualFree(ptr, (UIntPtr)sizeToAlloc, UnsafeNativeMethods.MEM_DECOMMIT);
                } 
            }
        }

        [Fx.Tag.SecurityNote(Critical = "Uses UnsafeNativeMethods to fetch memory status structure, caller must not leak it.")] 
        [SecurityCritical]
        static void GetGlobalMemoryStatus(ref UnsafeNativeMethods.MEMORYSTATUSEX memoryStatus) 
        { 
            memoryStatus.dwLength = (uint)Marshal.SizeOf(typeof(UnsafeNativeMethods.MEMORYSTATUSEX));
 
            if (!UnsafeNativeMethods.GlobalMemoryStatusEx(ref memoryStatus))
            {
                int error = Marshal.GetLastWin32Error();
                // Treat as the worst case. 
                throw FxTrace.Exception.AsError(
                    new InvalidOperationException(SR.Hosting_GetGlobalMemoryFailed, new Win32Exception(error))); 
            } 
        }
    } 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK