IJPL-158385 SingleAlarm with parent disposable must ignore request after disposal

GitOrigin-RevId: c33800ea85559d26da07ba0d8db5a28a50289759
This commit is contained in:
Vladimir Krivosheev
2024-07-22 11:58:07 +02:00
committed by intellij-monorepo-bot
parent ada6ad1189
commit 79476d985a
2 changed files with 31 additions and 2 deletions

View File

@@ -292,6 +292,10 @@ class SingleAlarm @Internal constructor(
}
private fun request(forceRun: Boolean, delay: Int, cancelCurrent: Boolean = false) {
if (isDisposed) {
return
}
val effectiveDelay = if (forceRun) 0 else delay.toLong()
synchronized(LOCK) {
var prevCurrentJob = currentJob
@@ -307,11 +311,14 @@ class SingleAlarm @Internal constructor(
prevCurrentJob = null
delay(effectiveDelay)
withContext(taskContext) {
//todo fix clients and remove NonCancellable
try {
Cancellation.withNonCancelableSection().use {
task.run()
if (!isDisposed) {
Cancellation.withNonCancelableSection().use {
task.run()
}
}
}
catch (e: CancellationException) {

View File

@@ -24,6 +24,7 @@ import org.junit.jupiter.api.Test
import java.util.concurrent.ConcurrentLinkedQueue
import java.util.concurrent.TimeUnit
import java.util.concurrent.TimeoutException
import java.util.concurrent.atomic.AtomicInteger
@TestApplication
class AlarmTest {
@@ -38,6 +39,27 @@ class AlarmTest {
}
}
@Test
fun `SingleAlarm with parent disposable must ignore request after disposal`() {
val disposable = Disposer.newDisposable()
disposable.use {
val counter = AtomicInteger()
@Suppress("DEPRECATION")
val alarm = SingleAlarm.pooledThreadSingleAlarm(delay = 1, parentDisposable = disposable) {
counter.incrementAndGet()
}
alarm.request()
alarm.waitForAllExecuted(1, TimeUnit.SECONDS)
assertThat(counter.get()).isEqualTo(1)
Disposer.dispose(disposable)
alarm.request()
alarm.waitForAllExecuted(1, TimeUnit.SECONDS)
assertThat(counter.get()).isEqualTo(1)
}
}
@Test
fun `cancel request by task`(@TestDisposable disposable: Disposable): Unit = runBlocking(Dispatchers.EDT) {
val alarm = Alarm(threadToUse = Alarm.ThreadToUse.SWING_THREAD, parentDisposable = disposable)