summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2010-04-11 18:09:46 +0000
committerPhilipp Haller <hallerp@gmail.com>2010-04-11 18:09:46 +0000
commite7718496ee34035bbc50f5b9df0441662f7834ea (patch)
tree3e6b7d7ad765d51608eb4a2ea3ba3a29b33736fa
parent8ee1f32478b63286b450a1ac5200ce4da39e69ff (diff)
downloadscala-e7718496ee34035bbc50f5b9df0441662f7834ea.tar.gz
scala-e7718496ee34035bbc50f5b9df0441662f7834ea.tar.bz2
scala-e7718496ee34035bbc50f5b9df0441662f7834ea.zip
Made use of random number generator in ForkJoin...
Made use of random number generator in ForkJoinScheduler's fair mode thread safe. Review by plocinic.
-rw-r--r--src/actors/scala/actors/scheduler/ForkJoinScheduler.scala14
1 files 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 <code>ForkJoinScheduler</code> 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()