summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2009-05-27 15:55:40 +0000
committerPhilipp Haller <hallerp@gmail.com>2009-05-27 15:55:40 +0000
commit29f58824a4afa0208ec45c57b1d999b132cfddf0 (patch)
treeda6a011c2da32816b4f50779303bc9fef8a4798e /src
parent76e6f41e6d409850f47404277ba30c21579c2cb3 (diff)
downloadscala-29f58824a4afa0208ec45c57b1d999b132cfddf0.tar.gz
scala-29f58824a4afa0208ec45c57b1d999b132cfddf0.tar.bz2
scala-29f58824a4afa0208ec45c57b1d999b132cfddf0.zip
Implemented #2015.
Diffstat (limited to 'src')
-rw-r--r--src/actors/scala/actors/DaemonActor.scala20
-rw-r--r--src/actors/scala/actors/DaemonScheduler.scala18
-rw-r--r--src/actors/scala/actors/DefaultExecutorScheduler.scala18
-rw-r--r--src/actors/scala/actors/Future.scala2
-rw-r--r--src/actors/scala/actors/SimpleExecutorScheduler.scala5
5 files changed, 57 insertions, 6 deletions
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 <code>Actor</code>, an active <code>DaemonActor</code> 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 <code>DefaultExecutorScheduler</code> 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) {}