/// <summary> /// Claim the next sequence in the <see cref="Sequencer"/> /// The caller should be held up until the claimed sequence is available by tracking the dependentSequences. /// </summary> /// <param name="dependentSequences">dependentSequences to be checked for range.</param> /// <returns>the index to be used for the publishing.</returns> public long IncrementAndGet(Sequence[] dependentSequences) { MutableLong minGatingSequence = _minGatingSequenceThreadLocal.Value; WaitForCapacity(dependentSequences, minGatingSequence); long nextSequence = _claimSequence.IncrementAndGet(); WaitForFreeSlotAt(nextSequence, dependentSequences, minGatingSequence); return(nextSequence); }
private void WaitForFreeSlotAt(long sequence, Sequence[] dependentSequences, MutableLong minGatingSequence) { long wrapPoint = sequence - _bufferSize; if (wrapPoint > minGatingSequence.Value) { long minSequence; while (wrapPoint > (minSequence = Util.GetMinimumSequence(dependentSequences))) { //TODO LockSupport.parkNanos(1L); } minGatingSequence.Value = minSequence; } }
private void WaitForCapacity(Sequence[] dependentSequences, MutableLong minGatingSequence) { long wrapPoint = (_claimSequence.Value + 1L) - _bufferSize; if (wrapPoint > minGatingSequence.Value) { long minSequence; while (wrapPoint > (minSequence = Util.GetMinimumSequence(dependentSequences))) { //TODO LockSupport.parkNanos(1L); } minGatingSequence.Value = minSequence; } }
private void WaitForFreeSlotAt(long sequence, Sequence[] dependentSequences, MutableLong minGatingSequence) { long wrapPoint = sequence - _bufferSize; if (wrapPoint > minGatingSequence.Value) { var spinWait = default(SpinWait); long minSequence; while (wrapPoint > (minSequence = Util.GetMinimumSequence(dependentSequences))) { spinWait.SpinOnce(); //Java version uses LockSupport.parkNanos(1L); } minGatingSequence.Value = minSequence; } }
private void WaitForCapacity(Sequence[] dependentSequences, MutableLong minGatingSequence) { long wrapPoint = (_claimSequence.ReadFullFence() + 1L) - _bufferSize; if (wrapPoint > minGatingSequence.Value) { long minSequence; var spinWait = default(SpinWait); while (wrapPoint > (minSequence = Util.GetMinimumSequence(dependentSequences))) { spinWait.SpinOnce(); //LockSupport.parkNanos(1L); } minGatingSequence.Value = minSequence; } }
private bool HasAvailableCapacity(long sequence, int availableCapacity, Sequence[] dependentSequences) { long wrapPoint = (sequence + availableCapacity) - _bufferSize; MutableLong minGatingSequence = _minGatingSequenceThreadLocal.Value; if (wrapPoint > minGatingSequence.Value) { long minSequence = Util.GetMinimumSequence(dependentSequences); minGatingSequence.Value = minSequence; if (wrapPoint > minSequence) { return(false); } } return(true); }
/// <summary> /// Is there available capacity in the buffer for the requested sequence. /// </summary> /// <param name="availableCapacity">availableCapacity remaining in the buffer.</param> /// <param name="dependentSequences">dependentSequences to be checked for range.</param> /// <returns>true if the buffer has capacity for the requested sequence.</returns> public bool HasAvailableCapacity(int availableCapacity, Sequence[] dependentSequences) { long wrapPoint = (_claimSequence.ReadFullFence() + availableCapacity) - _bufferSize; MutableLong minGatingSequence = _minGatingSequenceThreadLocal.Value; if (wrapPoint > minGatingSequence.Value) { long minSequence = Util.GetMinimumSequence(dependentSequences); minGatingSequence.Value = minSequence; if (wrapPoint > minSequence) { return(false); } } return(true); }