Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Sys / System / Runtime / InteropServices / HandleCollector.cs / 1 / HandleCollector.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
namespace System.Runtime.InteropServices
{
using System;
using System.Threading;
public sealed class HandleCollector {
private const int deltaPercent = 10; // this is used for increasing the threshold.
private string name;
private int initialThreshold;
private int maximumThreshold;
private int threshold;
private int handleCount;
private int[] gc_counts = new int [3];
private int gc_gen = 0;
public HandleCollector( string name, int initialThreshold ) :
this( name, initialThreshold, int.MaxValue) {
}
public HandleCollector( string name, int initialThreshold, int maximumThreshold ) {
if( initialThreshold < 0) {
throw new ArgumentOutOfRangeException("initialThreshold",
SR.GetString(SR.ArgumentOutOfRange_NeedNonNegNumRequired));
}
if( maximumThreshold < 0) {
throw new ArgumentOutOfRangeException("maximumThreshold",
SR.GetString(SR.ArgumentOutOfRange_NeedNonNegNumRequired));
}
if( initialThreshold > maximumThreshold) {
throw new ArgumentException(SR.GetString(SR.Argument_InvalidThreshold));
}
if ( name != null) {
this.name = name;
}
else {
this.name = String.Empty;
}
this.initialThreshold = initialThreshold;
this.maximumThreshold = maximumThreshold ;
this.threshold = initialThreshold;
this.handleCount = 0;
}
public int Count { get {return handleCount;} }
public int InitialThreshold { get { return initialThreshold;} }
public int MaximumThreshold { get { return maximumThreshold;} }
public string Name { get {return name;} }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2001:AvoidCallingProblematicMethods")] // Keep call to GC.Collect()
public void Add () {
int gen_collect = -1;
Interlocked.Increment( ref handleCount);
if( handleCount < 0) {
throw new InvalidOperationException(SR.GetString(SR.InvalidOperation_HCCountOverflow));
}
if (handleCount > threshold) {
lock (this) {
threshold = handleCount + (handleCount/deltaPercent);
gen_collect = gc_gen;
if (gc_gen < 2) {
gc_gen++;
}
}
}
if ((gen_collect >= 0) &&
((gen_collect == 0) ||
(gc_counts[gen_collect] == GC.CollectionCount (gen_collect)))) {
GC.Collect (gen_collect);
Thread.Sleep (10*gen_collect);
}
//don't bother with gen0.
for (int i = 1; i < 3; i++) {
gc_counts [i] = GC.CollectionCount (i);
}
}
public void Remove () {
Interlocked.Decrement( ref handleCount);
if (handleCount < 0) {
throw new InvalidOperationException(SR.GetString(SR.InvalidOperation_HCCountOverflow));
}
int newThreshold = handleCount + handleCount/deltaPercent;
if (newThreshold < (threshold - threshold/deltaPercent)) {
lock( this) {
if (newThreshold > initialThreshold) {
threshold = newThreshold;
}
else {
threshold = initialThreshold;
}
gc_gen = 0;
}
}
for (int i = 1; i < 3; i++) {
gc_counts [i] = GC.CollectionCount (i);
}
}
}
}
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- XmlSignatureProperties.cs
- Journaling.cs
- TaskFormBase.cs
- PackageRelationshipSelector.cs
- SapiInterop.cs
- ObjectDataSourceStatusEventArgs.cs
- FrameworkContextData.cs
- MemoryStream.cs
- FileSecurity.cs
- HtmlForm.cs
- Empty.cs
- SafeFindHandle.cs
- HttpModuleActionCollection.cs
- Border.cs
- HtmlHistory.cs
- HwndKeyboardInputProvider.cs
- SspiNegotiationTokenProvider.cs
- IconHelper.cs
- SiteMapDataSourceView.cs
- Constants.cs
- UnaryExpression.cs
- StrokeCollectionConverter.cs
- HttpApplicationFactory.cs
- SystemIPAddressInformation.cs
- GetReadStreamResult.cs
- OracleDateTime.cs
- AnonymousIdentificationModule.cs
- Decorator.cs
- ToolStripMenuItemCodeDomSerializer.cs
- PagerSettings.cs
- DataGridColumnDropSeparator.cs
- ItemsChangedEventArgs.cs
- TimeoutHelper.cs
- SecurityContextTokenCache.cs
- ProcessStartInfo.cs
- XmlSchemaParticle.cs
- PreDigestedSignedInfo.cs
- RsaEndpointIdentity.cs
- ListViewSortEventArgs.cs
- XhtmlBasicControlAdapter.cs
- XmlSchemaSet.cs
- Random.cs
- CategoryAttribute.cs
- DataServiceExpressionVisitor.cs
- StringUtil.cs
- CharacterShapingProperties.cs
- MimeObjectFactory.cs
- TranslateTransform.cs
- ItemList.cs
- HttpListenerContext.cs
- EmissiveMaterial.cs
- ProtocolElement.cs
- CaseKeyBox.xaml.cs
- Int32RectValueSerializer.cs
- EventListener.cs
- DefaultWorkflowLoaderService.cs
- HtmlInputButton.cs
- DataControlPagerLinkButton.cs
- SHA512.cs
- ProgressPage.cs
- XsdValidatingReader.cs
- Mapping.cs
- Span.cs
- TypeInitializationException.cs
- _OverlappedAsyncResult.cs
- HeaderCollection.cs
- StatusBar.cs
- LayoutSettings.cs
- SpellerInterop.cs
- GeometryModel3D.cs
- XmlWellformedWriterHelpers.cs
- WebHttpBinding.cs
- CategoryAttribute.cs
- DragSelectionMessageFilter.cs
- DynamicDiscoveryDocument.cs
- FileSystemInfo.cs
- StringFreezingAttribute.cs
- Helper.cs
- CopyOnWriteList.cs
- AuthenticationService.cs
- MediaCommands.cs
- ScrollItemPattern.cs
- DataGridPagerStyle.cs
- BufferModeSettings.cs
- ControlCachePolicy.cs
- HyperLinkStyle.cs
- EventListenerClientSide.cs
- MemberInfoSerializationHolder.cs
- XsdBuildProvider.cs
- TextTreeNode.cs
- MobileTextWriter.cs
- CodeObjectCreateExpression.cs
- WebHeaderCollection.cs
- While.cs
- CopyEncoder.cs
- FontFamilyValueSerializer.cs
- Authorization.cs
- EventTrigger.cs
- XPathException.cs
- cryptoapiTransform.cs