public synchronized void stop() {
    if (myOriginal.isRunning()) {
      myOriginal.stop();
    } else {
      myStartupAlarm.cancelAllRequests();
    }

    // needed only for correct assertion of !progress.isRunning() in
    // ApplicationImpl.runProcessWithProgressSynchroniously
    final Semaphore semaphore = new Semaphore();
    semaphore.down();

    SwingUtilities.invokeLater(
        new Runnable() {
          public void run() {
            semaphore.waitFor();
            if (myDialog != null) {
              // System.out.println("myDialog.destroyProcess()");
              myDialog.close(DialogWrapper.OK_EXIT_CODE);
              myDialog = null;
            }
          }
        });

    super.stop(); // should be last to not leaveModal before closing the dialog
    semaphore.up();
  }
  private void removeCommitFromQueue(@NotNull Document document) {
    synchronized (documentsToCommit) {
      ProgressIndicator indicator = document.getUserData(COMMIT_PROGRESS);

      if (indicator != null && indicator.isRunning()) {
        indicator.stop(); // mark document as removed

        log("Removed from queue", document, false);
      }
      // let our thread know that queue must be polled again
      wakeUpQueue();
    }
  }
    @Override
    public void run(@NotNull ProgressIndicator indicator) {
      final List<Root> emptyRoots =
          loadRoots(
              myProject,
              myVcsRoots,
              myExceptions,
              false); // collect roots without fetching - just to show dialog
      if (!myExceptions.isEmpty()) {
        myExceptions.addAll(myExceptions);
        return;
      }
      myDialog = new GitPushActiveBranchesDialog(myProject, myVcsRoots, emptyRoots);
      myDialog.refreshTree(true, null, false); // start initial fetch

      indicator
          .stop(); // if indicator is not stopped, the progress would be displayed all the time the
      // dialog is displayed.
    }
  @Override
  public void run(@NotNull final ProgressIndicator indicator) {
    myIndicator = indicator;

    final ProjectManager projectManager = ProjectManager.getInstance();
    projectManager.addProjectManagerListener(myProject, myCloseListener = new CloseListener());

    final Semaphore semaphore =
        ((CompilerManagerImpl) CompilerManager.getInstance(myProject)).getCompilationSemaphore();
    boolean acquired = false;
    try {

      try {
        while (!acquired) {
          acquired = semaphore.tryAcquire(300, TimeUnit.MILLISECONDS);
          if (!acquired && !myWaitForPreviousSession) {
            return;
          }
          if (indicator.isCanceled()) {
            // give up obtaining the semaphore,
            // let compile work begin in order to stop gracefuly on cancel event
            break;
          }
        }
      } catch (InterruptedException ignored) {
      }

      if (!isHeadless()) {
        addIndicatorDelegate();
      }
      myCompileWork.run();
    } finally {
      try {
        indicator.stop();
        projectManager.removeProjectManagerListener(myProject, myCloseListener);
      } finally {
        if (acquired) {
          semaphore.release();
        }
      }
    }
  }
  @Override
  public synchronized void stop() {
    if (myOriginal.isRunning()) {
      myOriginal.stop();
    } else {
      myStartupAlarm.cancelAllRequests();

      if (!myOriginalStarted && myOriginal instanceof Disposable) {
        // dispose original because start & stop were not called so original progress might not have
        // released its resources
        Disposer.dispose(((Disposable) myOriginal));
      }
    }

    // needed only for correct assertion of !progress.isRunning() in
    // ApplicationImpl.runProcessWithProgressSynchroniously
    final Semaphore semaphore = new Semaphore();
    semaphore.down();

    SwingUtilities.invokeLater(
        new Runnable() {
          @Override
          public void run() {
            semaphore.waitFor();
            if (myDialog != null) {
              // System.out.println("myDialog.destroyProcess()");
              myDialog.close(DialogWrapper.OK_EXIT_CODE);
              myDialog = null;
            }
          }
        });

    try {
      super.stop(); // should be last to not leaveModal before closing the dialog
    } finally {
      semaphore.up();
    }
  }
 @Override
 @NotNull
 public Collection<? extends AbstractTreeNode> getChildren() {
   ProgressIndicator current = ProgressManager.getInstance().getProgressIndicator();
   ProgressIndicator indicator = current == null ? new ProgressIndicatorBase() : current;
   if (current == null) {
     indicator.start();
   }
   final Collection[] nodes = new Collection[1];
   ProgressManager.getInstance()
       .executeProcessUnderProgress(
           new Runnable() {
             @Override
             public void run() {
               nodes[0] =
                   getChildrenUnderProgress(ProgressManager.getInstance().getProgressIndicator());
             }
           },
           indicator);
   if (current == null) {
     indicator.stop();
   }
   return nodes[0];
 }
 @CalledInAwt
 private static void finish(@NotNull Runnable result, @NotNull ProgressIndicator indicator) {
   if (indicator.isCanceled()) return;
   result.run();
   indicator.stop();
 }
 @Override
 public void stop() {
   myIndicator.stop();
 }