@Override
  public long waitFor(
      long sequence, Sequence cursor, Sequence dependentSequence, SequenceBarrier barrier)
      throws AlertException, InterruptedException {
    long availableSequence;
    long startTime = 0;
    int counter = SPIN_TRIES;

    do {
      if ((availableSequence = dependentSequence.get()) >= sequence) {
        return availableSequence;
      }

      if (0 == --counter) {
        if (0 == startTime) {
          startTime = System.nanoTime();
        } else {
          long timeDelta = System.nanoTime() - startTime;
          if (timeDelta > yieldTimeoutNanos) {
            return lockingStrategy.waitOnLock(sequence, cursor, dependentSequence, barrier);
          } else if (timeDelta > spinTimeoutNanos) {
            Thread.yield();
          }
        }
        counter = SPIN_TRIES;
      }
    } while (true);
  }
 @Override
 public void signalAllWhenBlocking() {
   lockingStrategy.signalAllWhenBlocking();
 }