Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- TextRunTypographyProperties.cs
- WizardPanelChangingEventArgs.cs
- FindCriteriaApril2005.cs
- ContentPosition.cs
- SoapIncludeAttribute.cs
- OleDbPropertySetGuid.cs
- ClientSideQueueItem.cs
- Transform.cs
- EndpointDispatcherTable.cs
- SerializationEventsCache.cs
- HorizontalAlignConverter.cs
- CalendarAutomationPeer.cs
- IRCollection.cs
- AspNetHostingPermission.cs
- SkipQueryOptionExpression.cs
- SafeNativeMethods.cs
- QuestionEventArgs.cs
- SinglePageViewer.cs
- SizeFConverter.cs
- DSACryptoServiceProvider.cs
- IIS7WorkerRequest.cs
- ToolBar.cs
- FontCacheLogic.cs
- CfgParser.cs
- RepeatInfo.cs
- FixedBufferAttribute.cs
- ParallelTimeline.cs
- Single.cs
- XmlDataProvider.cs
- EntityDataSourceState.cs
- ListViewItemMouseHoverEvent.cs
- RepeatButtonAutomationPeer.cs
- CalendarDay.cs
- MissingFieldException.cs
- DoubleIndependentAnimationStorage.cs
- JoinGraph.cs
- ToolBarDesigner.cs
- ReachFixedDocumentSerializer.cs
- _ConnectStream.cs
- Fx.cs
- ChildTable.cs
- ListManagerBindingsCollection.cs
- ConfigViewGenerator.cs
- ColorConvertedBitmapExtension.cs
- WorkflowView.cs
- ParameterRefs.cs
- XmlRawWriter.cs
- WorkflowServiceAttributes.cs
- CriticalHandle.cs
- TypedTableGenerator.cs
- XmlSchemaRedefine.cs
- DirtyTextRange.cs
- AccessDataSourceDesigner.cs
- GroupQuery.cs
- PeerNameRecord.cs
- WebPartsSection.cs
- SharedStatics.cs
- SoapAttributeAttribute.cs
- SliderAutomationPeer.cs
- ParagraphResult.cs
- WorkflowTraceTransfer.cs
- ToolStripItemClickedEventArgs.cs
- Sequence.cs
- GridViewColumn.cs
- DataControlFieldsEditor.cs
- ManipulationBoundaryFeedbackEventArgs.cs
- MutexSecurity.cs
- StylusEditingBehavior.cs
- DataGridViewCellPaintingEventArgs.cs
- FixedSOMTableCell.cs
- WindowsFormsLinkLabel.cs
- PropertyToken.cs
- GridToolTip.cs
- DoubleCollectionConverter.cs
- SessionEndedEventArgs.cs
- categoryentry.cs
- TextParaLineResult.cs
- ModifierKeysConverter.cs
- DEREncoding.cs
- HelpInfo.cs
- AssociationTypeEmitter.cs
- ProfileBuildProvider.cs
- StsCommunicationException.cs
- elementinformation.cs
- ComponentEditorForm.cs
- AddInServer.cs
- Int16Converter.cs
- EntityDataSourceColumn.cs
- WebPartConnectVerb.cs
- DrawingAttributesDefaultValueFactory.cs
- ContentPlaceHolder.cs
- XPathArrayIterator.cs
- ConfigurationSectionGroupCollection.cs
- SelectionHighlightInfo.cs
- BrowserTree.cs
- ScrollItemPatternIdentifiers.cs
- RtfToXamlLexer.cs
- BitmapCacheBrush.cs
- CodeTypeDeclaration.cs
- EntityObject.cs