code: private Object waitingGet(boolean interruptible) {
      Signaller q = null;
      boolean queued = false;
      Object r;
      while ((r = result) == null) {
        if (q == null) {
          q = new Signaller(interruptible, 0L, 0L);
          if (Thread.currentThread() instanceof ForkJoinWorkerThread)
            ForkJoinPool.helpAsyncBlocker(defaultExecutor(), q);
        } else if (!queued)
          queued = tryPushStack(q);
        else {
          try {
            ForkJoinPool.managedBlock(q);
          } catch (InterruptedException ie) { // currently cannot happen
            q.interrupted = true;
          }
          if (q.interrupted && interruptible)
            break;
        }
      }
      if (q != null && queued) {
        q.thread = null;
        if (!interruptible && q.interrupted)
          Thread.currentThread().interrupt();
        if (r == null)
          cleanStack();
      }
      if (r != null || (r = result) != null)
        postComplete();
      return r;
    }
docs: Returns raw result after waiting, or null if interruptible and interrupted.