public void ShouldPreventProducersOvertakingEventProcessorsWrapPoint() { const int ringBufferSize = 4; var mre = new ManualResetEvent(false); var ringBuffer = CreateRingBuffer(ringBufferSize, ProducerType.Multi); var processor = new TestEventProcessor(ringBuffer.NewBarrier()); ringBuffer.AddGatingSequences(processor.Sequence); var task = Task.Run(() => { // Attempt to put in enough events to wrap around the ring buffer for (var i = 0; i < ringBufferSize + 1; i++) { var sequence = ringBuffer.Next(); ref var evt = ref ringBuffer[sequence]; evt.Value = i; ringBuffer.Publish(sequence); if (i == 3) // unblock main thread after 4th eventData published { mre.Set(); } } });
public void ShouldPreventProducersOvertakingEventProcessorsWrapPoint() { const int ringBufferSize = 4; var mre = new ManualResetEvent(false); var producerComplete = false; var ringBuffer = CreateRingBuffer(ringBufferSize, ProducerType.Multi); var processor = new TestEventProcessor(ringBuffer.NewBarrier()); ringBuffer.AddGatingSequences(processor.Sequence); var thread = new Thread( () => { for (var i = 0; i <= ringBufferSize; i++) // produce 5 events { var sequence = ringBuffer.Next(); ref var evt = ref ringBuffer[sequence]; evt.Value = i; ringBuffer.Publish(sequence); if (i == 3) // unblock main thread after 4th eventData published { mre.Set(); } } producerComplete = true; });
public void ShouldPreventProducersOvertakingEventProcessorsWrapPoint() { const int ringBufferSize = 4; var mre = new ManualResetEvent(false); var producerComplete = false; var ringBuffer = new RingBuffer <StubEvent>(() => new StubEvent(-1), ringBufferSize); var processor = new TestEventProcessor(ringBuffer.NewBarrier()); ringBuffer.AddGatingSequences(processor.Sequence); var thread = new Thread( () => { for (var i = 0; i <= ringBufferSize; i++) // produce 5 events { var sequence = ringBuffer.Next(); var evt = ringBuffer[sequence]; evt.Value = i; ringBuffer.Publish(sequence); if (i == 3) // unblock main thread after 4th eventData published { mre.Set(); } } producerComplete = true; }); thread.Start(); mre.WaitOne(); Assert.That(ringBuffer.Cursor, Is.EqualTo(ringBufferSize - 1)); Assert.IsFalse(producerComplete); processor.Run(); thread.Join(); Assert.IsTrue(producerComplete); }
public void Should_Prevent_Publishers_Over_taking_Event_Processor_Wrap_Point() { var ringBufferSize = 16; var latch = new CountdownEvent(ringBufferSize); var publisherComplete = false; var ringBuffer = RingBuffer <StubEvent> .CreateMultiProducer(StubEvent.EventFactory, ringBufferSize); var processor = new TestEventProcessor(ringBuffer.NewBarrier()); ringBuffer.AddGatingSequences(processor.GetSequence()); var thread = new Thread(() => { for (var i = 0; i <= ringBufferSize; i++) { var sequence = ringBuffer.Next(); var @event = ringBuffer.Get(sequence); @event.Value = i; ringBuffer.Publish(sequence); if (i < ringBufferSize) { latch.Signal(); } } publisherComplete = true; }); thread.Start(); latch.Wait(); Assert.Equal(ringBufferSize - 1, ringBuffer.GetCursor()); Assert.False(publisherComplete); processor.Run(); thread.Join(); Assert.True(publisherComplete); }
public void ShouldPreventProducersOvertakingEventProcessorsWrapPoint() { const int ringBufferSize = 4; var mre = new ManualResetEvent(false); var ringBuffer = new RingBuffer <StubEvent>(() => new StubEvent(-1), ringBufferSize); var processor = new TestEventProcessor(ringBuffer.NewBarrier()); ringBuffer.AddGatingSequences(processor.Sequence); var task = Task.Run(() => { // Attempt to put in enough events to wrap around the ring buffer for (var i = 0; i < ringBufferSize + 1; i++) { var sequence = ringBuffer.Next(); var evt = ringBuffer[sequence]; evt.Value = i; ringBuffer.Publish(sequence); if (i == 3) // unblock main thread after 4th eventData published { mre.Set(); } } }); mre.WaitOne(); // Publisher should not be complete, blocked at RingBuffer.Next Assert.IsFalse(task.IsCompleted); // Run the processor, freeing up entries in the ring buffer for the producer to continue and "complete" processor.Run(); // Check producer completes Assert.IsTrue(task.Wait(TimeSpan.FromSeconds(1))); }
public void ShouldPreventProducersOvertakingEventProcessorsWrapPoint() { const int ringBufferSize = 4; var mre = new ManualResetEvent(false); var producerComplete = false; var ringBuffer = new RingBuffer<StubEvent>(() => new StubEvent(-1), ringBufferSize); var processor = new TestEventProcessor(ringBuffer.NewBarrier()); ringBuffer.SetGatingSequences(processor.Sequence); var thread = new Thread( () => { for (int i = 0; i <= ringBufferSize; i++) // produce 5 events { var sequence = ringBuffer.Next(); StubEvent evt = ringBuffer[sequence]; evt.Value = i; ringBuffer.Publish(sequence); if (i == 3) // unblock main thread after 4th event published { mre.Set(); } } producerComplete = true; }); thread.Start(); mre.WaitOne(); Assert.AreEqual(ringBufferSize - 1, ringBuffer.Cursor); Assert.IsFalse(producerComplete); processor.Run(); thread.Join(); Assert.IsTrue(producerComplete); }