Exemplo n.º 1
0
        public void SetUp()
        {
            _ringBuffer = ValueRingBuffer <StubValueEvent> .CreateMultiProducer(() => new StubValueEvent(-1), 32);

            _sequenceBarrier = _ringBuffer.NewBarrier();
            _ringBuffer.AddGatingSequences(new NoOpEventProcessor <StubValueEvent>(_ringBuffer).Sequence);
        }
Exemplo n.º 2
0
        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)));
        }
Exemplo n.º 4
0
 /// <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)
 {
 }
Exemplo n.º 5
0
 /// <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))
 {
 }