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>
        /// This method creates and returns a tracker object for the given groupName.
        /// </summary>
        public IDisposable CreateTracker(string groupName)
        {
            if (!Enable)
            {
                return(null);
            }

            groupName = groupName.MapNullToEmpty();

            lock (mutex)
            {
                GroupTrackingInfo trackingInfo = groupTrackingInfoDictionary.SafeTryGetValue(groupName);
                if (trackingInfo == null)
                {
                    var groupConfigItem = groupConfigItemDictionary.SafeTryGetValue(groupName);

                    trackingInfo = new GroupTrackingInfo(groupTrackingInfoList.Count, groupName, groupConfigItem);

                    groupTrackingInfoList.Add(trackingInfo);
                    groupTrackingInfoDictionary[groupName] = trackingInfo;
                }

                var tracker = new LifetimeTrackerImpl(trackingInfo.GroupIndex, CreateExtraWeight(trackingInfo.GroupConfigItem), QpcTimeStamp.Now);

                InnerRecordAddedTracker(trackingInfo);

                return(tracker);
            }
        }
        private void InnerRecordAddedTracker(GroupTrackingInfo trackingInfo)
        {
            QpcTimeStamp qpcNow = QpcTimeStamp.Now;

            logPendingCount += globalTrackingInfo.AddInstance(qpcNow).MapToInt();

            logPendingCount += trackingInfo.AddInstance(qpcNow).MapToInt();

            var emitter = (trackingInfo.GroupConfigItem ?? DefaultGroupConfig).InstanceActivityEmitter;

            if (emitter.IsEnabled)
            {
                emitter.Emit("Added '{0}': {1}", trackingInfo.GroupName, trackingInfo.GetCountPartStr());
            }
        }