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