blob: 6aea7d15731e6ee89f651283705e8c8e185d36a6 [file] [log] [blame]
Roman Elizarov67891d82017-01-23 16:47:20 +03001package kotlinx.coroutines.experimental
2
3import java.util.concurrent.Executor
4import java.util.concurrent.ExecutorService
5import java.util.concurrent.ScheduledExecutorService
6import java.util.concurrent.TimeUnit
7import kotlin.coroutines.CoroutineContext
8
9/**
10 * Converts an instance of [Executor] to an implementation of [CoroutineDispatcher].
11 */
12public fun Executor.toCoroutineDispatcher(): CoroutineDispatcher =
13 ExecutorCoroutineDispatcher(this)
14
15internal open class ExecutorCoroutineDispatcher(val executor: Executor) : CoroutineDispatcher(), Delay {
16 override fun isDispatchNeeded(context: CoroutineContext): Boolean = true
17 override fun dispatch(context: CoroutineContext, block: Runnable) = executor.execute(block)
18
19 override fun scheduleResumeAfterDelay(time: Long, unit: TimeUnit, continuation: CancellableContinuation<Unit>) {
20 (executor as? ScheduledExecutorService ?: scheduledExecutor).scheduleResumeAfterDelay(time, unit, continuation)
21 }
22}
23
24internal fun ExecutorService.scheduleResume(cont: CancellableContinuation<Unit>) {
25 val future = submit { cont.resume(Unit) }
26 cont.cancelFutureOnCompletion(future)
27}
28
29internal fun ScheduledExecutorService.scheduleResumeAfterDelay(time: Long, unit: TimeUnit, cont: CancellableContinuation<Unit>) {
30 val timeout = schedule({ cont.resume(Unit) }, time, unit)
31 cont.cancelFutureOnCompletion(timeout)
32}