@Override
      public Unit invoke() {
        if (project.isDisposed()) {
          return Unit.INSTANCE;
        }

        for (final LogFile logFile : new ArrayList<>(myLogFiles)) {
          ProcessHandler process = logFile.getProcess();
          if (process != null && process.isProcessTerminated()) {
            myLogFiles.remove(logFile);
            continue;
          }

          final Set<String> oldPaths = logFile.getPaths();
          LogFileOptions options = logFile.getOptions();
          final Set<String> newPaths =
            LogFilesCollectorKt.collectLogPaths(options.getPathPattern(), options.isShowAll()); // should not be called in UI thread
          logFile.setPaths(newPaths);

          final Set<String> obsoletePaths = new HashSet<>(oldPaths);
          obsoletePaths.removeAll(newPaths);

          try {
            SwingUtilities.invokeAndWait(() -> {
              if (project.isDisposed()) {
                return;
              }

              addConfigurationConsoles(options, file -> !oldPaths.contains(file), newPaths, logFile.getConfiguration());
              for (String each : obsoletePaths) {
                myManager.removeLogConsole(each);
              }
            });
          }
          catch (InterruptedException | InvocationTargetException ignored) {
          }
        }

        if (!myLogFiles.isEmpty()) {
          myUpdateAlarm.cancelAndRequest();
        }
        return Unit.INSTANCE;
      }
@Override
      public Unit invoke()