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
- Color.cs
- ComponentRenameEvent.cs
- WorkflowApplicationAbortedException.cs
- SizeConverter.cs
- ObjectDataSourceSelectingEventArgs.cs
- Triplet.cs
- ContractBase.cs
- DesignerOptionService.cs
- HostProtectionException.cs
- PrintPreviewControl.cs
- ProxyWebPart.cs
- UInt32Storage.cs
- StrokeNodeData.cs
- Rect3D.cs
- ThreadStateException.cs
- IDReferencePropertyAttribute.cs
- DurableRuntimeValidator.cs
- OracleBinary.cs
- CorrelationManager.cs
- BoolLiteral.cs
- InternalBufferManager.cs
- HScrollProperties.cs
- LowerCaseStringConverter.cs
- PbrsForward.cs
- ReadOnlyDictionary.cs
- SessionStateContainer.cs
- RuntimeConfig.cs
- TextElementCollection.cs
- UpdatePanelTrigger.cs
- OleDbCommand.cs
- SubclassTypeValidator.cs
- CheckBox.cs
- ToolStripPanel.cs
- WebServiceParameterData.cs
- SqlNodeAnnotations.cs
- PTManager.cs
- SQLInt64Storage.cs
- TypeSemantics.cs
- FunctionMappingTranslator.cs
- ContainerControlDesigner.cs
- FileChangesMonitor.cs
- EntityModelSchemaGenerator.cs
- DataGridViewColumnEventArgs.cs
- EntityDesignerDataSourceView.cs
- XmlReflectionMember.cs
- TreeNodeStyleCollection.cs
- StateFinalizationDesigner.cs
- InputBinding.cs
- Bitmap.cs
- RequestContextBase.cs
- WebPartMinimizeVerb.cs
- ObjectItemAttributeAssemblyLoader.cs
- PropertyPath.cs
- AppDomainUnloadedException.cs
- GradientBrush.cs
- BinaryObjectWriter.cs
- OleDbError.cs
- ToolStripItemDesigner.cs
- EditorBrowsableAttribute.cs
- BitHelper.cs
- TextAutomationPeer.cs
- DefaultEventAttribute.cs
- MemberInfoSerializationHolder.cs
- ObjectFactoryCodeDomTreeGenerator.cs
- PeerTransportListenAddressValidatorAttribute.cs
- WSUtilitySpecificationVersion.cs
- VectorAnimationUsingKeyFrames.cs
- QueryGeneratorBase.cs
- IntegerValidator.cs
- ApplicationGesture.cs
- CorruptingExceptionCommon.cs
- sitestring.cs
- TakeOrSkipQueryOperator.cs
- DocumentSequenceHighlightLayer.cs
- ValueType.cs
- VolatileEnlistmentState.cs
- ControlCodeDomSerializer.cs
- ContainerFilterService.cs
- XmlTextAttribute.cs
- ImageSourceConverter.cs
- WizardForm.cs
- XsdBuilder.cs
- MeasureItemEvent.cs
- EntityParameter.cs
- SqlTriggerAttribute.cs
- ClientBuildManagerCallback.cs
- GetWinFXPath.cs
- TreeNodeBinding.cs
- TextCharacters.cs
- CharEntityEncoderFallback.cs
- DesignerActionList.cs
- ResourcesBuildProvider.cs
- EventArgs.cs
- FrameworkTemplate.cs
- ColumnClickEvent.cs
- MergeLocalizationDirectives.cs
- SecurityTokenValidationException.cs
- RoutedEventConverter.cs
- Constraint.cs
- MaskedTextProvider.cs