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); }); }
public void SetUp() { _buffer = Substitute.For <IUnsafeBuffer>(); _buffer.Size.Returns(TotalBufferLength); _buffer.GetAtomicLong(Arg.Any <long>()).Returns(ci => new AtomicLong((byte *)ci.Arg <long>())); _buffer.GetAtomicInt(Arg.Any <long>()).Returns(ci => new AtomicInt((byte *)ci.Arg <long>())); _atomicLong = Substitute.For <Mocks.IAtomicLong>(); Mocks.AtomicLong = _atomicLong; _atomicInt = Substitute.For <Mocks.IAtomicInt>(); Mocks.AtomicInt = _atomicInt; _ringBuffer = new ManyToOneRingBuffer(_buffer); }
public bool Write(int messageTypeId, ByteChunk chunk) { ValidateMessageTypeId(messageTypeId); ValidateLength(chunk); var isSuccessful = false; var recordLength = chunk.Length + HeaderLength; var requiredCapacity = recordLength.AlignToMultipleOf(RecordAlignment); var recordIndex = ClaimCapacity(requiredCapacity); if (InsufficientCapacity != recordIndex) { var index = _buffer.GetAtomicLong(recordIndex); index.VolatileWrite(MakeHeader(-recordLength, messageTypeId)); var offset = EncodedMsgOffset(recordIndex); _buffer.Write(offset, chunk); _buffer.GetAtomicInt(recordIndex).VolatileWrite(recordLength); isSuccessful = true; } return(isSuccessful); }
public void SetUp() { _buffer = Substitute.For<IUnsafeBuffer>(); _buffer.Size.Returns(TotalBufferLength); _buffer.GetAtomicLong(Arg.Any<long>()).Returns(ci => new AtomicLong((byte*) ci.Arg<long>())); _buffer.GetAtomicInt(Arg.Any<long>()).Returns(ci => new AtomicInt((byte*) ci.Arg<long>())); _atomicLong = Substitute.For<Mocks.IAtomicLong>(); Mocks.AtomicLong = _atomicLong; _atomicInt = Substitute.For<Mocks.IAtomicInt>(); Mocks.AtomicInt = _atomicInt; _ringBuffer = new OneToOneRingBuffer(_buffer); }