public long GetRemainingCapacity() { var consumed = DisruptorUtil.GetMinimumSequence(Volatile.Read(ref _gatingSequences), _cursor.Value); var produced = _cursor.Value; return(BufferSize - (produced - consumed)); }
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); }
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); }
public void ShouldReturnLongMaxWhenNoEventProcessors() { var sequences = new Sequence[0]; Assert.AreEqual(long.MaxValue, DisruptorUtil.GetMinimumSequence(sequences)); }
public void ShouldReturnMinimumSequence() { var sequences = new[] { new Sequence(11), new Sequence(4), new Sequence(13) }; Assert.AreEqual(4L, DisruptorUtil.GetMinimumSequence(sequences)); }
/// <summary> /// <see cref="ISequencer.GetMinimumSequence"/>. /// </summary> public long GetMinimumSequence() { return(DisruptorUtil.GetMinimumSequence(Volatile.Read(ref _gatingSequences), _cursor.Value)); }