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
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- HtmlContainerControl.cs
- ECDiffieHellmanCngPublicKey.cs
- MeshGeometry3D.cs
- Link.cs
- safesecurityhelperavalon.cs
- XmlSchemaSimpleTypeUnion.cs
- PropertyPathWorker.cs
- WindowsStatusBar.cs
- AdPostCacheSubstitution.cs
- MethodToken.cs
- CodeActivity.cs
- CompatibleIComparer.cs
- CodeTypeParameter.cs
- MetaModel.cs
- CqlWriter.cs
- MethodBuilder.cs
- DocumentSequence.cs
- EmptyStringExpandableObjectConverter.cs
- ProcessModelSection.cs
- MemberPath.cs
- ArrayTypeMismatchException.cs
- StatusBar.cs
- RoutedEventArgs.cs
- StorageEntitySetMapping.cs
- Misc.cs
- WorkflowApplicationUnhandledExceptionEventArgs.cs
- XmlTextAttribute.cs
- OpenTypeLayout.cs
- JavaScriptObjectDeserializer.cs
- SerializationEventsCache.cs
- XMLSyntaxException.cs
- HtmlTableRowCollection.cs
- BuildProviderAppliesToAttribute.cs
- HighlightComponent.cs
- NetworkInformationPermission.cs
- MediaPlayer.cs
- NotImplementedException.cs
- SqlInternalConnectionTds.cs
- mansign.cs
- ProcessManager.cs
- EntityViewGenerationConstants.cs
- ComponentEditorPage.cs
- Range.cs
- SqlConnectionHelper.cs
- SystemIdentity.cs
- TimeSpan.cs
- WebCategoryAttribute.cs
- WebPartZone.cs
- ControlPersister.cs
- XmlSchemaAttribute.cs
- SpanIndex.cs
- LostFocusEventManager.cs
- SHA512Managed.cs
- FlowLayoutPanel.cs
- SubMenuStyle.cs
- CallbackDebugElement.cs
- SqlDataSourceDesigner.cs
- ParameterToken.cs
- Bezier.cs
- FontNameConverter.cs
- Vector3D.cs
- TextEditorThreadLocalStore.cs
- ProxySimple.cs
- GenericTypeParameterBuilder.cs
- Vector3DCollectionConverter.cs
- SqlPersonalizationProvider.cs
- EntityDataSourceEntityTypeFilterItem.cs
- EncoderParameters.cs
- ArrayExtension.cs
- RelationshipEnd.cs
- NonVisualControlAttribute.cs
- Attributes.cs
- ActiveDocumentEvent.cs
- ConfigXmlSignificantWhitespace.cs
- ConsoleEntryPoint.cs
- PingOptions.cs
- RegistrationServices.cs
- IdentityReference.cs
- versioninfo.cs
- ObjectIDGenerator.cs
- ScrollViewerAutomationPeer.cs
- TableLayoutCellPaintEventArgs.cs
- SymLanguageVendor.cs
- StackSpiller.cs
- CustomAssemblyResolver.cs
- Composition.cs
- SingleAnimationBase.cs
- XmlSchemaCompilationSettings.cs
- PtsHost.cs
- UInt64Storage.cs
- StrongNameMembershipCondition.cs
- NameSpaceExtractor.cs
- IncrementalReadDecoders.cs
- RectConverter.cs
- PerspectiveCamera.cs
- PropertyIDSet.cs
- SourceItem.cs
- StylusButtonCollection.cs
- StorageEntityContainerMapping.cs
- PageCache.cs