Пример #1
0
        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;
            });
Пример #3
0
        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);
        }
Пример #4
0
        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)));
    }
Пример #6
0
        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);
        }