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
- ValidatedControlConverter.cs
- FileStream.cs
- PEFileEvidenceFactory.cs
- FrugalMap.cs
- CodeRemoveEventStatement.cs
- IndentedTextWriter.cs
- LocalizationComments.cs
- ObfuscationAttribute.cs
- PaperSource.cs
- DispatchWrapper.cs
- SubstitutionList.cs
- RepeatInfo.cs
- UDPClient.cs
- WSSecurityJan2004.cs
- CapabilitiesState.cs
- AssociationTypeEmitter.cs
- Pipe.cs
- FileDialogCustomPlaces.cs
- NavigationPropertyAccessor.cs
- AttachedPropertyInfo.cs
- SessionPageStatePersister.cs
- WindowShowOrOpenTracker.cs
- TextEditor.cs
- LinearGradientBrush.cs
- HybridObjectCache.cs
- TextEffect.cs
- FastEncoder.cs
- StrokeSerializer.cs
- MatcherBuilder.cs
- InternalControlCollection.cs
- GifBitmapDecoder.cs
- CodeConstructor.cs
- LinkAreaEditor.cs
- PackWebRequest.cs
- OleDbDataAdapter.cs
- PeerApplication.cs
- BindingContext.cs
- ZipIOExtraFieldPaddingElement.cs
- EditBehavior.cs
- RoutedEventArgs.cs
- MetabaseReader.cs
- ACL.cs
- XmlSubtreeReader.cs
- SamlAction.cs
- ClientProtocol.cs
- ImplicitInputBrush.cs
- TextBox.cs
- XhtmlBasicTextViewAdapter.cs
- Triplet.cs
- _SSPIWrapper.cs
- EmissiveMaterial.cs
- RemotingService.cs
- ErasingStroke.cs
- objectquery_tresulttype.cs
- PointAnimationUsingKeyFrames.cs
- MatchingStyle.cs
- XmlMtomReader.cs
- SymbolType.cs
- WebCategoryAttribute.cs
- SmtpException.cs
- XPathSelfQuery.cs
- SqlEnums.cs
- CompositeScriptReferenceEventArgs.cs
- SafeWaitHandle.cs
- SerializableAttribute.cs
- CmsInterop.cs
- DefaultValueAttribute.cs
- WindowsImpersonationContext.cs
- AttributeCollection.cs
- ConfigurationPropertyCollection.cs
- WebRequestModulesSection.cs
- WinEventTracker.cs
- EditorPartChrome.cs
- CompilationLock.cs
- Axis.cs
- WebPartEditorApplyVerb.cs
- HealthMonitoringSection.cs
- DataBoundControlAdapter.cs
- EntityContainerEmitter.cs
- DataList.cs
- SingleAnimationBase.cs
- CapabilitiesUse.cs
- PropertyConverter.cs
- ApplicationDirectory.cs
- PropertyEmitter.cs
- TextEffectCollection.cs
- SerializerDescriptor.cs
- MaterialGroup.cs
- Stacktrace.cs
- GiveFeedbackEvent.cs
- IndexOutOfRangeException.cs
- TypeDescriptionProvider.cs
- PEFileEvidenceFactory.cs
- ResXDataNode.cs
- Win32KeyboardDevice.cs
- IProvider.cs
- ListViewItem.cs
- NameSpaceExtractor.cs
- DataGridTemplateColumn.cs
- DataControlReference.cs