@Test public void shouldSetAndClearAlertStatus() { SequenceBarrier sequenceBarrier = ringBuffer.newBarrier(); assertFalse(sequenceBarrier.isAlerted()); sequenceBarrier.alert(); assertTrue(sequenceBarrier.isAlerted()); sequenceBarrier.clearAlert(); assertFalse(sequenceBarrier.isAlerted()); }
@Test public void shouldInterruptDuringBusySpin() throws Exception { final long expectedNumberMessages = 10; fillRingBuffer(expectedNumberMessages); final CountDownLatch latch = new CountDownLatch(3); final Sequence sequence1 = new CountDownLatchSequence(8L, latch); final Sequence sequence2 = new CountDownLatchSequence(8L, latch); final Sequence sequence3 = new CountDownLatchSequence(8L, latch); context.checking( new Expectations() { { one(eventProcessor1).getSequence(); will(returnValue(sequence1)); one(eventProcessor2).getSequence(); will(returnValue(sequence2)); one(eventProcessor3).getSequence(); will(returnValue(sequence3)); } }); final SequenceBarrier sequenceBarrier = ringBuffer.newBarrier( Util.getSequencesFor(eventProcessor1, eventProcessor2, eventProcessor3)); final boolean[] alerted = {false}; Thread t = new Thread( new Runnable() { public void run() { try { sequenceBarrier.waitFor(expectedNumberMessages - 1); } catch (AlertException e) { alerted[0] = true; } catch (InterruptedException e) { // don't care } } }); t.start(); latch.await(3, TimeUnit.SECONDS); sequenceBarrier.alert(); t.join(); assertTrue("Thread was not interrupted", alerted[0]); }
@Override public void halt() { running.set(false); sequenceBarrier.alert(); }