Skip to content

Commit de4d6ad

Browse files
committed
Check FOREVER in operators with Duration
Fix Kotlin#868
1 parent 63d1d1b commit de4d6ad

File tree

1 file changed

+22
-7
lines changed
  • integration/kotlinx-coroutines-jdk8/src/time

1 file changed

+22
-7
lines changed

integration/kotlinx-coroutines-jdk8/src/time/Time.kt

+22-7
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,45 @@
44
package kotlinx.coroutines.time
55

66
import kotlinx.coroutines.CoroutineScope
7+
import kotlinx.coroutines.coroutineScope
78
import kotlinx.coroutines.selects.SelectBuilder
89
import java.time.Duration
9-
import java.util.concurrent.TimeUnit
10+
import java.time.temporal.ChronoUnit
11+
import kotlin.coroutines.suspendCoroutine
1012

1113
/**
1214
* "java.time" adapter method for [kotlinx.coroutines.delay]
1315
*/
14-
public suspend fun delay(duration: Duration) =
15-
kotlinx.coroutines.delay(duration.toMillis())
16+
suspend fun delay(duration: Duration) {
17+
when {
18+
duration.seconds < Long.MAX_VALUE / 1_000L -> kotlinx.coroutines.delay(duration.toMillis())
19+
duration == ChronoUnit.FOREVER.duration -> suspendCoroutine<Unit> { }
20+
else -> {
21+
kotlinx.coroutines.delay(duration.seconds * 1_000L)
22+
kotlinx.coroutines.delay(duration.nano / 1_000_000L)
23+
}
24+
}
25+
}
1626

1727
/**
1828
* "java.time" adapter method for [SelectBuilder.onTimeout]
1929
*/
20-
public fun <R> SelectBuilder<R>.onTimeout(duration: Duration, block: suspend () -> R) =
21-
onTimeout(duration.toMillis(), block)
30+
public fun <R> SelectBuilder<R>.onTimeout(duration: Duration, block: suspend () -> R) {
31+
if (duration != ChronoUnit.FOREVER.duration) {
32+
onTimeout(duration.toMillis(), block)
33+
}
34+
}
2235

2336
/**
2437
* "java.time" adapter method for [kotlinx.coroutines.withTimeout]
2538
*/
2639
public suspend fun <T> withTimeout(duration: Duration, block: suspend CoroutineScope.() -> T): T =
27-
kotlinx.coroutines.withTimeout(duration.toMillis(), block)
40+
if (duration == ChronoUnit.FOREVER.duration) coroutineScope { block() }
41+
else kotlinx.coroutines.withTimeout(duration.toMillis(), block)
2842

2943
/**
3044
* "java.time" adapter method for [kotlinx.coroutines.withTimeoutOrNull]
3145
*/
3246
public suspend fun <T> withTimeoutOrNull(duration: Duration, block: suspend CoroutineScope.() -> T): T? =
33-
kotlinx.coroutines.withTimeoutOrNull(duration.toMillis(), block)
47+
if (duration == ChronoUnit.FOREVER.duration) coroutineScope { block() }
48+
else kotlinx.coroutines.withTimeoutOrNull(duration.toMillis(), block)

0 commit comments

Comments
 (0)