internal long TrimInternal(int percent)
        {
            int count  = Count;
            int toTrim = 0;

            // do we need to drop a percentage of entries?
            if (percent > 0)
            {
                toTrim = (int)(((long)count * (long)percent) / 100L);
                // would this leave us above MAX_COUNT?
                int minTrim = count - MAX_COUNT;
                if (toTrim < minTrim)
                {
                    toTrim = minTrim;
                }
                // would this put us below MIN_COUNT?
                int maxTrim = count - MIN_COUNT;
                if (toTrim > maxTrim)
                {
                    toTrim = maxTrim;
                }
            }
            // do we need to trim?
            if (toTrim <= 0 || _disposed == 1)
            {
                return(0);
            }
            int trimmed          = 0; // total number of entries trimmed
            int trimmedOrExpired = 0;

#if DBG
            int beginTotalCount = count;
#endif

            trimmedOrExpired = _expires.FlushExpiredItems(true);
            if (trimmedOrExpired < toTrim)
            {
                trimmed           = _usage.FlushUnderUsedItems(toTrim - trimmedOrExpired);
                trimmedOrExpired += trimmed;
            }

            if (trimmed > 0 && _perfCounters != null)
            {
                // Update values for perfcounters
                _perfCounters.IncrementBy(PerfCounterName.Trims, trimmed);
            }

#if DBG
            Dbg.Trace("MemoryCacheStore", "TrimInternal:"
                      + " beginTotalCount=" + beginTotalCount
                      + ", endTotalCount=" + count
                      + ", percent=" + percent
                      + ", trimmed=" + trimmed);
#endif
            return(trimmedOrExpired);
        }