diff --git a/platform/platform-impl/src/com/intellij/openapi/application/constraints/Expiration.kt b/platform/platform-impl/src/com/intellij/openapi/application/constraints/Expiration.kt index aeb64f46cfc5..f4702522c8ae 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/constraints/Expiration.kt +++ b/platform/platform-impl/src/com/intellij/openapi/application/constraints/Expiration.kt @@ -5,6 +5,7 @@ import com.intellij.openapi.Disposable import com.intellij.openapi.WeakReferenceDisposableWrapper import com.intellij.openapi.util.Disposer import com.intellij.util.IncorrectOperationException +import com.intellij.util.ObjectUtils import kotlinx.coroutines.* /** @@ -146,6 +147,7 @@ internal fun Disposable.cancelJobOnDisposal(job: Job, if (!tryRegisterDisposable(this, childRef)) { Disposer.dispose(childRef) // runs disposableBlock() + ObjectUtils.reachabilityFence(child) return AutoCloseable { } } else { diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/application/constraints/ExpirationTest.kt b/platform/platform-tests/testSrc/com/intellij/openapi/application/constraints/ExpirationTest.kt index a3e620865063..674af5784e84 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/application/constraints/ExpirationTest.kt +++ b/platform/platform-tests/testSrc/com/intellij/openapi/application/constraints/ExpirationTest.kt @@ -12,7 +12,7 @@ import kotlinx.coroutines.Job class ExpirationTest : LightPlatformTestCase() { private fun createTestDisposable(): Disposable { - return Disposable { }.also { Disposer.register(testRootDisposable, it) } + return Disposer.newDisposable(name).also { Disposer.register(testRootDisposable, it) } } private fun createCompositeExpiration(vararg expiration: Expiration): Expiration { @@ -20,6 +20,13 @@ class ExpirationTest : LightPlatformTestCase() { return Expiration.composeExpiration(expiration.toList())!! } + fun `test isExpired for already disposed Disposable`() { + val disposable = createTestDisposable() + Disposer.dispose(disposable) + val expiration = DisposableExpiration(disposable) + assertTrue("Expiration.isExpired must be true", expiration.isExpired) + } + fun `test isExpired for JobExpiration`() { val job = Job() val expiration = JobExpiration(job)