コード例 #1
0
        public long GetRemainingCapacity()
        {
            var consumed = DisruptorUtil.GetMinimumSequence(Volatile.Read(ref _gatingSequences), _cursor.Value);
            var produced = _cursor.Value;

            return(BufferSize - (produced - consumed));
        }
コード例 #2
0
        internal long NextInternal(int n)
        {
            long current;
            long next;

            var spinWait = default(AggressiveSpinWait);

            do
            {
                current = _cursor.Value;
                next    = current + n;

                long wrapPoint            = next - _bufferSize;
                long cachedGatingSequence = _gatingSequenceCache.Value;

                if (wrapPoint > cachedGatingSequence || cachedGatingSequence > current)
                {
                    long gatingSequence = DisruptorUtil.GetMinimumSequence(Volatile.Read(ref _gatingSequences), current);

                    if (wrapPoint > gatingSequence)
                    {
                        spinWait.SpinOnce();
                        continue;
                    }

                    _gatingSequenceCache.SetValue(gatingSequence);
                }
                else if (_cursor.CompareAndSet(current, next))
                {
                    break;
                }
            } while (true);

            return(next);
        }
コード例 #3
0
        private bool HasAvailableCapacity(ISequence[] gatingSequences, int requiredCapacity, long cursorValue)
        {
            var wrapPoint            = (cursorValue + requiredCapacity) - _bufferSize;
            var cachedGatingSequence = _gatingSequenceCache.Value;

            if (wrapPoint > cachedGatingSequence || cachedGatingSequence > cursorValue)
            {
                long minSequence = DisruptorUtil.GetMinimumSequence(gatingSequences, cursorValue);
                _gatingSequenceCache.SetValue(minSequence);

                if (wrapPoint > minSequence)
                {
                    return(false);
                }
            }

            return(true);
        }
コード例 #4
0
        public void ShouldReturnLongMaxWhenNoEventProcessors()
        {
            var sequences = new Sequence[0];

            Assert.AreEqual(long.MaxValue, DisruptorUtil.GetMinimumSequence(sequences));
        }
コード例 #5
0
        public void ShouldReturnMinimumSequence()
        {
            var sequences = new[] { new Sequence(11), new Sequence(4), new Sequence(13) };

            Assert.AreEqual(4L, DisruptorUtil.GetMinimumSequence(sequences));
        }
コード例 #6
0
 /// <summary>
 /// <see cref="ISequencer.GetMinimumSequence"/>.
 /// </summary>
 public long GetMinimumSequence()
 {
     return(DisruptorUtil.GetMinimumSequence(Volatile.Read(ref _gatingSequences), _cursor.Value));
 }