void (@NotNull Runnable runnable) { Application application = ApplicationManager.getApplication(); if (application.isDispatchThread()) { commitAllDocuments(); runnable.run(); return; } if (application.isReadAccessAllowed()) { LOG.error("Don't call commitAndRunReadAction inside ReadAction, it will cause a deadlock. "+Thread.currentThread()); } while (true) { boolean executed = ReadAction.compute(() -> { if (!hasEventSystemEnabledUncommittedDocuments()) { runnable.run(); return true; } return false; }); if (executed) break; ModalityState modality = ModalityState.defaultModalityState(); Semaphore semaphore = new Semaphore(1); AppUIExecutor.onWriteThread(ModalityState.any()).submit(() -> { if (myProject.isDisposed()) { // committedness doesn't matter anymore; give clients a chance to do checkCanceled semaphore.up(); return; } performWhenAllCommitted(modality, () -> semaphore.up()); }); while (!semaphore.waitFor(10)) { ProgressManager.checkCanceled(); } } }