T executeSynchronously() {
      try {
        while (true) {
          attemptComputation();

          if (isDone()) {
            if (isCancelled()) {
              throw new ProcessCanceledException();
            }
            try {
              return blockingGet(0, TimeUnit.MILLISECONDS);
            }
            catch (TimeoutException e) {
              throw new RuntimeException(e);
            }
          }

          ProgressIndicatorUtils.checkCancelledEvenWithPCEDisabled(myProgressIndicator);
          ContextConstraint[] constraints = builder.myConstraints;
          if (shouldFinishOnEdt() || constraints.length != 0) {
            Semaphore semaphore = new Semaphore(1);
            invokeLater((ContextAwareRunnable) () -> {
              if (checkObsolete()) {
                semaphore.up();
              }
              else {
                BaseConstrainedExecution.scheduleWithinConstraints(semaphore::up, null, constraints);
              }
            });
            ProgressIndicatorUtils.awaitWithCheckCanceled(semaphore, myProgressIndicator);
            if (isCancelled()) {
              throw new ProcessCanceledException();
            }
          }
        }
      } catch (ProcessCanceledException e) {
        cancelJob(e);
        throw e;
      }
      finally {
        cleanupIfNeeded();
      }
    }
T executeSynchronously()