Beispiel #1
0
        private void CalculateThresholds(long maximumBufferSize, TargetUtilizationLevels levels)
        {
            switch (levels)
            {
            case TargetUtilizationLevels.Low:
                m_levelNone     = (long)(0.1 * maximumBufferSize);
                m_levelLow      = (long)(0.25 * maximumBufferSize);
                m_levelNormal   = (long)(0.50 * maximumBufferSize);
                m_levelHigh     = (long)(0.75 * maximumBufferSize);
                m_levelVeryHigh = (long)(0.90 * maximumBufferSize);
                break;

            case TargetUtilizationLevels.Medium:
                m_levelNone     = (long)(0.25 * maximumBufferSize);
                m_levelLow      = (long)(0.50 * maximumBufferSize);
                m_levelNormal   = (long)(0.75 * maximumBufferSize);
                m_levelHigh     = (long)(0.85 * maximumBufferSize);
                m_levelVeryHigh = (long)(0.95 * maximumBufferSize);
                break;

            case TargetUtilizationLevels.High:
                m_levelNone     = (long)(0.5 * maximumBufferSize);
                m_levelLow      = (long)(0.75 * maximumBufferSize);
                m_levelNormal   = (long)(0.85 * maximumBufferSize);
                m_levelHigh     = (long)(0.95 * maximumBufferSize);
                m_levelVeryHigh = (long)(0.97 * maximumBufferSize);
                break;

            default:
                throw new ArgumentOutOfRangeException("levels");
            }
        }
Beispiel #2
0
 /// <summary>
 /// Changes the utilization level
 /// </summary>
 /// <param name="utilizationLevel"></param>
 /// <returns></returns>
 public void SetTargetUtilizationLevel(TargetUtilizationLevels utilizationLevel)
 {
     lock (m_syncRoot)
     {
         if (m_disposed)
         {
             throw new ObjectDisposedException(GetType().FullName);
         }
         TargetUtilizationLevel = utilizationLevel;
         CalculateThresholds(MaximumPoolSize, utilizationLevel);
     }
 }
Beispiel #3
0
        /// <summary>
        /// Creates a new <see cref="MemoryPool"/>.
        /// </summary>
        /// <param name="pageSize">The desired page size. Must be between 4KB and 256KB</param>
        /// <param name="maximumBufferSize">The desired maximum size of the allocation. Note: could be less if there is not enough system memory.</param>
        /// <param name="utilizationLevel">Specifies the desired utilization level of the allocated space.</param>
        public MemoryPool(int pageSize = 64 * 1024, long maximumBufferSize = -1, TargetUtilizationLevels utilizationLevel = TargetUtilizationLevels.Low)
        {
            if (pageSize < 4096 || pageSize > 256 * 1024)
            {
                throw new ArgumentOutOfRangeException("pageSize", "Page size must be between 4KB and 256KB and a power of 2");
            }

            if (!BitMath.IsPowerOfTwo((uint)pageSize))
            {
                throw new ArgumentOutOfRangeException("pageSize", "Page size must be between 4KB and 256KB and a power of 2");
            }

            m_syncRoot     = new object();
            m_syncAllocate = new object();
            PageSize       = pageSize;
            PageMask       = PageSize - 1;
            PageShiftBits  = BitMath.CountBitsSet((uint)PageMask);

            m_pageList = new MemoryPoolPageList(PageSize, maximumBufferSize);
            m_requestCollectionEvent = new ThreadSafeList <WeakEventHandler <CollectionEventArgs> >();
            SetTargetUtilizationLevel(utilizationLevel);
        }
 private void CalculateThresholds(long maximumBufferSize, TargetUtilizationLevels levels)
 {
     switch (levels)
     {
         case TargetUtilizationLevels.Low:
             m_levelNone = (long)(0.1 * maximumBufferSize);
             m_levelLow = (long)(0.25 * maximumBufferSize);
             m_levelNormal = (long)(0.50 * maximumBufferSize);
             m_levelHigh = (long)(0.75 * maximumBufferSize);
             m_levelVeryHigh = (long)(0.90 * maximumBufferSize);
             break;
         case TargetUtilizationLevels.Medium:
             m_levelNone = (long)(0.25 * maximumBufferSize);
             m_levelLow = (long)(0.50 * maximumBufferSize);
             m_levelNormal = (long)(0.75 * maximumBufferSize);
             m_levelHigh = (long)(0.85 * maximumBufferSize);
             m_levelVeryHigh = (long)(0.95 * maximumBufferSize);
             break;
         case TargetUtilizationLevels.High:
             m_levelNone = (long)(0.5 * maximumBufferSize);
             m_levelLow = (long)(0.75 * maximumBufferSize);
             m_levelNormal = (long)(0.85 * maximumBufferSize);
             m_levelHigh = (long)(0.95 * maximumBufferSize);
             m_levelVeryHigh = (long)(0.97 * maximumBufferSize);
             break;
         default:
             throw new ArgumentOutOfRangeException("levels");
     }
 }
 /// <summary>
 /// Changes the utilization level
 /// </summary>
 /// <param name="utilizationLevel"></param>
 /// <returns></returns>
 public void SetTargetUtilizationLevel(TargetUtilizationLevels utilizationLevel)
 {
     lock (m_syncRoot)
     {
         if (m_disposed)
             throw new ObjectDisposedException(GetType().FullName);
         TargetUtilizationLevel = utilizationLevel;
         CalculateThresholds(MaximumPoolSize, utilizationLevel);
     }
 }
        /// <summary>
        /// Creates a new <see cref="MemoryPool"/>.
        /// </summary>
        /// <param name="pageSize">The desired page size. Must be between 4KB and 256KB</param>
        /// <param name="maximumBufferSize">The desired maximum size of the allocation. Note: could be less if there is not enough system memory.</param>
        /// <param name="utilizationLevel">Specifies the desired utilization level of the allocated space.</param>
        public MemoryPool(int pageSize = 64 * 1024, long maximumBufferSize = -1, TargetUtilizationLevels utilizationLevel = TargetUtilizationLevels.Low)
        {
            if (pageSize < 4096 || pageSize > 256 * 1024)
                throw new ArgumentOutOfRangeException("pageSize", "Page size must be between 4KB and 256KB and a power of 2");

            if (!BitMath.IsPowerOfTwo((uint)pageSize))
                throw new ArgumentOutOfRangeException("pageSize", "Page size must be between 4KB and 256KB and a power of 2");

            m_syncRoot = new object();
            m_syncAllocate = new object();
            PageSize = pageSize;
            PageMask = PageSize - 1;
            PageShiftBits = BitMath.CountBitsSet((uint)PageMask);

            m_pageList = new MemoryPoolPageList(PageSize, maximumBufferSize);
            m_requestCollectionEvent = new ThreadSafeList<WeakEventHandler<CollectionEventArgs>>();
            SetTargetUtilizationLevel(utilizationLevel);
        }