use of com.intellij.concurrency.Job in project intellij-community by JetBrains.
the class VirtualFilePointerTest method stressRead.
private static void stressRead(@NotNull final VirtualFilePointer pointer, @NotNull final Collection<Job<Void>> reads) {
for (int i = 0; i < 10; i++) {
final AtomicReference<Job<Void>> reference = new AtomicReference<>();
reference.set(JobLauncher.getInstance().submitToJobThread(() -> ApplicationManager.getApplication().runReadAction(() -> {
VirtualFile file = pointer.getFile();
if (file != null && !file.isValid()) {
throw new IncorrectOperationException("I've caught it. I am that good");
}
}), future -> {
try {
future.get();
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
reads.remove(reference.get());
}
}));
reads.add(reference.get());
}
}
use of com.intellij.concurrency.Job in project intellij-community by JetBrains.
the class VirtualFilePointerTest method testThreadsPerformance.
public void testThreadsPerformance() throws IOException, InterruptedException, TimeoutException, ExecutionException {
final File ioTempDir = createTempDirectory();
final File ioPtrBase = new File(ioTempDir, "parent");
final File ioPtr = new File(ioPtrBase, "f1");
final File ioSand = new File(ioTempDir, "sand");
final File ioSandPtr = new File(ioSand, "f2");
assertTrue(ioSandPtr.getParentFile().mkdirs());
assertTrue(ioSandPtr.createNewFile());
assertTrue(ioPtr.getParentFile().mkdirs());
assertTrue(ioPtr.createNewFile());
doVfsRefresh(ioTempDir);
final VirtualFilePointer pointer = createPointerByFile(ioPtr, null);
assertTrue(pointer.isValid());
final VirtualFile virtualFile = pointer.getFile();
assertNotNull(virtualFile);
assertTrue(virtualFile.isValid());
final Collection<Job<Void>> reads = ContainerUtil.newConcurrentSet();
VirtualFileAdapter listener = new VirtualFileAdapter() {
@Override
public void fileCreated(@NotNull VirtualFileEvent event) {
stressRead(pointer, reads);
}
@Override
public void fileDeleted(@NotNull VirtualFileEvent event) {
stressRead(pointer, reads);
}
};
Disposable disposable = Disposer.newDisposable();
VirtualFileManager.getInstance().addVirtualFileListener(listener, disposable);
try {
int N = Timings.adjustAccordingToMySpeed(1000, false);
System.out.println("N = " + N);
for (int i = 0; i < N; i++) {
assertNotNull(pointer.getFile());
FileUtil.delete(ioPtrBase);
doVfsRefresh(ioTempDir);
// ptr is now null, cached as map
final VirtualFile v = LocalFileSystem.getInstance().findFileByIoFile(ioSandPtr);
new WriteCommandAction.Simple(getProject()) {
@Override
protected void run() throws Throwable {
//inc FS modCount
v.delete(this);
LocalFileSystem.getInstance().findFileByIoFile(ioSand).createChildData(this, ioSandPtr.getName());
}
}.execute().throwException();
// ptr is still null
assertTrue(ioPtrBase.mkdirs());
assertTrue(ioPtr.createNewFile());
stressRead(pointer, reads);
doVfsRefresh(ioTempDir);
}
} finally {
// unregister listener early
Disposer.dispose(disposable);
for (Job<Void> read : reads) {
while (!read.isDone()) {
read.waitForCompletion(1000);
}
}
}
}
Aggregations