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)); }
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)); }
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); }
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(); }