From baed10e426d1fd66f8252256b952fe816609fccc Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Tue, 7 Mar 2023 14:34:15 +0100 Subject: [PATCH] platform: do not keep CheckedDisposable-s in disposed object weak-key map. It should allow to fix Disposer-s performance problems on client side (when Disposer.register/dispose triggered very often) IDEA-314139 GitOrigin-RevId: 9d0ca9cc3e1a7ff92971e97cb6ce73cfa225c26b --- .../application/impl/NonBlockingReadActionImpl.java | 11 +++++++++-- .../src/com/intellij/openapi/util/ObjectTree.java | 6 ++++++ 2 files changed, 15 insertions(+), 2 deletions(-) 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)); }