Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / wpf / src / Shared / MS / Win32 / handlecollector.cs / 1 / handlecollector.cs
using System; using MS.Win32 ; using System.Runtime.InteropServices; namespace MS.Win32 { internal static class HandleCollector { private static HandleType[] handleTypes; private static int handleTypeCount = 0; private static Object handleMutex = new Object(); ////// Adds the given handle to the handle collector. This keeps the /// handle on a "hot list" of objects that may need to be garbage /// collected. /// internal static IntPtr Add(IntPtr handle, int type) { handleTypes[type - 1].Add(); return handle; } internal static SafeHandle Add(SafeHandle handle, int type) { handleTypes[type - 1].Add(); return handle; } ////// Registers a new type of handle with the handle collector. /// internal static int RegisterType(string typeName, int expense, int initialThreshold) { lock (handleMutex) { if (handleTypeCount == 0 || handleTypeCount == handleTypes.Length) { HandleType[] newTypes = new HandleType[handleTypeCount + 10]; if (handleTypes != null) { Array.Copy(handleTypes, 0, newTypes, 0, handleTypeCount); } handleTypes = newTypes; } handleTypes[handleTypeCount++] = new HandleType(typeName, expense, initialThreshold); return handleTypeCount; } } ////// Removes the given handle from the handle collector. Removing a /// handle removes it from our "hot list" of objects that should be /// frequently garbage collected. /// internal static IntPtr Remove(IntPtr handle, int type) { handleTypes[type - 1].Remove(); return handle ; } internal static SafeHandle Remove(SafeHandle handle, int type) { handleTypes[type - 1].Remove(); return handle ; } ////// Represents a specific type of handle. /// private class HandleType { internal readonly string name; private int initialThreshHold; private int threshHold; private int handleCount; private readonly int deltaPercent; ////// Creates a new handle type. /// internal HandleType(string name, int expense, int initialThreshHold) { this.name = name; this.initialThreshHold = initialThreshHold; this.threshHold = initialThreshHold; this.deltaPercent = 100 - expense; } ////// Adds a handle to this handle type for monitoring. /// internal void Add() { bool performCollect = false; lock(this) { handleCount++; performCollect = NeedCollection(); if (!performCollect) { return; } } if (performCollect) { #if DEBUG_HANDLECOLLECTOR Debug.WriteLine("HC> Forcing garbage collect"); Debug.WriteLine("HC> name :" + name); Debug.WriteLine("HC> threshHold :" + (threshHold).ToString()); Debug.WriteLine("HC> handleCount :" + (handleCount).ToString()); Debug.WriteLine("HC> deltaPercent:" + (deltaPercent).ToString()); #endif GC.Collect(); // We just performed a GC. If the main thread is in a tight // loop there is a this will cause us to increase handles forever and prevent handle collector // from doing its job. Yield the thread here. This won't totally cause // a finalization pass but it will effectively elevate the priority // of the finalizer thread just for an instant. But how long should // we sleep? We base it on how expensive the handles are because the // more expensive the handle, the more critical that it be reclaimed. int sleep = (100 - deltaPercent) / 4; System.Threading.Thread.Sleep(sleep); } } ////// Determines if this handle type needs a garbage collection pass. /// internal bool NeedCollection() { if (handleCount > threshHold) { threshHold = handleCount + ((handleCount * deltaPercent) / 100); #if DEBUG_HANDLECOLLECTOR Debug.WriteLine("HC> NeedCollection: increase threshHold to " + threshHold); #endif return true; } // If handle count < threshHold, we don't // need to collect, but if it 10% below the next lowest threshhold we // will bump down a rung. We need to choose a percentage here or else // we will oscillate. // int oldThreshHold = (100 * threshHold) / (100 + deltaPercent); if (oldThreshHold >= initialThreshHold && handleCount < (int)(oldThreshHold * .9F)) { #if DEBUG_HANDLECOLLECTOR Debug.WriteLine("HC> NeedCollection: throttle threshhold " + threshHold + " down to " + oldThreshHold); #endif threshHold = oldThreshHold; } return false; } ////// Removes the given handle from our monitor list. /// internal void Remove() { lock(this) { handleCount--; handleCount = Math.Max(0, handleCount); } } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. using System; using MS.Win32 ; using System.Runtime.InteropServices; namespace MS.Win32 { internal static class HandleCollector { private static HandleType[] handleTypes; private static int handleTypeCount = 0; private static Object handleMutex = new Object(); ////// Adds the given handle to the handle collector. This keeps the /// handle on a "hot list" of objects that may need to be garbage /// collected. /// internal static IntPtr Add(IntPtr handle, int type) { handleTypes[type - 1].Add(); return handle; } internal static SafeHandle Add(SafeHandle handle, int type) { handleTypes[type - 1].Add(); return handle; } ////// Registers a new type of handle with the handle collector. /// internal static int RegisterType(string typeName, int expense, int initialThreshold) { lock (handleMutex) { if (handleTypeCount == 0 || handleTypeCount == handleTypes.Length) { HandleType[] newTypes = new HandleType[handleTypeCount + 10]; if (handleTypes != null) { Array.Copy(handleTypes, 0, newTypes, 0, handleTypeCount); } handleTypes = newTypes; } handleTypes[handleTypeCount++] = new HandleType(typeName, expense, initialThreshold); return handleTypeCount; } } ////// Removes the given handle from the handle collector. Removing a /// handle removes it from our "hot list" of objects that should be /// frequently garbage collected. /// internal static IntPtr Remove(IntPtr handle, int type) { handleTypes[type - 1].Remove(); return handle ; } internal static SafeHandle Remove(SafeHandle handle, int type) { handleTypes[type - 1].Remove(); return handle ; } ////// Represents a specific type of handle. /// private class HandleType { internal readonly string name; private int initialThreshHold; private int threshHold; private int handleCount; private readonly int deltaPercent; ////// Creates a new handle type. /// internal HandleType(string name, int expense, int initialThreshHold) { this.name = name; this.initialThreshHold = initialThreshHold; this.threshHold = initialThreshHold; this.deltaPercent = 100 - expense; } ////// Adds a handle to this handle type for monitoring. /// internal void Add() { bool performCollect = false; lock(this) { handleCount++; performCollect = NeedCollection(); if (!performCollect) { return; } } if (performCollect) { #if DEBUG_HANDLECOLLECTOR Debug.WriteLine("HC> Forcing garbage collect"); Debug.WriteLine("HC> name :" + name); Debug.WriteLine("HC> threshHold :" + (threshHold).ToString()); Debug.WriteLine("HC> handleCount :" + (handleCount).ToString()); Debug.WriteLine("HC> deltaPercent:" + (deltaPercent).ToString()); #endif GC.Collect(); // We just performed a GC. If the main thread is in a tight // loop there is a this will cause us to increase handles forever and prevent handle collector // from doing its job. Yield the thread here. This won't totally cause // a finalization pass but it will effectively elevate the priority // of the finalizer thread just for an instant. But how long should // we sleep? We base it on how expensive the handles are because the // more expensive the handle, the more critical that it be reclaimed. int sleep = (100 - deltaPercent) / 4; System.Threading.Thread.Sleep(sleep); } } ////// Determines if this handle type needs a garbage collection pass. /// internal bool NeedCollection() { if (handleCount > threshHold) { threshHold = handleCount + ((handleCount * deltaPercent) / 100); #if DEBUG_HANDLECOLLECTOR Debug.WriteLine("HC> NeedCollection: increase threshHold to " + threshHold); #endif return true; } // If handle count < threshHold, we don't // need to collect, but if it 10% below the next lowest threshhold we // will bump down a rung. We need to choose a percentage here or else // we will oscillate. // int oldThreshHold = (100 * threshHold) / (100 + deltaPercent); if (oldThreshHold >= initialThreshHold && handleCount < (int)(oldThreshHold * .9F)) { #if DEBUG_HANDLECOLLECTOR Debug.WriteLine("HC> NeedCollection: throttle threshhold " + threshHold + " down to " + oldThreshHold); #endif threshHold = oldThreshHold; } return false; } ////// Removes the given handle from our monitor list. /// internal void Remove() { lock(this) { handleCount--; handleCount = Math.Max(0, handleCount); } } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- TextProperties.cs
- GenericQueueSurrogate.cs
- Executor.cs
- DateTimeFormat.cs
- SiteMapProvider.cs
- IisTraceListener.cs
- XmlBinaryWriterSession.cs
- TimeStampChecker.cs
- OracleConnection.cs
- ConditionChanges.cs
- DbConnectionFactory.cs
- RemoteArgument.cs
- Directory.cs
- DataBoundLiteralControl.cs
- Command.cs
- DomainUpDown.cs
- COM2TypeInfoProcessor.cs
- PeerCollaborationPermission.cs
- DBDataPermission.cs
- SystemBrushes.cs
- NavigationService.cs
- AjaxFrameworkAssemblyAttribute.cs
- JulianCalendar.cs
- PropertyConverter.cs
- Point4D.cs
- TextEditorMouse.cs
- DataGridViewDataConnection.cs
- FixedPageStructure.cs
- ResourcePool.cs
- ModelItem.cs
- SystemWebCachingSectionGroup.cs
- WebPartConnectionsCloseVerb.cs
- MailDefinition.cs
- FullTextBreakpoint.cs
- TypeDescriptor.cs
- CertificateManager.cs
- MaterialGroup.cs
- EndpointNotFoundException.cs
- InstanceLockLostException.cs
- XmlSortKey.cs
- AssertUtility.cs
- SchemaElementLookUpTableEnumerator.cs
- AssociationSetEnd.cs
- EntityCollection.cs
- InputLangChangeEvent.cs
- PermissionListSet.cs
- ProfileService.cs
- OdbcEnvironmentHandle.cs
- StorageEndPropertyMapping.cs
- MsmqIntegrationInputChannel.cs
- EventLogStatus.cs
- _OverlappedAsyncResult.cs
- WebMessageEncodingElement.cs
- TextRangeEditTables.cs
- AttributeUsageAttribute.cs
- odbcmetadatacolumnnames.cs
- Multiply.cs
- ConfigurationManagerInternal.cs
- BrowserCapabilitiesCodeGenerator.cs
- MenuAutomationPeer.cs
- EmissiveMaterial.cs
- MoveSizeWinEventHandler.cs
- CapabilitiesRule.cs
- XpsFixedPageReaderWriter.cs
- QueryOperatorEnumerator.cs
- Soap12FormatExtensions.cs
- ConfigXmlAttribute.cs
- DesignerHelpers.cs
- TraceContextEventArgs.cs
- Tablet.cs
- NativeMethods.cs
- ProjectionPruner.cs
- ModuleElement.cs
- JoinElimination.cs
- BindingManagerDataErrorEventArgs.cs
- Types.cs
- StateDesigner.LayoutSelectionGlyph.cs
- NetworkAddressChange.cs
- SerialPort.cs
- BindingExpressionUncommonField.cs
- UnionExpr.cs
- RegistryKey.cs
- SafeArchiveContext.cs
- HtmlElementCollection.cs
- UInt32Storage.cs
- MsmqIntegrationProcessProtocolHandler.cs
- LayoutEditorPart.cs
- StylusButtonCollection.cs
- UriSectionData.cs
- TreeChangeInfo.cs
- TcpTransportSecurityElement.cs
- SocketElement.cs
- PointF.cs
- MultiBinding.cs
- MetaChildrenColumn.cs
- FixedTextBuilder.cs
- HtmlObjectListAdapter.cs
- KeyEvent.cs
- DomainUpDown.cs
- XmlAttributeAttribute.cs