@RequiresBackgroundThread
  public EntryPoint acquire(@NotNull Target target, @NotNull Parameters configuration, @Nullable ProgressIndicator indicator)
    throws Exception {

    EntryPoint inProcess = acquireInProcess(target, configuration);
    if (inProcess != null) return inProcess;

    Ref<RunningInfo> ref = Ref.create(null);
    Pair<Target, Parameters> key = Pair.create(target, configuration);
    boolean created = false;
    if (!getExistingInfo(ref, key)) {
      startProcess(target, configuration, key);
      if (ref.isNull()) {
        try {
          //noinspection SynchronizationOnLocalVariableOrMethodParameter
          synchronized (ref) {
            while (ref.isNull()) {
              ref.wait(1000);
              checkIndicator(indicator);
            }
          }
        }
        catch (InterruptedException e) {
          checkIndicator(indicator);
        }
      }
      created = true;
    }
    RunningInfo info = ref.get();
    if (info instanceof FailedInfo o) {
      String message = o.cause != null && StringUtil.isEmptyOrSpaces(o.stderr) ? o.cause.getMessage() : o.stderr;
      throw new ExecutionException(message, o.cause);
    }
    else if (info == null || info.handler == null) {
      throw new ExecutionException(ExecutionBundle.message("dialog.remote.process.unable.to.acquire.remote.proxy.for", getName(target)));
    }
    EntryPoint result = acquire(info);
    if (created) {
      onCreated(target, configuration, result);
    }
    return result;
  }
@RequiresBackgroundThread
  public EntryPoint acquire(@NotNull Target target, @NotNull Parameters configuration, @Nullable ProgressIndicator indicator)