Exemplo n.º 1
0
        public static RentedBuffer RentBuffer(int size)
        {
            if (__isBufferRented)
            {
                throw new InvalidOperationException("Thread static buffer is already in use.");
            }

            if (size <= 0 || size > MaxAllocationSize)
            {
                throw new ArgumentOutOfRangeException(nameof(size), size, $"Valid buffer size range is [1..{MaxAllocationSize}] bytes.");
            }

            __isBufferRented = true;

            if (__threadId == default)
            {
                __threadId = Thread.CurrentThread.ManagedThreadId;
            }

            if (size > MaxSize)
            {
                return(new RentedBuffer(__threadId, new byte[size]));
            }

            if (__buffer == null || __buffer.Length < size)
            {
                var newSize = size <= MinSize ? MinSize : PowerOf2.RoundUpToPowerOf2(size);
                __buffer = new byte[newSize];
            }

            return(new RentedBuffer(__threadId, __buffer));
        }
Exemplo n.º 2
0
        public void RoundUpToPowerOf2_should_throw_when_n_is_invalid(
            [Values(-1, 0x40000001)]
            int n)
        {
            Action action = () => PowerOf2.RoundUpToPowerOf2(n);

            action.ShouldThrow <ArgumentOutOfRangeException>().And.ParamName.Should().Be("n");
        }
Exemplo n.º 3
0
        /// <inheritdoc/>
        public void EnsureCapacity(int minimumCapacity)
        {
            if (minimumCapacity < 0)
            {
                throw new ArgumentOutOfRangeException("minimumCapacity");
            }
            ThrowIfDisposed();
            EnsureIsWritable();

            if (minimumCapacity > _bytes.Length)
            {
                var powerOf2 = Math.Max(32, PowerOf2.RoundUpToPowerOf2(minimumCapacity));
                SetCapacity(powerOf2);
            }
        }
Exemplo n.º 4
0
        /// <inheritdoc/>
        public IBsonChunk GetChunk(int requestedSize)
        {
            if (requestedSize <= 0)
            {
                throw new ArgumentOutOfRangeException("requestedSize");
            }
            ThrowIfDisposed();

            if (requestedSize <= _maxUnpooledChunkSize)
            {
                return(new ByteArrayChunk(requestedSize));
            }

            var powerOf2Size = PowerOf2.RoundUpToPowerOf2(requestedSize);

            if (powerOf2Size - requestedSize > _minChunkSize)
            {
                powerOf2Size = powerOf2Size / 2;
            }
            var chunkSize = Math.Max(Math.Min(powerOf2Size, _maxChunkSize), _minChunkSize);

            return(_baseSource.GetChunk(chunkSize));
        }
Exemplo n.º 5
0
        /// <inheritdoc/>
        public IBsonChunk GetChunk(int requestedSize)
        {
            if (requestedSize <= 0)
            {
                throw new ArgumentOutOfRangeException("requestedSize");
            }
            ThrowIfDisposed();

            IBsonChunk chunk;

            if (_previousChunkSize == 0 && _initialUnpooledChunkSize != 0)
            {
                chunk = new ByteArrayChunk(_initialUnpooledChunkSize);
            }
            else
            {
                var powerOf2Size = PowerOf2.RoundUpToPowerOf2(_previousChunkSize + 1);
                var chunkSize    = Math.Max(Math.Min(powerOf2Size, _maxChunkSize), _minChunkSize);
                chunk = _baseSource.GetChunk(chunkSize);
            }

            _previousChunkSize = chunk.Bytes.Count;
            return(chunk);
        }
Exemplo n.º 6
0
        public void RoundUpToPowerOf2_should_return_expected_result(int n, int expectedResult)
        {
            var result = PowerOf2.RoundUpToPowerOf2(n);

            result.Should().Be(expectedResult);
        }