/// <summary> /// <see cref="IWaitStrategy.WaitFor"/>. /// </summary> public long WaitFor(long sequence, Sequence cursor, ISequence dependentSequence, ISequenceBarrier barrier) { var milliseconds = _timeoutInMilliseconds; long availableSequence; if (cursor.Value < sequence) { lock (_lock) { while (cursor.Value < sequence) { Interlocked.Exchange(ref _signalNeeded, 1); barrier.CheckAlert(); if (!Monitor.Wait(_lock, milliseconds)) { throw TimeoutException.Instance; } } } } var aggressiveSpinWait = new AggressiveSpinWait(); while ((availableSequence = dependentSequence.Value) < sequence) { barrier.CheckAlert(); aggressiveSpinWait.SpinOnce(); } return(availableSequence); }
/// <summary> /// <see cref="IWaitStrategy.WaitFor"/> /// </summary> public long WaitFor(long sequence, Sequence cursor, ISequence dependentSequence, ISequenceBarrier barrier) { var timeSpan = _timeout; if (cursor.Value < sequence) { lock (_gate) { while (cursor.Value < sequence) { barrier.CheckAlert(); if (!Monitor.Wait(_gate, timeSpan)) { throw TimeoutException.Instance; } } } } var aggressiveSpinWait = new AggressiveSpinWait(); long availableSequence; while ((availableSequence = dependentSequence.Value) < sequence) { barrier.CheckAlert(); aggressiveSpinWait.SpinOnce(); } return(availableSequence); }
/// <summary> /// <see cref="IWaitStrategy.WaitFor"/> /// </summary> public long WaitFor(long sequence, Sequence cursor, ISequence dependentSequence, ISequenceBarrier barrier) { if (cursor.Value < sequence) { lock (_gate) { while (cursor.Value < sequence) { barrier.CheckAlert(); Monitor.Wait(_gate); } } } var aggressiveSpinWait = new AggressiveSpinWait(); long availableSequence; while ((availableSequence = dependentSequence.Value) < sequence) { barrier.CheckAlert(); aggressiveSpinWait.SpinOnce(); } return(availableSequence); }