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
- FormsAuthenticationUser.cs
- GridLength.cs
- IsolatedStorageFile.cs
- JpegBitmapDecoder.cs
- Graphics.cs
- D3DImage.cs
- ICollection.cs
- Debugger.cs
- CacheAxisQuery.cs
- ObjectToIdCache.cs
- Line.cs
- CodeSpit.cs
- TextEditorMouse.cs
- DependentList.cs
- StringUtil.cs
- DataSourceSelectArguments.cs
- AssemblySettingAttributes.cs
- TextMetrics.cs
- WorkflowServiceHostFactory.cs
- ProcessHostConfigUtils.cs
- DictionaryBase.cs
- FormViewUpdateEventArgs.cs
- MobileUserControlDesigner.cs
- DbTransaction.cs
- _NestedSingleAsyncResult.cs
- Range.cs
- _NegoState.cs
- WebPartHelpVerb.cs
- XmlNavigatorFilter.cs
- PermissionListSet.cs
- RegistryPermission.cs
- SmiEventSink_Default.cs
- TemplateBaseAction.cs
- SimpleMailWebEventProvider.cs
- DbExpressionRules.cs
- AttributeProviderAttribute.cs
- RectIndependentAnimationStorage.cs
- MeshGeometry3D.cs
- ProtocolsSection.cs
- SiteMapNode.cs
- DeviceContexts.cs
- DbConnectionPoolOptions.cs
- AsyncSerializedWorker.cs
- AnonymousIdentificationSection.cs
- SystemTcpConnection.cs
- FixedPageStructure.cs
- XmlSerializerNamespaces.cs
- ImageListUtils.cs
- Timer.cs
- SwitchAttribute.cs
- Tuple.cs
- RemoteWebConfigurationHostServer.cs
- TransactionInterop.cs
- XamlVector3DCollectionSerializer.cs
- ListViewGroup.cs
- ToolboxComponentsCreatingEventArgs.cs
- BindableTemplateBuilder.cs
- Int32Rect.cs
- WindowsTitleBar.cs
- WebControlsSection.cs
- SecureStringHasher.cs
- ListParagraph.cs
- SizeConverter.cs
- WebBrowser.cs
- Font.cs
- DesignParameter.cs
- AvTrace.cs
- Window.cs
- RefreshEventArgs.cs
- DataGridItem.cs
- OleCmdHelper.cs
- SecurityRequiresReviewAttribute.cs
- ControlDesigner.cs
- cache.cs
- Rectangle.cs
- BindingContext.cs
- CombinedTcpChannel.cs
- DataServiceExpressionVisitor.cs
- MdImport.cs
- COM2AboutBoxPropertyDescriptor.cs
- CodeIdentifier.cs
- SubpageParagraph.cs
- Contracts.cs
- ObjectItemCollectionAssemblyCacheEntry.cs
- DbQueryCommandTree.cs
- GatewayIPAddressInformationCollection.cs
- tibetanshape.cs
- NativeMethods.cs
- DefaultValueMapping.cs
- CompilerGlobalScopeAttribute.cs
- SectionXmlInfo.cs
- XmlAttributes.cs
- CompiledIdentityConstraint.cs
- DateTimeUtil.cs
- DataGridCaption.cs
- EntityDataSourceColumn.cs
- SmiContext.cs
- ResourcePermissionBaseEntry.cs
- UnmanagedMarshal.cs
- Guid.cs