public void ReferenceCounts3()
        {
            IByteBuffer c1 = Unpooled.Buffer().WriteByte(1);
            var         c2 = (IByteBuffer)Unpooled.Buffer().WriteByte(2).Retain();
            var         c3 = (IByteBuffer)Unpooled.Buffer().WriteByte(3).Retain(2);

            CompositeByteBuffer buf = Unpooled.CompositeBuffer();

            Assert.Equal(1, buf.ReferenceCount);

            var components = new List <IByteBuffer>
            {
                c1,
                c2,
                c3
            };

            buf.AddComponents(components);

            // Ensure that c[123]'s refCount did not change.
            Assert.Equal(1, c1.ReferenceCount);
            Assert.Equal(2, c2.ReferenceCount);
            Assert.Equal(3, c3.ReferenceCount);

            Assert.Equal(1, buf[0].ReferenceCount);
            Assert.Equal(2, buf[1].ReferenceCount);
            Assert.Equal(3, buf[2].ReferenceCount);

            c3.Release(2);
            c2.Release();
            buf.Release();
        }
예제 #2
0
        public IByteBuffer ToByteBuffer()
        {
            CompositeByteBuffer compositeBuffer = ArrayPooled.CompositeBuffer();
            _ = compositeBuffer.AddComponents(this.value);
            _ = compositeBuffer.SetWriterIndex(this.size);
            _ = compositeBuffer.SetReaderIndex(0);

            return compositeBuffer;
        }
        public IByteBuffer ToByteBuffer()
        {
            CompositeByteBuffer compositeBuffer = Unpooled.CompositeBuffer(this.value.Count);

            compositeBuffer.AddComponents(this.value);
            compositeBuffer.SetWriterIndex(this.size);
            compositeBuffer.SetReaderIndex(0);

            return(compositeBuffer);
        }
예제 #4
0
        public override void AddContent(IByteBuffer buffer, bool last)
        {
            if (buffer is object)
            {
                long localsize = buffer.ReadableBytes;
                CheckSize(Size + localsize, MaxSize);
                if (DefinedSize > 0 && DefinedSize < Size + localsize)
                {
                    ThrowHelper.ThrowIOException_OutOfSize(Size + localsize, DefinedSize);
                }

                Size += localsize;
                if (_byteBuf is null)
                {
                    _byteBuf = buffer;
                }
                else if (_byteBuf is CompositeByteBuffer buf)
                {
                    _ = buf.AddComponent(true, buffer);
                    _ = buf.SetWriterIndex((int)Size);
                }
                else
                {
                    CompositeByteBuffer compositeBuffer = ArrayPooled.CompositeBuffer(int.MaxValue);
                    _        = compositeBuffer.AddComponents(true, _byteBuf, buffer);
                    _        = compositeBuffer.SetWriterIndex((int)Size);
                    _byteBuf = compositeBuffer;
                }
            }
            if (last)
            {
                SetCompleted();
            }
            else
            {
                if (buffer is null)
                {
                    ThrowHelper.ThrowArgumentNullException(ExceptionArgument.buffer);
                }
            }
        }
예제 #5
0
        public override void AddContent(IByteBuffer buffer, bool last)
        {
            if (buffer != null)
            {
                long localsize = buffer.ReadableBytes;
                this.CheckSize(this.Size + localsize);
                if (this.DefinedSize > 0 && this.DefinedSize < this.Size + localsize)
                {
                    throw new IOException($"Out of size: {(this.Size + localsize)} > {this.DefinedSize}");
                }

                this.Size += localsize;
                if (this.byteBuf == null)
                {
                    this.byteBuf = buffer;
                }
                else if (this.byteBuf is CompositeByteBuffer buf)
                {
                    buf.AddComponent(true, buffer);
                    buf.SetWriterIndex((int)this.Size);
                }
                else
                {
                    CompositeByteBuffer compositeBuffer = Unpooled.CompositeBuffer(int.MaxValue);
                    compositeBuffer.AddComponents(true, this.byteBuf, buffer);
                    compositeBuffer.SetWriterIndex((int)this.Size);
                    this.byteBuf = compositeBuffer;
                }
            }
            if (last)
            {
                this.SetCompleted();
            }
            else
            {
                if (buffer == null)
                {
                    throw new ArgumentNullException(nameof(buffer));
                }
            }
        }
        public void AddEmptyBuffersRelease()
        {
            CompositeByteBuffer cbuf = Unpooled.CompositeBuffer();
            IByteBuffer         buf  = Unpooled.Buffer();
            IByteBuffer         buf2 = Unpooled.Buffer().WriteInt(1);
            IByteBuffer         buf3 = Unpooled.Buffer();

            Assert.Equal(1, buf.ReferenceCount);
            Assert.Equal(1, buf2.ReferenceCount);
            Assert.Equal(1, buf3.ReferenceCount);

            cbuf.AddComponents(buf, buf2, buf3);
            Assert.Equal(1, buf.ReferenceCount);
            Assert.Equal(1, buf2.ReferenceCount);
            Assert.Equal(1, buf3.ReferenceCount);

            cbuf.Release();
            Assert.Equal(0, buf.ReferenceCount);
            Assert.Equal(0, buf2.ReferenceCount);
            Assert.Equal(0, buf3.ReferenceCount);
        }
        public void ReferenceCounts2()
        {
            IByteBuffer c1 = Unpooled.Buffer().WriteByte(1);
            var         c2 = (IByteBuffer)Unpooled.Buffer().WriteByte(2).Retain();
            var         c3 = (IByteBuffer)Unpooled.Buffer().WriteByte(3).Retain(2);

            CompositeByteBuffer bufA = Unpooled.CompositeBuffer();

            bufA.AddComponents(c1, c2, c3).SetWriterIndex(3);

            CompositeByteBuffer bufB = Unpooled.CompositeBuffer();

            bufB.AddComponents((IByteBuffer)bufA);

            // Ensure that bufA.refCnt() did not change.
            Assert.Equal(1, bufA.ReferenceCount);

            // Ensure that c[123]'s refCnt did not change.
            Assert.Equal(1, c1.ReferenceCount);
            Assert.Equal(2, c2.ReferenceCount);
            Assert.Equal(3, c3.ReferenceCount);

            // This should decrease bufA.refCnt().
            bufB.Release();
            Assert.Equal(0, bufB.ReferenceCount);

            // Ensure bufA.refCnt() changed.
            Assert.Equal(0, bufA.ReferenceCount);

            // Ensure that c[123]'s refCnt also changed due to the deallocation of bufA.
            Assert.Equal(0, c1.ReferenceCount);
            Assert.Equal(1, c2.ReferenceCount);
            Assert.Equal(2, c3.ReferenceCount);

            c3.Release(2);
            c2.Release();
        }