public bool RemoveInstance(QpcTimeStamp qpcNow, DisposableBase.DisposeType disploseType, double trackerAge) { trackerAgeSum += trackerAge; if (removeCount != 0) { minTrackerAge = Math.Min(minTrackerAge, trackerAge); maxTrackerAge = Math.Max(maxTrackerAge, trackerAge); } else { minTrackerAge = maxTrackerAge = trackerAge; } removeCount += 1; switch (disploseType) { case DisposableBase.DisposeType.CalledExplicitly: disposeCount += 1; break; case DisposableBase.DisposeType.CalledByFinalizer: finalizeCount += 1; break; } totalCount -= 1; if (nextStatusLogTimeStamp.IsZero && !qpcNow.IsZero) { nextStatusLogTimeStamp = qpcNow + (1.0).FromSeconds(); } return(!nextStatusLogTimeStamp.IsZero); }
protected void RecordTrackerRemoval(int groupIndex, DisposableBase.DisposeType disposeType, QpcTimeStamp trackerCreateTimeStamp) { lock (mutex) { QpcTimeStamp qpcNow = QpcTimeStamp.Now; double trackerAge = (qpcNow - trackerCreateTimeStamp).TotalSeconds; logPendingCount += globalTrackingInfo.RemoveInstance(qpcNow, disposeType, trackerAge).MapToInt(); GroupTrackingInfo trackingInfo = (groupIndex >= 0 && groupIndex < groupTrackingInfoList.Count) ? groupTrackingInfoList[groupIndex] : null; if (trackingInfo != null) { var emitter = (trackingInfo.GroupConfigItem ?? DefaultGroupConfig).InstanceActivityEmitter; logPendingCount += trackingInfo.RemoveInstance(qpcNow, disposeType, trackerAge).MapToInt(); if (emitter.IsEnabled) { emitter.Emit("Removed '{0}' disposeType:{1}, {2}", trackingInfo.GroupName, disposeType, trackingInfo.GetCountPartStr()); } } else { var emitter = DefaultGroupConfig.InstanceActivityEmitter; emitter.Emit("Attempt to removed tracker at group index {0} disposeType:{1} failed: The given index is not valid.", groupIndex, disposeType); } } }
/// <summary>implementation method for DisposableBase. On explicit dispose, this method will perform a Shutdown if needed so as to dispose of all objects in the stack.</summary> protected override void Dispose(DisposableBase.DisposeType disposeType) { if (poolIsEnabled && disposeType == DisposeType.CalledExplicitly) { Shutdown(); } }
/// <summary> /// Implementation method for DisposableBase. Called by Disposable base either for explicit dispose or as part of the finalizer pattern. /// </summary> /// <param name="disposeType">Gives the dispose type. DisposeType.CalledExplicitly will trigger the contained delegate to be invoked. DisposeType.CalledByFinalizer will not.</param> protected override void Dispose(DisposableBase.DisposeType disposeType) { if (disposeType == DisposeType.CalledExplicitly && disposeDelegate != null) { disposeDelegate(); disposeDelegate = null; } }
/// <summary> /// Callback method from DisposableBase on explicit destruction via client explicitly calling IDisposable.Dispose use or when called by finalizer. /// Method nulls held reference to instance and disposes of held instance (if it is/was IDisposable). /// </summary> protected override void Dispose(DisposableBase.DisposeType disposeType) { if (disposeType == DisposeType.CalledExplicitly) { lock (instanceMutex) { InnerDispose(); } } }
private void HandleDispose(DisposableBase.DisposeType disposeType) { try { extraWeightObj = null; LifetimeTracking.Instance.RecordTrackerRemoval(groupIndex, disposeType, createTimeStamp); groupIndex = -1; createTimeStamp = QpcTimeStamp.Zero; } catch { } }
/// <summary> /// Internal implementation for handling explicit and finalizer based dispose to generally follow the pattern used for DisposableBase. /// When invoked explicitly, this method invokes the System.IDisposable.Dispose methods on each of the non-null items in the list. /// </summary> /// <param name="disposeType">DisposeType being handled.</param> protected void Dispose(DisposableBase.DisposeType disposeType) { if (disposeType == DisposableBase.DisposeType.CalledExplicitly) { foreach (ItemType item in this) { if (item != null) { item.Dispose(); } } } }