Skip to content

Commit 0585e3a

Browse files
committed
Check toMillis overflow in operators with Duration
Fix Kotlin#868
1 parent 63d1d1b commit 0585e3a

File tree

1 file changed

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

1 file changed

+13
-7
lines changed

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

+13-7
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,36 @@
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 kotlin.coroutines.suspendCoroutine
1011

1112
/**
1213
* "java.time" adapter method for [kotlinx.coroutines.delay]
1314
*/
14-
public suspend fun delay(duration: Duration) =
15-
kotlinx.coroutines.delay(duration.toMillis())
15+
public suspend fun delay(duration: Duration) {
16+
if (duration.seconds < Long.MAX_VALUE / 1_000L) kotlinx.coroutines.delay(duration.toMillis())
17+
else suspendCoroutine<Unit> { }
18+
}
1619

1720
/**
1821
* "java.time" adapter method for [SelectBuilder.onTimeout]
1922
*/
20-
public fun <R> SelectBuilder<R>.onTimeout(duration: Duration, block: suspend () -> R) =
21-
onTimeout(duration.toMillis(), block)
23+
public fun <R> SelectBuilder<R>.onTimeout(duration: Duration, block: suspend () -> R) {
24+
if (duration.seconds < Long.MAX_VALUE / 1_000L) onTimeout(duration.toMillis(), block)
25+
}
2226

2327
/**
2428
* "java.time" adapter method for [kotlinx.coroutines.withTimeout]
2529
*/
2630
public suspend fun <T> withTimeout(duration: Duration, block: suspend CoroutineScope.() -> T): T =
27-
kotlinx.coroutines.withTimeout(duration.toMillis(), block)
31+
if (duration.seconds < Long.MAX_VALUE / 1_000L) kotlinx.coroutines.withTimeout(duration.toMillis(), block)
32+
else coroutineScope { block() }
2833

2934
/**
3035
* "java.time" adapter method for [kotlinx.coroutines.withTimeoutOrNull]
3136
*/
3237
public suspend fun <T> withTimeoutOrNull(duration: Duration, block: suspend CoroutineScope.() -> T): T? =
33-
kotlinx.coroutines.withTimeoutOrNull(duration.toMillis(), block)
38+
if (duration.seconds < Long.MAX_VALUE / 1_000L) kotlinx.coroutines.withTimeoutOrNull(duration.toMillis(), block)
39+
else coroutineScope { block() }

0 commit comments

Comments
 (0)