Reader startRead() {
    if (isReadGrantedByStrongerLock())
      return null;
    Reader status = R.get();
    throwIfImpatient(status);
    if (status.readRequested) return null;

    if (!tryReadLock(status)) {
      ProgressIndicator progress = ProgressIndicatorProvider.getGlobalProgressIndicator();
      for (int iter = 0; ; iter++) {
        if (tryReadLock(status)) {
          break;
        }
        // do not run any checkCanceled hooks to avoid deadlock
        if (progress != null && progress.isCanceled() && !ProgressManager.getInstance().isInNonCancelableSection()) {
          throw new ProcessCanceledException();
        }
        waitABit(status, iter);
      }
    }
    return status;
  }
Reader startRead()