summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoraleksandar <aleksandar@aleksandar-Latitude-E6500.(none)>2012-04-13 01:22:57 +0200
committeraleksandar <aleksandar@aleksandar-Latitude-E6500.(none)>2012-04-13 01:22:57 +0200
commit225d205f83ceb7fc6f0af005f0085bf7ab493b38 (patch)
treee47e11d22d6f9e7ede9b72101da1f6f7e700dd71 /src
parent8390f2011ffc8da65efef70b8348af259abc261e (diff)
downloadscala-225d205f83ceb7fc6f0af005f0085bf7ab493b38.tar.gz
scala-225d205f83ceb7fc6f0af005f0085bf7ab493b38.tar.bz2
scala-225d205f83ceb7fc6f0af005f0085bf7ab493b38.zip
Add managed blockers to execution contexts.
Diffstat (limited to 'src')
-rw-r--r--src/library/scala/concurrent/impl/ExecutionContextImpl.scala18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/library/scala/concurrent/impl/ExecutionContextImpl.scala b/src/library/scala/concurrent/impl/ExecutionContextImpl.scala
index d15a9b828b..c308a59297 100644
--- a/src/library/scala/concurrent/impl/ExecutionContextImpl.scala
+++ b/src/library/scala/concurrent/impl/ExecutionContextImpl.scala
@@ -73,7 +73,23 @@ private[scala] class ExecutionContextImpl(es: AnyRef) extends ExecutionContext w
def internalBlockingCall[T](awaitable: Awaitable[T], atMost: Duration): T = {
Future.releaseStack(this)
- awaitable.result(atMost)(scala.concurrent.Await.canAwaitEvidence)
+ executorService match {
+ case fj: ForkJoinPool =>
+ var result: T = null.asInstanceOf[T]
+ val managedBlocker = new ForkJoinPool.ManagedBlocker {
+ @volatile var isdone = false
+ def block() = {
+ result = awaitable.result(atMost)(scala.concurrent.Await.canAwaitEvidence)
+ isdone = true
+ true
+ }
+ def isReleasable = isdone
+ }
+ ForkJoinPool.managedBlock(managedBlocker)
+ result
+ case _ =>
+ awaitable.result(atMost)(scala.concurrent.Await.canAwaitEvidence)
+ }
}
def reportFailure(t: Throwable) = t match {