public void ShouldAlwaysHalt() { var waitStrategy = new BusySpinWaitStrategy(); var sequencer = new SingleProducerSequencer(8, waitStrategy); var barrier = ProcessingSequenceBarrierFactory.Create(sequencer, waitStrategy, new Sequence(-1), new Sequence[0]); var dp = new DummyDataProvider <object>(); var h1 = new LifeCycleHandler(); var p1 = CreateBatchEventProcessor(dp, barrier, h1); var t1 = new Thread(p1.Run); p1.Halt(); t1.Start(); Assert.IsTrue(h1.WaitStart(TimeSpan.FromSeconds(2))); Assert.IsTrue(h1.WaitShutdown(TimeSpan.FromSeconds(2))); for (int i = 0; i < 1000; i++) { var h2 = new LifeCycleHandler(); var p2 = CreateBatchEventProcessor(dp, barrier, h2); var t2 = new Thread(p2.Run); t2.Start(); p2.Halt(); Assert.IsTrue(h2.WaitStart(TimeSpan.FromSeconds(2))); Assert.IsTrue(h2.WaitShutdown(TimeSpan.FromSeconds(2))); } for (int i = 0; i < 1000; i++) { var h2 = new LifeCycleHandler(); var p2 = CreateBatchEventProcessor(dp, barrier, h2); var t2 = new Thread(p2.Run); t2.Start(); Thread.Yield(); p2.Halt(); Assert.IsTrue(h2.WaitStart(TimeSpan.FromSeconds(2))); Assert.IsTrue(h2.WaitShutdown(TimeSpan.FromSeconds(2))); } }
/// <summary> /// Create a <see cref="ISequenceBarrier"/> that gates on the the cursor and a list of <see cref="Sequence"/>s /// </summary> /// <param name="sequencesToTrack"></param> /// <returns></returns> public ISequenceBarrier NewBarrier(params ISequence[] sequencesToTrack) { return(ProcessingSequenceBarrierFactory.Create(this, _waitStrategy, _cursor, sequencesToTrack)); }