Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / 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);
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// ==++==
//
// 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);
}
}
}
}
// 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
- CustomCredentialPolicy.cs
- StreamingContext.cs
- DataGrid.cs
- XMLUtil.cs
- ErrorTableItemStyle.cs
- FacetChecker.cs
- EntityTypeBase.cs
- XmlNamespaceManager.cs
- PenThreadWorker.cs
- UidManager.cs
- HtmlInputText.cs
- LineBreakRecord.cs
- BaseDataBoundControl.cs
- DataGridTable.cs
- LineInfo.cs
- WmfPlaceableFileHeader.cs
- XmlImplementation.cs
- WebPartConnectVerb.cs
- SimpleWorkerRequest.cs
- TdsValueSetter.cs
- PatternMatcher.cs
- ResourcePermissionBaseEntry.cs
- NullExtension.cs
- UndoManager.cs
- ShutDownListener.cs
- SqlGenericUtil.cs
- MulticastDelegate.cs
- TableCellCollection.cs
- EndpointIdentityConverter.cs
- SemaphoreSecurity.cs
- WebCategoryAttribute.cs
- DtrList.cs
- InternalsVisibleToAttribute.cs
- ProviderUtil.cs
- UnauthorizedWebPart.cs
- CompositeDispatchFormatter.cs
- FileUpload.cs
- ThreadLocal.cs
- GridViewColumnHeader.cs
- PropertyGridCommands.cs
- SqlTypeConverter.cs
- ActivityExecutorSurrogate.cs
- SrgsElementList.cs
- FontConverter.cs
- ControlCachePolicy.cs
- FieldNameLookup.cs
- BypassElement.cs
- PeerDuplexChannelListener.cs
- Material.cs
- Typeface.cs
- ArrangedElementCollection.cs
- HttpRawResponse.cs
- DynamicControlParameter.cs
- LoadMessageLogger.cs
- NegatedCellConstant.cs
- CompositeControl.cs
- WebPartVerbsEventArgs.cs
- SystemResources.cs
- FixedSOMElement.cs
- XPathNavigatorKeyComparer.cs
- ConnectionPoint.cs
- OperationResponse.cs
- TaskFormBase.cs
- ProxyHelper.cs
- ValidationErrorCollection.cs
- Condition.cs
- GeneratedView.cs
- ZipIOExtraFieldZip64Element.cs
- RightsManagementEncryptionTransform.cs
- XmlReaderSettings.cs
- StylusPointPropertyInfoDefaults.cs
- PropertyGroupDescription.cs
- TableCellAutomationPeer.cs
- SiteOfOriginContainer.cs
- CodeCatchClause.cs
- GB18030Encoding.cs
- LocalizableAttribute.cs
- XmlCDATASection.cs
- HttpProtocolReflector.cs
- AutomationFocusChangedEventArgs.cs
- ElapsedEventArgs.cs
- ExportOptions.cs
- Console.cs
- DataTemplateKey.cs
- Menu.cs
- TabItemAutomationPeer.cs
- DiagnosticsConfiguration.cs
- RegexRunnerFactory.cs
- ReflectEventDescriptor.cs
- JoinElimination.cs
- SafeBitVector32.cs
- DataGridrowEditEndingEventArgs.cs
- ListViewSortEventArgs.cs
- DictationGrammar.cs
- TrackingRecord.cs
- IdnMapping.cs
- CodeCompileUnit.cs
- ItemsPresenter.cs
- ButtonField.cs
- HyperLinkDesigner.cs