Created
September 16, 2022 13:38
-
-
Save aleksandarzekovic/bc8eaed7dfd7a666680735fb446e2410 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
internal class CoroutineScheduler( | |
@JvmField val corePoolSize: Int, | |
@JvmField val maxPoolSize: Int, | |
@JvmField val idleWorkerKeepAliveNs: Long = IDLE_WORKER_KEEP_ALIVE_NS, | |
@JvmField val schedulerName: String = DEFAULT_SCHEDULER_NAME | |
) : Executor, Closeable { | |
... | |
override fun execute(command: Runnable) = dispatch(command) | |
... | |
fun dispatch(block: Runnable, taskContext: TaskContext = NonBlockingContext, tailDispatch: Boolean = false) { | |
trackTask() // this is needed for virtual time support | |
val task = createTask(block, taskContext) | |
// try to submit the task to the local queue and act depending on the result | |
val currentWorker = currentWorker() | |
val notAdded = currentWorker.submitToLocalQueue(task, tailDispatch) | |
if (notAdded != null) { | |
if (!addToGlobalQueue(notAdded)) { | |
// Global queue is closed in the last step of close/shutdown -- no more tasks should be accepted | |
throw RejectedExecutionException("$schedulerName was terminated") | |
} | |
} | |
val skipUnpark = tailDispatch && currentWorker != null | |
// Checking 'task' instead of 'notAdded' is completely okay | |
if (task.mode == TASK_NON_BLOCKING) { | |
if (skipUnpark) return | |
signalCpuWork() | |
} else { | |
// Increment blocking tasks anyway | |
signalBlockingWork(skipUnpark = skipUnpark) | |
} | |
} | |
internal inner class Worker private constructor() : Thread() { ... } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment