diff options
author | aleksandar <aleksandar@aleksandar-Latitude-E6500.(none)> | 2012-04-13 01:22:57 +0200 |
---|---|---|
committer | aleksandar <aleksandar@aleksandar-Latitude-E6500.(none)> | 2012-04-13 01:22:57 +0200 |
commit | 225d205f83ceb7fc6f0af005f0085bf7ab493b38 (patch) | |
tree | e47e11d22d6f9e7ede9b72101da1f6f7e700dd71 | |
parent | 8390f2011ffc8da65efef70b8348af259abc261e (diff) | |
download | scala-225d205f83ceb7fc6f0af005f0085bf7ab493b38.tar.gz scala-225d205f83ceb7fc6f0af005f0085bf7ab493b38.tar.bz2 scala-225d205f83ceb7fc6f0af005f0085bf7ab493b38.zip |
Add managed blockers to execution contexts.
-rw-r--r-- | src/library/scala/concurrent/impl/ExecutionContextImpl.scala | 18 |
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 { |