示例#1
0
            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);
            }
示例#2
0
        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);
                }
            }
        }
示例#3
0
 /// <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();
     }
 }
示例#4
0
        /// <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;
            }
        }
示例#5
0
 /// <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();
         }
     }
 }
示例#6
0
            private void HandleDispose(DisposableBase.DisposeType disposeType)
            {
                try
                {
                    extraWeightObj = null;

                    LifetimeTracking.Instance.RecordTrackerRemoval(groupIndex, disposeType, createTimeStamp);

                    groupIndex      = -1;
                    createTimeStamp = QpcTimeStamp.Zero;
                }
                catch { }
            }
示例#7
0
 /// <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();
             }
         }
     }
 }