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); }
/// <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); }