public override long waitFor(long sequence, Sequence cursor, Sequence[] dependents, ISequenceBarrier barrier) { long availableSequence; if ((availableSequence = cursor.get()) < sequence) { lock (_lock) { try { ++numWaiters; while ((availableSequence = cursor.get()) < sequence) { barrier.checkAlert(); Monitor.Wait(_lock); } } finally { --numWaiters; } } } if (0 != dependents.Length) { while ((availableSequence = Util.getMinimumSequence(dependents)) < sequence) { barrier.checkAlert(); } } return availableSequence; }
public override void serialisePublishing(long sequence, Sequence cursor, int batchSize) { long expectedSequence = sequence - batchSize; if (expectedSequence == cursor.get()) { cursor.set(sequence); if (sequence == claimSequence.get()) { return; } } else { for (long i = expectedSequence + 1; i < sequence; i++) { pendingPublications.lazySet((int)i & indexMask, i); } pendingPublications.set((int)sequence & indexMask, sequence); } if (csLock.compareAndSet(0L, 1L)) { long initialCursor = cursor.get(); long currentCursor = initialCursor; while (currentCursor < claimSequence.get()) { long nextSequence = currentCursor + 1L; if (nextSequence != pendingPublications.get((int)nextSequence & indexMask)) { break; } currentCursor = nextSequence; } if (currentCursor > initialCursor) { cursor.set(currentCursor); } csLock.set(0L); } }