|
Play Framework/Scala example source code file (Execution.scala)
The Execution.scala Play Framework example source code
/*
* Copyright (C) 2009-2013 Typesafe Inc. <http://www.typesafe.com>
*/
package play.api.libs.iteratee
import java.util.{ ArrayDeque, Deque }
import scala.annotation.tailrec
import scala.concurrent.ExecutionContext
/**
* Contains the default ExecutionContext used by Iteratees.
*/
object Execution {
def defaultExecutionContext: ExecutionContext = Implicits.defaultExecutionContext
object Implicits {
implicit def defaultExecutionContext: ExecutionContext = Execution.trampoline
implicit def trampoline: ExecutionContext = Execution.trampoline
}
/**
* Executes in the current thread. Uses a thread local trampoline to make sure the stack
* doesn't overflow. Since this ExecutionContext executes on the current thread, it should
* only be used to run small bits of fast-running code. We use it here to run the internal
* iteratee code.
*
* Blocking should be strictly avoided as it could hog the current thread.
* Also, since we're running on a single thread, blocking code risks deadlock.
*/
object trampoline extends ExecutionContext {
private val local = new ThreadLocal[Deque[Runnable]]
def execute(runnable: Runnable): Unit = {
@volatile var queue = local.get()
if (queue == null) {
// Since there is no local queue, we need to install one and
// start our trampolining loop.
try {
queue = new ArrayDeque(4)
queue.addLast(runnable)
local.set(queue)
while (!queue.isEmpty) {
val runnable = queue.removeFirst()
runnable.run()
}
} finally {
// We've emptied the queue, so tidy up.
local.set(null)
}
} else {
// There's already a local queue that is being executed.
// Just stick our runnable on the end of that queue.
queue.addLast(runnable)
}
}
def reportFailure(t: Throwable): Unit = t.printStackTrace()
}
}
Other Play Framework source code examplesHere is a short list of links related to this Play Framework Execution.scala source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.