public void ShouldBlockProducerUntilAllEventProcessorsHaveAdvanced() { var delayedEventHandler = CreateDelayedEventHandler(); _disruptor.HandleEventsWith(delayedEventHandler); var ringBuffer = _disruptor.Start(); delayedEventHandler.AwaitStart(); var stubPublisher = new StubPublisher(ringBuffer); try { _executor.Execute(() => stubPublisher.Run()); AssertProducerReaches(stubPublisher, 4, true); delayedEventHandler.ProcessEvent(); delayedEventHandler.ProcessEvent(); delayedEventHandler.ProcessEvent(); delayedEventHandler.ProcessEvent(); delayedEventHandler.ProcessEvent(); AssertProducerReaches(stubPublisher, 5, false); } finally { stubPublisher.Halt(); } }
private static void AssertProducerReaches(StubPublisher stubPublisher, int expectedPublicationCount, bool strict) { var loopStart = DateTime.UtcNow; while (stubPublisher.GetPublicationCount() < expectedPublicationCount && DateTime.UtcNow - loopStart < TimeSpan.FromMilliseconds(5)) { Thread.Yield(); } if (strict) { Assert.That(stubPublisher.GetPublicationCount(), Is.EqualTo(expectedPublicationCount)); } else { var actualPublicationCount = stubPublisher.GetPublicationCount(); Assert.IsTrue(actualPublicationCount >= expectedPublicationCount, "Producer reached unexpected count. Expected at least " + expectedPublicationCount + " but only reached " + actualPublicationCount); } }