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
- _BasicClient.cs
- AttachedPropertyMethodSelector.cs
- PersistChildrenAttribute.cs
- FontFamily.cs
- SystemInformation.cs
- PersonalizationStateInfo.cs
- CodeLabeledStatement.cs
- TableCellCollection.cs
- RMPermissions.cs
- FixedNode.cs
- XPathAxisIterator.cs
- MenuAdapter.cs
- WebPartEditorApplyVerb.cs
- InputLanguageManager.cs
- AnnotationResourceChangedEventArgs.cs
- DragEventArgs.cs
- PropertyDescriptorGridEntry.cs
- PathSegmentCollection.cs
- SmiSettersStream.cs
- RemotingConfiguration.cs
- DesignerCalendarAdapter.cs
- DataSourceCacheDurationConverter.cs
- BrushMappingModeValidation.cs
- HMACMD5.cs
- WmlTextBoxAdapter.cs
- _Semaphore.cs
- WorkflowViewStateService.cs
- NetworkCredential.cs
- QilName.cs
- XPathDescendantIterator.cs
- DispatchWrapper.cs
- ISessionStateStore.cs
- TypeInitializationException.cs
- Attributes.cs
- CodeObject.cs
- PersonalizableAttribute.cs
- Control.cs
- safelink.cs
- ItemsControl.cs
- FileVersion.cs
- CodeExpressionCollection.cs
- RectangleConverter.cs
- VectorAnimationBase.cs
- DataGridViewAutoSizeColumnModeEventArgs.cs
- brushes.cs
- Subset.cs
- DesignerAdapterAttribute.cs
- NeutralResourcesLanguageAttribute.cs
- SqlClientMetaDataCollectionNames.cs
- DeclaredTypeElementCollection.cs
- Substitution.cs
- MatchingStyle.cs
- ButtonBase.cs
- GridViewCommandEventArgs.cs
- HttpProtocolImporter.cs
- ZipIOModeEnforcingStream.cs
- DrawingImage.cs
- MetaModel.cs
- CustomLineCap.cs
- SqlNodeAnnotations.cs
- bidPrivateBase.cs
- FixedTextSelectionProcessor.cs
- PasswordBoxAutomationPeer.cs
- ValueSerializerAttribute.cs
- BamlReader.cs
- Viewport2DVisual3D.cs
- NavigatingCancelEventArgs.cs
- ResXResourceReader.cs
- RowType.cs
- DataGridClipboardCellContent.cs
- TcpHostedTransportConfiguration.cs
- UnicastIPAddressInformationCollection.cs
- ControlType.cs
- TagMapCollection.cs
- AffineTransform3D.cs
- CompilationPass2TaskInternal.cs
- MediaTimeline.cs
- GridItemCollection.cs
- LinkedDataMemberFieldEditor.cs
- MatrixIndependentAnimationStorage.cs
- translator.cs
- ToolBar.cs
- PointLightBase.cs
- SourceChangedEventArgs.cs
- Int16Storage.cs
- EmptyTextWriter.cs
- OracleException.cs
- XmlAttribute.cs
- ZeroOpNode.cs
- BypassElement.cs
- Propagator.JoinPropagator.SubstitutingCloneVisitor.cs
- EmptyEnumerable.cs
- XmlReflectionMember.cs
- WarningException.cs
- UTF32Encoding.cs
- ActionItem.cs
- OdbcError.cs
- ObjectNotFoundException.cs
- ConfigViewGenerator.cs
- IndexingContentUnit.cs