diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/NonBlockingReadActionImpl.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/NonBlockingReadActionImpl.java index c16efc614767..ad474bb14ef5 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/NonBlockingReadActionImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/NonBlockingReadActionImpl.java @@ -26,6 +26,7 @@ import com.intellij.openapi.progress.util.ProgressIndicatorUtils; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ex.ProjectEx; import com.intellij.openapi.project.impl.ProjectImpl; +import com.intellij.openapi.util.CheckedDisposable; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Ref; import com.intellij.openapi.vfs.VirtualFile; @@ -272,10 +273,16 @@ public final class NonBlockingReadActionImpl implements NonBlockingReadAction cancel(); break; } - //noinspection Convert2Lambda,Anonymous2MethodRef - Disposable child = new Disposable() { // not a lambda to create a separate object for each parent + Disposable child = new CheckedDisposable() { + private volatile boolean disposed; + @Override + public boolean isDisposed() { + return disposed; + } + @Override public void dispose() { + disposed = true; cancel(); } }; diff --git a/platform/util/src/com/intellij/openapi/util/ObjectTree.java b/platform/util/src/com/intellij/openapi/util/ObjectTree.java index fffac091f846..020807f9a98c 100644 --- a/platform/util/src/com/intellij/openapi/util/ObjectTree.java +++ b/platform/util/src/com/intellij/openapi/util/ObjectTree.java @@ -79,6 +79,9 @@ final class ObjectTree { } } boolean isDisposed(@NotNull Disposable object) { + if (object instanceof CheckedDisposable) { + return ((CheckedDisposable)object).isDisposed(); + } synchronized (getTreeLock()) { return myDisposedObjects.get(object) != null; } @@ -231,6 +234,9 @@ final class ObjectTree { // return old value Throwable rememberDisposedTrace(@NotNull Disposable object, @Nullable Throwable trace) { + if (object instanceof CheckedDisposable) { + return null; + } return myDisposedObjects.put(object, ObjectUtils.notNull(trace, UNKNOWN_TRACE)); }