From e7718496ee34035bbc50f5b9df0441662f7834ea Mon Sep 17 00:00:00 2001 From: Philipp Haller Date: Sun, 11 Apr 2010 18:09:46 +0000 Subject: Made use of random number generator in ForkJoin... Made use of random number generator in ForkJoinScheduler's fair mode thread safe. Review by plocinic. --- src/actors/scala/actors/scheduler/ForkJoinScheduler.scala | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/actors/scala/actors/scheduler/ForkJoinScheduler.scala b/src/actors/scala/actors/scheduler/ForkJoinScheduler.scala index ab4fca04ca..4aaef16661 100644 --- a/src/actors/scala/actors/scheduler/ForkJoinScheduler.scala +++ b/src/actors/scala/actors/scheduler/ForkJoinScheduler.scala @@ -3,7 +3,6 @@ package scheduler import java.util.{Collection, ArrayList} import scala.concurrent.forkjoin._ -import scala.util.Random /** The ForkJoinScheduler is backed by a lightweight * fork-join task execution framework. @@ -23,12 +22,19 @@ class ForkJoinScheduler(val initCoreSize: Int, val maxSize: Int, daemon: Boolean protected val CHECK_FREQ = 10 + // this random number generator is only used in fair mode + private lazy val random = new java.util.Random // guarded by random + + def this(d: Boolean, f: Boolean) { + this(ThreadPoolConfig.corePoolSize, ThreadPoolConfig.maxPoolSize, d, f) + } + def this(d: Boolean) { - this(ThreadPoolConfig.corePoolSize, ThreadPoolConfig.maxPoolSize, d, true) + this(d, true) // default is fair } def this() { - this(false) + this(false) // default is non-daemon } private def makeNewPool(): DrainableForkJoinPool = { @@ -109,7 +115,7 @@ class ForkJoinScheduler(val initCoreSize: Int, val maxSize: Int, daemon: Boolean override def executeFromActor(task: Runnable) { // in fair mode: 2% chance of submitting to global task queue - if (fair && Random.nextInt(50) == 1) + if (fair && random.synchronized { random.nextInt(50) == 1 }) pool.execute(task) else task.asInstanceOf[RecursiveAction].fork() -- cgit v1.2.3