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
- SqlMethodTransformer.cs
- SupportsEventValidationAttribute.cs
- TraceHwndHost.cs
- PathGradientBrush.cs
- ExcCanonicalXml.cs
- OracleBinary.cs
- ColumnMap.cs
- IsolatedStorageSecurityState.cs
- CompilerLocalReference.cs
- DataSourceControl.cs
- MobileControlsSectionHandler.cs
- ScaleTransform3D.cs
- ImportException.cs
- ImportCatalogPart.cs
- UserMapPath.cs
- XmlTextEncoder.cs
- RemotingServices.cs
- AuthenticateEventArgs.cs
- ToolStripLabel.cs
- DeflateStream.cs
- _HelperAsyncResults.cs
- AddInContractAttribute.cs
- AutomationPropertyInfo.cs
- XhtmlBasicLinkAdapter.cs
- Triangle.cs
- GeneralTransform.cs
- JoinGraph.cs
- MessageBodyMemberAttribute.cs
- IdleTimeoutMonitor.cs
- unsafenativemethodstextservices.cs
- Stack.cs
- ConfigXmlWhitespace.cs
- ResolvedKeyFrameEntry.cs
- EditorPart.cs
- EntityClientCacheEntry.cs
- SystemWebExtensionsSectionGroup.cs
- StorageComplexPropertyMapping.cs
- PipelineModuleStepContainer.cs
- ViewBase.cs
- XmlAnyElementAttribute.cs
- XmlValidatingReader.cs
- IsolatedStorage.cs
- LinkLabelLinkClickedEvent.cs
- BindingManagerDataErrorEventArgs.cs
- PrintPageEvent.cs
- PropertyDescriptorComparer.cs
- RawAppCommandInputReport.cs
- TreeView.cs
- ProcessRequestArgs.cs
- InvalidateEvent.cs
- SmiEventSink.cs
- XpsFixedDocumentSequenceReaderWriter.cs
- CodePageEncoding.cs
- base64Transforms.cs
- LinkArea.cs
- TypePresenter.xaml.cs
- ToolStripSeparatorRenderEventArgs.cs
- CqlParserHelpers.cs
- AlternateViewCollection.cs
- SmtpSpecifiedPickupDirectoryElement.cs
- DataSourceExpressionCollection.cs
- AnnotationAuthorChangedEventArgs.cs
- XmlArrayAttribute.cs
- TypeDelegator.cs
- ErrorEventArgs.cs
- Exceptions.cs
- SerializationIncompleteException.cs
- EventManager.cs
- BrowserInteropHelper.cs
- AsymmetricSignatureFormatter.cs
- MouseActionConverter.cs
- ReturnEventArgs.cs
- RoleServiceManager.cs
- GridViewDeletedEventArgs.cs
- ProcessInputEventArgs.cs
- DrawingCollection.cs
- BindingContext.cs
- DetailsViewInsertedEventArgs.cs
- WorkflowDesigner.cs
- StorageTypeMapping.cs
- WebBrowser.cs
- CheckedListBox.cs
- FieldTemplateFactory.cs
- HttpFileCollectionWrapper.cs
- ObjectDataSourceChooseMethodsPanel.cs
- FileDialogPermission.cs
- CodeIdentifiers.cs
- ListItemsPage.cs
- ForwardPositionQuery.cs
- ArithmeticException.cs
- NameObjectCollectionBase.cs
- ErrorLog.cs
- Localizer.cs
- SystemEvents.cs
- HtmlButton.cs
- PreservationFileReader.cs
- httpserverutility.cs
- BaseTreeIterator.cs
- ServicePoint.cs
- ActivityTypeResolver.xaml.cs