/// <summary>
        /// Called when a subscription packet comes, update the count of a face.
        ///
        /// if count == Int.MaxValue, it means inf.
        /// </summary>
        /// <param name="face">The specified face</param>
        /// <param name="count">The count of that face, Int32.MaxValue for infinitive</param>
        /// <param name="CountInQueue">A count function that will calculate the packets with the same CD in the queue</param>
        /// <returns>-1 if no change on that CD, </returns>
        public int UpdateFace(IPEndPoint face, int count, Func <int> CountInQueue, out int realFaceCount)
        {
            // To obsolate count = -1
            Trace.Assert(count >= 0);

            FaceCounter counter;

            if (!Faces.TryGetValue(face, out counter))
            {
                Faces [face] = counter = new FaceCounter();
            }

            if (counter.Count == Int32.MaxValue)
            {
                if (count != Int32.MaxValue)
                {
                    // Modified here, if the subscription changed from inf. to a certain value, use count - N as new count
                    counter.Count = count - CountInQueue();
                }
                //else do nothing
            }
            else
            {
                if (count == Int32.MaxValue)
                {
                    counter.Count = Int32.MaxValue;
                }
                else
                {
                    counter.Count += count;
                }
            }
            realFaceCount = counter.Count;

            int newMax = CalculateNewMax();

            if (newMax == Int32.MaxValue)
            {
                if (Max == Int32.MaxValue)
                {
                    return(-1);
                }
                else
                {
                    return(Max = Int32.MaxValue);
                }
            }
            else
            {
                if (Max == Int32.MaxValue)
                {
                    return(Max = newMax);
                }
                else
                {
                    int diff = newMax - Max;
                    Max = newMax;
                    return(diff);
                }
            }
        }