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
- TableRowGroup.cs
- AssemblyBuilder.cs
- TextContainerChangeEventArgs.cs
- TextEditorContextMenu.cs
- OuterGlowBitmapEffect.cs
- AssociativeAggregationOperator.cs
- Border.cs
- StructuredTypeInfo.cs
- StreamMarshaler.cs
- ListViewDeletedEventArgs.cs
- AuthorizationRule.cs
- BreakRecordTable.cs
- KerberosSecurityTokenParameters.cs
- WSHttpBindingCollectionElement.cs
- ConfigurationStrings.cs
- ExceptionCollection.cs
- IntegerValidator.cs
- BitmapEffectGeneralTransform.cs
- SafeLocalMemHandle.cs
- Grid.cs
- ErasingStroke.cs
- StreamUpgradeInitiator.cs
- TextReader.cs
- RenderContext.cs
- DataTableReaderListener.cs
- _StreamFramer.cs
- ConditionalAttribute.cs
- DataTemplateSelector.cs
- PersonalizationProvider.cs
- DataKey.cs
- PriorityRange.cs
- ButtonFieldBase.cs
- SqlGatherConsumedAliases.cs
- ArgumentOutOfRangeException.cs
- TabletCollection.cs
- IndexedString.cs
- Package.cs
- ChannelPool.cs
- TagPrefixCollection.cs
- ContextDataSourceContextData.cs
- InfoCardKeyedHashAlgorithm.cs
- Tag.cs
- HtmlInputPassword.cs
- TcpWorkerProcess.cs
- NavigationProgressEventArgs.cs
- BindingOperations.cs
- LongTypeConverter.cs
- OdbcConnectionHandle.cs
- TextTreeRootNode.cs
- HTTPNotFoundHandler.cs
- DateTime.cs
- DecodeHelper.cs
- WindowHideOrCloseTracker.cs
- AnnotationStore.cs
- Variable.cs
- BitmapFrameDecode.cs
- UpdateException.cs
- QilFunction.cs
- ContainerSelectorBehavior.cs
- AffineTransform3D.cs
- ExtractedStateEntry.cs
- HtmlMeta.cs
- LogSwitch.cs
- PageSetupDialog.cs
- DecodeHelper.cs
- RubberbandSelector.cs
- WindowsListViewItemStartMenu.cs
- _NestedSingleAsyncResult.cs
- XamlFilter.cs
- ToolStripOverflow.cs
- JsonWriter.cs
- Encoding.cs
- SqlInternalConnection.cs
- Automation.cs
- LOSFormatter.cs
- ContourSegment.cs
- ClassicBorderDecorator.cs
- SingleAnimation.cs
- HtmlElementEventArgs.cs
- StandardToolWindows.cs
- OdbcHandle.cs
- GridSplitterAutomationPeer.cs
- FunctionUpdateCommand.cs
- TimestampInformation.cs
- SettingsPropertyCollection.cs
- TransactionInformation.cs
- DrawingGroupDrawingContext.cs
- DataServiceEntityAttribute.cs
- TypeGeneratedEventArgs.cs
- CacheSection.cs
- PointCollectionValueSerializer.cs
- EnumConverter.cs
- SettingsPropertyValueCollection.cs
- ForeignKeyConstraint.cs
- SqlGenerator.cs
- TraceFilter.cs
- TcpStreams.cs
- QilCloneVisitor.cs
- IxmlLineInfo.cs
- ToolStripLabel.cs