void (@NotNull List<VirtualFile> roots) { if (roots.isEmpty()) return; synchronized (myLock) { if (myInvocationCounter >= ourInvocationMax) return; ++myCounter; --myDownStartCounter; if (myCounter <= ourFrequency && myDownStartCounter < 0) return; myCounter = 0; ++myInvocationCounter; } executeOnPooledThread(this, () -> { List<VirtualFile> incompatible = filter(roots, SvnCompatibilityChecker::seemsVersioned); if (!incompatible.isEmpty()) notify(incompatible); }); }