mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
push VFS event merger into IndexedFilesListener to simplify implementations
GitOrigin-RevId: e3fd2227841b274f8dd41d326153498b6c2cbc37
This commit is contained in:
committed by
intellij-monorepo-bot
parent
30cb7b88c7
commit
3a0ee456a8
@@ -771,7 +771,6 @@ class IndexTest extends JavaCodeInsightFixtureTestCase {
|
||||
}
|
||||
|
||||
class RecordingVfsListener extends IndexedFilesListener {
|
||||
def vfsEventMerger = new VfsEventsMerger()
|
||||
|
||||
@Override
|
||||
protected void iterateIndexableFiles(@NotNull VirtualFile file, @NotNull ContentIterator iterator) {
|
||||
@@ -784,18 +783,9 @@ class IndexTest extends JavaCodeInsightFixtureTestCase {
|
||||
})
|
||||
}
|
||||
|
||||
protected void doInvalidateIndicesForFile(@NotNull VirtualFile file, boolean contentChange) {
|
||||
vfsEventMerger.recordBeforeFileEvent(((VirtualFileWithId)file).id, file, contentChange)
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void buildIndicesForFile(@NotNull VirtualFile file, boolean contentChange) {
|
||||
vfsEventMerger.recordFileEvent(((VirtualFileWithId)file).id, file, contentChange)
|
||||
}
|
||||
|
||||
String indexingOperation(VirtualFile file) {
|
||||
Ref<String> operation = new Ref<>()
|
||||
vfsEventMerger.processChanges(new VfsEventsMerger.VfsEventProcessor() {
|
||||
eventMerger.processChanges(new VfsEventsMerger.VfsEventProcessor() {
|
||||
@Override
|
||||
boolean process(@NotNull VfsEventsMerger.ChangeInfo info) {
|
||||
operation.set(info.toString())
|
||||
|
||||
@@ -283,7 +283,7 @@ public final class FileBasedIndexImpl extends FileBasedIndex implements Disposab
|
||||
|
||||
boolean processChangedFiles(@NotNull Project project, @NotNull Processor<? super VirtualFile> processor) {
|
||||
// avoid missing files when events are processed concurrently
|
||||
return Stream.concat(myChangedFilesCollector.myVfsEventsMerger.getChangedFiles(),
|
||||
return Stream.concat(myChangedFilesCollector.getEventMerger().getChangedFiles(),
|
||||
myChangedFilesCollector.myFilesToUpdate.values().stream())
|
||||
.filter(filesToBeIndexedForProjectCondition(project))
|
||||
.distinct()
|
||||
@@ -1861,7 +1861,6 @@ public final class FileBasedIndexImpl extends FileBasedIndex implements Disposab
|
||||
|
||||
private final class ChangedFilesCollector extends IndexedFilesListener {
|
||||
private final IntObjectMap<VirtualFile> myFilesToUpdate = ContainerUtil.createConcurrentIntObjectMap();
|
||||
private final VfsEventsMerger myVfsEventsMerger = new VfsEventsMerger();
|
||||
private final AtomicInteger myProcessedEventIndex = new AtomicInteger();
|
||||
private final Phaser myWorkersFinishedSync = new Phaser() {
|
||||
@Override
|
||||
@@ -1898,18 +1897,6 @@ public final class FileBasedIndexImpl extends FileBasedIndex implements Disposab
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void buildIndicesForFile(@NotNull VirtualFile file, boolean contentChange) {
|
||||
int fileId = getIdMaskingNonIdBasedFile(file);
|
||||
myVfsEventsMerger.recordFileEvent(fileId, file, contentChange);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doInvalidateIndicesForFile(@NotNull VirtualFile file, boolean contentChange) {
|
||||
final int fileId = Math.abs(getIdMaskingNonIdBasedFile(file));
|
||||
myVfsEventsMerger.recordBeforeFileEvent(fileId, file, contentChange);
|
||||
}
|
||||
|
||||
void scheduleForUpdate(VirtualFile file) {
|
||||
if (!(file instanceof DeletedVirtualFileStub)) {
|
||||
IndexableFileSet setForFile = getIndexableSetForFile(file);
|
||||
@@ -1995,7 +1982,7 @@ public final class FileBasedIndexImpl extends FileBasedIndex implements Disposab
|
||||
}
|
||||
|
||||
void ensureUpToDateAsync() {
|
||||
if (myVfsEventsMerger.getApproximateChangesCount() >= 20 && myScheduledVfsEventsWorkers.compareAndSet(0,1)) {
|
||||
if (getEventMerger().getApproximateChangesCount() >= 20 && myScheduledVfsEventsWorkers.compareAndSet(0,1)) {
|
||||
myVfsEventsExecutor.submit(this::scheduledEventProcessingInReadActionWithYieldingToWriteAction);
|
||||
|
||||
if (Registry.is("try.starting.dumb.mode.where.many.files.changed")) {
|
||||
@@ -2026,7 +2013,7 @@ public final class FileBasedIndexImpl extends FileBasedIndex implements Disposab
|
||||
private void processFilesInReadAction() {
|
||||
assert ApplicationManager.getApplication().isReadAccessAllowed(); // no vfs events -> event processing code can finish
|
||||
|
||||
int publishedEventIndex = myVfsEventsMerger.getPublishedEventIndex();
|
||||
int publishedEventIndex = getEventMerger().getPublishedEventIndex();
|
||||
int processedEventIndex = myProcessedEventIndex.get();
|
||||
if (processedEventIndex == publishedEventIndex) {
|
||||
return;
|
||||
@@ -2035,7 +2022,7 @@ public final class FileBasedIndexImpl extends FileBasedIndex implements Disposab
|
||||
myWorkersFinishedSync.register();
|
||||
int phase = myWorkersFinishedSync.getPhase();
|
||||
try {
|
||||
myVfsEventsMerger.processChanges(info ->
|
||||
getEventMerger().processChanges(info ->
|
||||
ConcurrencyUtil.withLock(myWriteLock, () -> {
|
||||
try {
|
||||
ProgressManager.getInstance().executeNonCancelableSection(() -> {
|
||||
@@ -2061,13 +2048,13 @@ public final class FileBasedIndexImpl extends FileBasedIndex implements Disposab
|
||||
|
||||
myWorkersFinishedSync.awaitAdvance(phase);
|
||||
|
||||
if (myVfsEventsMerger.getPublishedEventIndex() == publishedEventIndex) {
|
||||
if (getEventMerger().getPublishedEventIndex() == publishedEventIndex) {
|
||||
myProcessedEventIndex.compareAndSet(processedEventIndex, publishedEventIndex);
|
||||
}
|
||||
}
|
||||
|
||||
private void processFilesInReadActionWithYieldingToWriteAction() {
|
||||
while (myVfsEventsMerger.hasChanges()) {
|
||||
while (getEventMerger().hasChanges()) {
|
||||
if (!ProgressIndicatorUtils.runInReadActionWithWriteActionPriority(this::processFilesInReadAction)) {
|
||||
ProgressIndicatorUtils.yieldToPendingWriteActions();
|
||||
}
|
||||
@@ -2248,7 +2235,7 @@ public final class FileBasedIndexImpl extends FileBasedIndex implements Disposab
|
||||
VirtualFile virtualFile = file.getVirtualFile();
|
||||
|
||||
if (virtualFile instanceof VirtualFileWithId) {
|
||||
myChangedFilesCollector.myVfsEventsMerger.recordTransientStateChangeEvent(getFileId(virtualFile), virtualFile);
|
||||
myChangedFilesCollector.getEventMerger().recordTransientStateChangeEvent(getFileId(virtualFile), virtualFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ import java.util.List;
|
||||
|
||||
public abstract class IndexedFilesListener implements BulkFileListener {
|
||||
private final ManagingFS myManagingFS = ManagingFS.getInstance();
|
||||
private final VfsEventsMerger myEventMerger = new VfsEventsMerger();
|
||||
@Nullable private final VirtualFile myConfig;
|
||||
@Nullable private final VirtualFile myLog;
|
||||
|
||||
@@ -41,6 +42,10 @@ public abstract class IndexedFilesListener implements BulkFileListener {
|
||||
myLog = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(new File(PathManager.getLogPath()));
|
||||
}
|
||||
|
||||
protected VfsEventsMerger getEventMerger() {
|
||||
return myEventMerger;
|
||||
}
|
||||
|
||||
protected void buildIndicesForFileRecursively(@NotNull final VirtualFile file, final boolean contentChange) {
|
||||
if (file.isDirectory()) {
|
||||
final ContentIterator iterator = fileOrDir -> {
|
||||
@@ -59,13 +64,17 @@ public abstract class IndexedFilesListener implements BulkFileListener {
|
||||
if (isUnderConfigOrSystem(file)) {
|
||||
return false;
|
||||
}
|
||||
doInvalidateIndicesForFile(file, contentChange);
|
||||
final int fileId = Math.abs(FileBasedIndexImpl.getIdMaskingNonIdBasedFile(file));
|
||||
myEventMerger.recordBeforeFileEvent(fileId, file, contentChange);
|
||||
return !file.isDirectory() || FileBasedIndexImpl.isMock(file) || myManagingFS.wereChildrenAccessed(file);
|
||||
}
|
||||
|
||||
protected abstract void iterateIndexableFiles(@NotNull VirtualFile file, @NotNull ContentIterator iterator);
|
||||
protected abstract void buildIndicesForFile(@NotNull VirtualFile file, boolean contentChange);
|
||||
protected abstract void doInvalidateIndicesForFile(@NotNull VirtualFile file, boolean contentChange);
|
||||
|
||||
private void buildIndicesForFile(@NotNull VirtualFile file, boolean contentChange) {
|
||||
int fileId = FileBasedIndexImpl.getIdMaskingNonIdBasedFile(file);
|
||||
myEventMerger.recordFileEvent(fileId, file, contentChange);
|
||||
}
|
||||
|
||||
void invalidateIndicesRecursively(@NotNull final VirtualFile file, final boolean contentChange) {
|
||||
VfsUtilCore.visitChildrenRecursively(file, new VirtualFileVisitor() {
|
||||
|
||||
Reference in New Issue
Block a user