public void SetUp() { _ringBuffer = ValueRingBuffer <StubValueEvent> .CreateMultiProducer(() => new StubValueEvent(-1), 32); _sequenceBarrier = _ringBuffer.NewBarrier(); _ringBuffer.AddGatingSequences(new NoOpEventProcessor <StubValueEvent>(_ringBuffer).Sequence); }
public void ShouldSuccessfullyPollWhenBufferIsFull() { var events = new List <byte>(); byte Factory() => 0; bool Handler(ref byte data, long sequence, bool endOfBatch) { events.Add(data); return(!endOfBatch); } var ringBuffer = ValueRingBuffer <byte> .CreateMultiProducer(Factory, 4, new SleepingWaitStrategy()); var poller = ringBuffer.NewPoller(); ringBuffer.AddGatingSequences(poller.Sequence); const int count = 4; for (byte i = 1; i <= count; ++i) { var next = ringBuffer.Next(); ringBuffer[next] = i; ringBuffer.Publish(next); } // think of another thread poller.Poll(Handler); Assert.That(events, Is.EquivalentTo(new byte[] { 1, 2, 3, 4 })); }
public void ShouldReportValueEventHandlerProgressByUpdatingSequenceViaCallback() { var ringBuffer = ValueRingBuffer <StubValueEvent> .CreateMultiProducer(() => new StubValueEvent(-1), 16); var sequenceBarrier = ringBuffer.NewBarrier(); var handler = new TestSequenceReportingEventHandler(); var batchEventProcessor = BatchEventProcessorFactory.Create(ringBuffer, sequenceBarrier, handler); ringBuffer.AddGatingSequences(batchEventProcessor.Sequence); var task = Task.Run(batchEventProcessor.Run); Assert.AreEqual(-1L, batchEventProcessor.Sequence.Value); ringBuffer.Publish(ringBuffer.Next()); handler.CallbackSignal.WaitOne(); Assert.AreEqual(0L, batchEventProcessor.Sequence.Value); handler.OnEndOfBatchSignal.Set(); Assert.AreEqual(0L, batchEventProcessor.Sequence.Value); batchEventProcessor.Halt(); Assert.IsTrue(task.Wait(TimeSpan.FromSeconds(10))); }
/// <summary> /// Create a new ValueDisruptor. Will default to <see cref="BlockingWaitStrategy"/> and <see cref="ProducerType.Multi"/>. /// </summary> /// <param name="eventFactory">the factory to create events in the ring buffer</param> /// <param name="ringBufferSize">the size of the ring buffer, must be power of 2</param> /// <param name="executor">an <see cref="IExecutor"/> to create threads for processors</param> public ValueDisruptor(Func <T> eventFactory, int ringBufferSize, IExecutor executor) : this(ValueRingBuffer <T> .CreateMultiProducer(eventFactory, ringBufferSize), executor) { }
/// <summary> /// Create a new ValueDisruptor. Will default to <see cref="BlockingWaitStrategy"/> and <see cref="ProducerType.Multi"/>. /// </summary> /// <param name="eventFactory">the factory to create events in the ring buffer</param> /// <param name="ringBufferSize">the size of the ring buffer, must be power of 2</param> /// <param name="taskScheduler">a <see cref="TaskScheduler"/> to create threads for processors</param> public ValueDisruptor(Func <T> eventFactory, int ringBufferSize, TaskScheduler taskScheduler) : this(ValueRingBuffer <T> .CreateMultiProducer(eventFactory, ringBufferSize), new BasicExecutor(taskScheduler)) { }