From 29f58824a4afa0208ec45c57b1d999b132cfddf0 Mon Sep 17 00:00:00 2001 From: Philipp Haller Date: Wed, 27 May 2009 15:55:40 +0000 Subject: Implemented #2015. --- src/actors/scala/actors/DaemonActor.scala | 20 ++++++++++++++++++++ src/actors/scala/actors/DaemonScheduler.scala | 18 ++++++++++++++++++ .../scala/actors/DefaultExecutorScheduler.scala | 18 +++++++++++++++--- src/actors/scala/actors/Future.scala | 2 +- .../scala/actors/SimpleExecutorScheduler.scala | 5 +++-- 5 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 src/actors/scala/actors/DaemonActor.scala create mode 100644 src/actors/scala/actors/DaemonScheduler.scala (limited to 'src') diff --git a/src/actors/scala/actors/DaemonActor.scala b/src/actors/scala/actors/DaemonActor.scala new file mode 100644 index 0000000000..7eee39a8e3 --- /dev/null +++ b/src/actors/scala/actors/DaemonActor.scala @@ -0,0 +1,20 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2005-2009, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + +package scala.actors + +/** + * Base trait for actors with daemon semantics. + * Unlike a regular Actor, an active DaemonActor will + * not prevent an application terminating, much like a daemon thread. + * + * @author Erik Engbrecht + */ +trait DaemonActor extends Actor { + override def scheduler: IScheduler = DaemonScheduler +} diff --git a/src/actors/scala/actors/DaemonScheduler.scala b/src/actors/scala/actors/DaemonScheduler.scala new file mode 100644 index 0000000000..fe8dfbc1fe --- /dev/null +++ b/src/actors/scala/actors/DaemonScheduler.scala @@ -0,0 +1,18 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2005-2009, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + +package scala.actors + +/** + * Default scheduler for actors with daemon semantics, such as those backing futures. + * + * @author Erik Engbrecht + */ +object DaemonScheduler extends DelegatingScheduler { + def makeNewScheduler(): IScheduler = new DefaultExecutorScheduler(true) +} diff --git a/src/actors/scala/actors/DefaultExecutorScheduler.scala b/src/actors/scala/actors/DefaultExecutorScheduler.scala index bfd0a09890..ec23262c6a 100644 --- a/src/actors/scala/actors/DefaultExecutorScheduler.scala +++ b/src/actors/scala/actors/DefaultExecutorScheduler.scala @@ -10,7 +10,7 @@ package scala.actors -import java.util.concurrent.{ThreadPoolExecutor, TimeUnit, LinkedBlockingQueue} +import java.util.concurrent.{ThreadPoolExecutor, TimeUnit, LinkedBlockingQueue, ThreadFactory} /** * The DefaultExecutorScheduler class uses a default @@ -23,15 +23,27 @@ import java.util.concurrent.{ThreadPoolExecutor, TimeUnit, LinkedBlockingQueue} * * @author Philipp Haller */ -class DefaultExecutorScheduler extends ExecutorScheduler { +class DefaultExecutorScheduler(daemon: Boolean) extends ExecutorScheduler { + + def this() = + this(false) private val workQueue = new LinkedBlockingQueue[Runnable] + private val threadFactory = new ThreadFactory { + def newThread(r: Runnable): Thread = { + val result = new Thread(r) + result.setDaemon(daemon) + result + } + } + private val threadPool = new ThreadPoolExecutor(ThreadPoolConfig.corePoolSize, ThreadPoolConfig.maxPoolSize, 50L, TimeUnit.MILLISECONDS, - workQueue) + workQueue, + threadFactory) executor = threadPool diff --git a/src/actors/scala/actors/Future.scala b/src/actors/scala/actors/Future.scala index 9275ec1b07..f8c2385561 100644 --- a/src/actors/scala/actors/Future.scala +++ b/src/actors/scala/actors/Future.scala @@ -38,7 +38,7 @@ abstract class Future[+T](val ch: InputChannel[T]) extends Responder[T] with Fun */ object Futures { - private val sched = new FJTaskScheduler2(true) + private lazy val sched = new DefaultExecutorScheduler(true) def future[T](body: => T): Future[T] = { case object Eval diff --git a/src/actors/scala/actors/SimpleExecutorScheduler.scala b/src/actors/scala/actors/SimpleExecutorScheduler.scala index d6b2104939..4c07ec5c5a 100644 --- a/src/actors/scala/actors/SimpleExecutorScheduler.scala +++ b/src/actors/scala/actors/SimpleExecutorScheduler.scala @@ -48,7 +48,8 @@ class SimpleExecutorScheduler(protected var executor: ExecutorService) extends I executor execute task } catch { case ree: RejectedExecutionException => - Debug.info("caught "+ree) + // run task on current thread + task.run() } } @@ -73,7 +74,7 @@ class SimpleExecutorScheduler(protected var executor: ExecutorService) extends I * has not been shut down. */ def isActive = - !executor.isShutdown() + (executor ne null) && !executor.isShutdown() def newActor(a: Actor) {} -- cgit v1.2.3