コード例 #1
0
ファイル: ManyToOneBufferTests.cs プロジェクト: zhangz/RampUp
        public void ShouldWriteToEmptyBuffer()
        {
            const int length              = 8;
            var       recordLength        = length + RingBufferDescriptor.HeaderLength;
            var       alignedRecordLength = recordLength.AlignToMultipleOf(RingBufferDescriptor.RecordAlignment);

            const int headValue = 0;

            _atomicLong.VolatileRead(Arg.Is(Head)).Returns(headValue);
            const int tailValue = 0;

            _atomicLong.VolatileRead(Arg.Is(Tail)).Returns(tailValue);

            _atomicLong.CompareExchange(Arg.Is(Tail), Arg.Is(tailValue), Arg.Is(tailValue + alignedRecordLength))
            .Returns(tailValue);

            var block = stackalloc byte[100];

            var chunk = new ByteChunk(block, length);

            Assert.IsTrue(_ringBuffer.Write(MessageTypeId, chunk));

            Received.InOrder(() =>
            {
                _atomicLong.VolatileWrite(CurrentSlot, RingBufferDescriptor.MakeHeader(-recordLength, MessageTypeId));
                _buffer.Write(RingBufferDescriptor.EncodedMsgOffset(tailValue), chunk);
                _buffer.GetAtomicInt(tailValue);
                _atomicInt.VolatileWrite(CurrentSlot, recordLength);
            });
        }
コード例 #2
0
ファイル: OneToOneBufferTests.cs プロジェクト: zhangz/RampUp
        public void ShouldInsertPaddingAndWriteToBuffer()
        {
            const int padding             = 200;
            const int messageLength       = 400;
            var       recordLength        = messageLength + RingBufferDescriptor.HeaderLength;
            var       alignedRecordLength = recordLength.AlignToMultipleOf(RingBufferDescriptor.RecordAlignment);

            const long tail = 2 * Capacity - padding;
            const long head = tail;

            // free space is (200 + 300) more than message length (400) but contiguous space (300) is less than message length (400)
            const long headCache = Capacity + 300;

            _atomicLong.VolatileRead(Head).Returns(head);
            _atomicLong.VolatileRead(Tail).Returns(tail);
            _atomicLong.VolatileRead(HeadCounterCache).Returns(headCache);
            _atomicLong.CompareExchange(Tail, tail + alignedRecordLength + padding, tail).Returns(tail);

            byte *payload = stackalloc byte[messageLength];

            Assert.True(_ringBuffer.Write(MessageTypeId, new ByteChunk(payload, messageLength)));
        }