Exemplo n.º 1
0
        public void Should_return_correct_values_for_multiclaim()
        {
            var blockingWaitStrategy = new BlockingWaitStrategy();
            var writer = new RingBufferWriter(5, blockingWaitStrategy);

            var first = writer.Claim(3);
            var second = writer.Claim(4);

            Assert.That(first, Is.EqualTo(2));
            Assert.That(second, Is.EqualTo(6));
        }
Exemplo n.º 2
0
        public void Should_return_correct_values_for_claim()
        {
            var blockingWaitStrategy = new BlockingWaitStrategy();
            var writer = new RingBufferWriter(5, blockingWaitStrategy);

            var first  = writer.Claim();
            var second = writer.Claim();

            Assert.That(first, Is.EqualTo(0));
            Assert.That(second, Is.EqualTo(1));
        }
Exemplo n.º 3
0
        public void Should_return_correct_values_for_multiclaim2()
        {
            var blockingWaitStrategy = new BlockingWaitStrategy();
            var writer = new ConcurrentRingBufferWriter(5, blockingWaitStrategy);

            var first  = writer.Claim(3);
            var second = writer.Claim(4);

            Assert.That(first, Is.EqualTo(2));
            Assert.That(second, Is.EqualTo(6));

            writer.Commit(second, 4);
            writer.Commit(first, 3);
        }
Exemplo n.º 4
0
        public void StartProcessing()
        {
            // Check the processing started flag.
            if (IsProcessing)
            {
                throw new InvalidOperationException(Resources.Strings.AsyncQueueStartError);
            }

            _claimStrategy = ClaimStrategy;
            _waitStrategy  = WaitStrategy;
            _bufferSize    = Math.Max(128, BufferSize);

            // Reset asynchronous queue size.
            Interlocked.Exchange(ref _asyncQueueSize, 0);

            IClaimStrategy disruptorClaimStrategy;

            switch (_claimStrategy)
            {
            case ClaimStrategyType.SingleThreaded:
                disruptorClaimStrategy = new SingleThreadedClaimStrategy(_bufferSize);
                break;

            case ClaimStrategyType.MultiThreaded:
                disruptorClaimStrategy = new MultiThreadedClaimStrategy(_bufferSize);
                break;

            case ClaimStrategyType.MultiThreadedLowContention:
                disruptorClaimStrategy = new MultiThreadedLowContentionClaimStrategy(_bufferSize);
                break;

            default:
                disruptorClaimStrategy = new MultiThreadedClaimStrategy(_bufferSize);
                break;
            }

            IWaitStrategy disruptorWaitStrategy;

            switch (_waitStrategy)
            {
            case WaitStrategyType.Blocking:
                disruptorWaitStrategy = new BlockingWaitStrategy();
                break;

            case WaitStrategyType.BusySpin:
                disruptorWaitStrategy = new BusySpinWaitStrategy();
                break;

            case WaitStrategyType.Sleeping:
                disruptorWaitStrategy = new SleepingWaitStrategy();
                break;

            case WaitStrategyType.Yielding:
                disruptorWaitStrategy = new YieldingWaitStrategy();
                break;

            default:
                disruptorWaitStrategy = new YieldingWaitStrategy();
                break;
            }

            // Initialize processing consumer.
            _processingConsumer = new ProcessingConsumer(this);

            // Initialize processing disruptor.
            _processingDisruptor = new Disruptor <ValueEntry>(() => new ValueEntry(), disruptorClaimStrategy, disruptorWaitStrategy, TaskScheduler.Default);
            _processingDisruptor.HandleEventsWith(_processingConsumer);

            // Create ring buffer.
            _processingRingBuffer = _processingDisruptor.Start();

            // Set the processing started flag.
            IsProcessing = true;

            // Rise asynchronous processing start event.
            HandleStart();
        }