public void ShouldReportProgressByUpdatingSequenceViaCallback()
        {
            var ringBuffer          = new RingBuffer <StubEvent>(() => new StubEvent(0), 16);
            var sequenceBarrier     = ringBuffer.NewBarrier();
            var handler             = new TestSequenceReportingEventHandler(_callbackLatch);
            var batchEventProcessor = new BatchEventProcessor <StubEvent>(ringBuffer, sequenceBarrier, handler);

            ringBuffer.SetGatingSequences(batchEventProcessor.Sequence);

            var thread = new Thread(batchEventProcessor.Run)
            {
                IsBackground = true
            };

            thread.Start();

            Assert.AreEqual(-1L, batchEventProcessor.Sequence.Value);
            ringBuffer.Publish(ringBuffer.Next());

            _callbackLatch.WaitOne();
            Assert.AreEqual(0L, batchEventProcessor.Sequence.Value);

            _onEndOfBatchLatch.Set();
            Assert.AreEqual(0L, batchEventProcessor.Sequence.Value);

            batchEventProcessor.Halt();
            thread.Join();
        }
示例#2
0
        public void ShouldReportProgressByUpdatingSequenceViaCallback()
        {
            var ringBuffer = RingBuffer <StubEvent> .CreateMultiProducer(() => new StubEvent(-1), 16);

            var sequenceBarrier = ringBuffer.NewBarrier();
            ISequenceReportingEventHandler <StubEvent> handler = new TestSequenceReportingEventHandler(_callbackSignal, _onEndOfBatchSignal);
            var batchEventProcessor = BatchEventProcessorFactory.Create(ringBuffer, sequenceBarrier, handler);

            ringBuffer.AddGatingSequences(batchEventProcessor.Sequence);

            var thread = new Thread(batchEventProcessor.Run)
            {
                IsBackground = true
            };

            thread.Start();

            Assert.AreEqual(-1L, batchEventProcessor.Sequence.Value);
            ringBuffer.Publish(ringBuffer.Next());

            _callbackSignal.WaitOne();
            Assert.AreEqual(0L, batchEventProcessor.Sequence.Value);

            _onEndOfBatchSignal.Set();
            Assert.AreEqual(0L, batchEventProcessor.Sequence.Value);

            batchEventProcessor.Halt();
            thread.Join();
        }
        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)));
        }