mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-02-04 23:39:07 +07:00
IJPL-158385 SingleAlarm with parent disposable must ignore request after disposal
GitOrigin-RevId: c33800ea85559d26da07ba0d8db5a28a50289759
This commit is contained in:
committed by
intellij-monorepo-bot
parent
ada6ad1189
commit
79476d985a
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user