summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Cunei <antonio.cunei@epfl.ch>2010-09-16 09:09:48 +0000
committerAntonio Cunei <antonio.cunei@epfl.ch>2010-09-16 09:09:48 +0000
commit93bd975a110322c57c1edef91362faccd740ee85 (patch)
tree27e1a65f52a5aba60b6f1c3707543eb852100ff1
parent52a647c94d67dfa39181c165cb9bef041ed1746c (diff)
downloadscala-93bd975a110322c57c1edef91362faccd740ee85.tar.gz
scala-93bd975a110322c57c1edef91362faccd740ee85.tar.bz2
scala-93bd975a110322c57c1edef91362faccd740ee85.zip
Merged revisions 22988-22989 via svnmerge from
https://lampsvn.epfl.ch/svn-repos/scala/scala/trunk ........ r22988 | eugenevigdorchik | 2010-09-15 11:06:51 +0200 (Wed, 15 Sep 2010) | 1 line Adding interrupts should wake the server ........ r22989 | eugenevigdorchik | 2010-09-15 11:10:31 +0200 (Wed, 15 Sep 2010) | 1 line Shield interrupts against exceptions in user code ........
-rw-r--r--src/compiler/scala/tools/nsc/util/InterruptReq.scala13
-rw-r--r--src/compiler/scala/tools/nsc/util/WorkScheduler.scala1
2 files changed, 11 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/util/InterruptReq.scala b/src/compiler/scala/tools/nsc/util/InterruptReq.scala
index aa7804acbe..e7c05beb65 100644
--- a/src/compiler/scala/tools/nsc/util/InterruptReq.scala
+++ b/src/compiler/scala/tools/nsc/util/InterruptReq.scala
@@ -12,17 +12,24 @@ abstract class InterruptReq {
protected val todo: () => R
/** The result provided */
- private var result: Option[R] = None
+ private var result: Option[Either[R, Throwable]] = None
/** To be called from interrupted server to execute demanded task */
def execute(): Unit = synchronized {
- result = Some(todo())
+ try {
+ result = Some(Left(todo()))
+ } catch {
+ case t => result = Some(Right(t))
+ }
notify()
}
/** To be called from interrupting client to get result fo interrupt */
def getResult(): R = synchronized {
while (result.isEmpty) wait()
- result.get
+ result.get match {
+ case Left(res) => res
+ case Right(t) => throw t
+ }
}
}
diff --git a/src/compiler/scala/tools/nsc/util/WorkScheduler.scala b/src/compiler/scala/tools/nsc/util/WorkScheduler.scala
index 5f33ea4aaa..f520aec8bc 100644
--- a/src/compiler/scala/tools/nsc/util/WorkScheduler.scala
+++ b/src/compiler/scala/tools/nsc/util/WorkScheduler.scala
@@ -52,6 +52,7 @@ class WorkScheduler {
}
synchronized {
interruptReqs enqueue ir
+ notify()
}
ir.getResult()
}