void (final UpdatedFiles updatedFiles, final @Nullable Consumer<? super List<CommittedChangeList>> incomingChangesConsumer) { final Runnable task = () -> { debug("Processing updated files"); final Collection<ChangesCacheFile> caches = myCachesHolder.getAllCaches(); myPendingUpdateCount += caches.size(); for(final ChangesCacheFile cache: caches) { try { if (cache.isEmpty()) { pendingUpdateProcessed(incomingChangesConsumer); continue; } debug("Processing updated files in " + cache.getLocation()); boolean needRefresh = cache.processUpdatedFiles(updatedFiles, myNewIncomingChanges); if (needRefresh) { debug("Found unaccounted files, requesting refresh"); // todo do we need double-queueing here??? processUpdatedFilesAfterRefresh(cache, updatedFiles, incomingChangesConsumer); } else { debug("Clearing cached incoming changelists"); myCachedIncomingChangeLists = null; pendingUpdateProcessed(incomingChangesConsumer); } } catch (IOException e) { LOG.error(e); } } }; myTaskQueue.run(task); }