Пример #1
0
        public T[] RentBuffer(int size, bool clearBuffer = false)
        {
            T[] buffer;
            if (size > _maxBufferSize)
            {
                buffer = new T[size];
            }
            else
            {
                int index = BufferUtilities.SelectBucketIndex(size);
                ManagedBufferBucket <T> bucket = Volatile.Read(ref _buckets[index]);
                if (bucket == null)
                {
                    Interlocked.CompareExchange(ref _buckets[index], new ManagedBufferBucket <T>(BufferUtilities.GetMaxSizeForBucket(index), NUMBER_OF_BUFFERS_IN_BUCKET), null);
                    bucket = _buckets[index];
                }
                buffer = bucket.Rent();
                if (clearBuffer)
                {
                    Array.Clear(buffer, 0, buffer.Length);
                }
            }

            return(buffer);
        }
Пример #2
0
        // 2MB taken as the default since the average HTTP page is 1.9MB
        // per http://httparchive.org/interesting.php, as of October 2015
        public ManagedBufferPool(int maxBufferSizeInBytes = 2048000)
        {
            int maxBuckets = BufferUtilities.SelectBucketIndex(maxBufferSizeInBytes);

            _maxBufferSize = maxBufferSizeInBytes;
            _buckets       = new ManagedBufferBucket <T> [maxBuckets + 1];
        }
Пример #3
0
        public NativeBufferPool(int maxElementsInBuffer)
        {
            int maxBuckets = BufferUtilities.SelectBucketIndex(maxElementsInBuffer);

            _maxElements = maxElementsInBuffer;
            _buckets     = new NativeBufferBucket <T> [maxBuckets + 1];
        }
Пример #4
0
        public void ReturnBuffer(ref T[] buffer, bool clearBuffer = false)
        {
            if (clearBuffer)
            {
                Array.Clear(buffer, 0, buffer.Length);
            }

            if (buffer.Length > _maxBufferSize)
            {
                buffer = null;
            }
            else
            {
                _buckets[BufferUtilities.SelectBucketIndex(buffer.Length)].Return(ref buffer);
            }
        }
Пример #5
0
        public Span <byte> Rent(int numberOfElements, bool clearBuffer = false)
        {
            if (_disposed)
            {
                throw new ObjectDisposedException("NativeBufferPool");
            }

            Span <byte> buffer;

            if (numberOfElements > _maxElements)
            {
#if DEBUG
                System.Diagnostics.Debugger.Break();
#endif
                buffer = new Span <byte>(Marshal.AllocHGlobal(numberOfElements * Marshal.SizeOf(typeof(byte))).ToPointer(), numberOfElements);
            }
            else
            {
                int index = BufferUtilities.SelectBucketIndex(numberOfElements);
                NativeBufferBucket bucket = Volatile.Read(ref _buckets[index]);
                if (bucket == null)
                {
                    NativeBufferBucket newBucket = new NativeBufferBucket(BufferUtilities.GetMaxSizeForBucket(index), NUMBER_OF_BUFFERS_IN_BUCKET);
                    if (Interlocked.CompareExchange(ref _buckets[index], newBucket, null) != null)
                    {
                        newBucket.Dispose();
                    }

                    bucket = _buckets[index];
                }

                var rented = bucket.Rent();
                buffer = new Span <byte>(rented._memory, rented._length);
            }

            if (clearBuffer)
            {
                BufferUtilities.ClearSpan(buffer);
            }
            return(buffer);
        }
Пример #6
0
        public void Return(Span <byte> buffer, bool clearBuffer = false)
        {
            if (_disposed)
            {
                throw new ObjectDisposedException("NativeBufferPool");
            }

            if (clearBuffer)
            {
                BufferUtilities.ClearSpan(buffer);
            }

            if (buffer.Length > _maxElements)
            {
                Marshal.FreeHGlobal(new IntPtr(buffer.UnsafePointer));
            }
            else
            {
                _buckets[BufferUtilities.SelectBucketIndex(buffer.Length)].Return(new NativeBuffer(buffer.UnsafePointer, 0));
            }
        }