summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorViktor Klang <viktor.klang@gmail.com>2012-04-13 18:11:38 +0200
committerViktor Klang <viktor.klang@gmail.com>2012-04-13 18:11:38 +0200
commitaf8416bb7ff4d6816f416cd0671e26e2cdc653d7 (patch)
treebd8853b9b2b66a9605bd40d5f34c74e34ff73574
parent05779d413ed8de3717307b78cccb413f0a687101 (diff)
downloadscala-af8416bb7ff4d6816f416cd0671e26e2cdc653d7.tar.gz
scala-af8416bb7ff4d6816f416cd0671e26e2cdc653d7.tar.bz2
scala-af8416bb7ff4d6816f416cd0671e26e2cdc653d7.zip
Adding NonFatal matching as to not catch anything that should terminate the JVM, also adding EX.reportFailure where it makes sense
-rw-r--r--src/library/scala/concurrent/Future.scala11
-rw-r--r--src/library/scala/concurrent/impl/Future.scala12
-rw-r--r--src/library/scala/concurrent/impl/Promise.scala2
3 files changed, 11 insertions, 14 deletions
diff --git a/src/library/scala/concurrent/Future.scala b/src/library/scala/concurrent/Future.scala
index f331263d39..40acea91c9 100644
--- a/src/library/scala/concurrent/Future.scala
+++ b/src/library/scala/concurrent/Future.scala
@@ -18,6 +18,7 @@ import java.{ lang => jl }
import java.util.concurrent.atomic.{ AtomicReferenceFieldUpdater, AtomicInteger, AtomicBoolean }
import scala.concurrent.util.Duration
+import scala.concurrent.impl.NonFatal
import scala.Option
import scala.annotation.tailrec
@@ -203,7 +204,7 @@ trait Future[+T] extends Awaitable[T] {
case Right(v) =>
try p success f(v)
catch {
- case t => p complete resolver(t)
+ case NonFatal(t) => p complete resolver(t)
}
}
@@ -229,7 +230,7 @@ trait Future[+T] extends Awaitable[T] {
case Right(v) => p success v
}
} catch {
- case t: Throwable => p complete resolver(t)
+ case NonFatal(t) => p complete resolver(t)
}
}
@@ -262,7 +263,7 @@ trait Future[+T] extends Awaitable[T] {
if (pred(v)) p success v
else p failure new NoSuchElementException("Future.filter predicate is not satisfied by: " + v)
} catch {
- case t: Throwable => p complete resolver(t)
+ case NonFatal(t) => p complete resolver(t)
}
}
@@ -336,7 +337,7 @@ trait Future[+T] extends Awaitable[T] {
onComplete {
case Left(t) if pf isDefinedAt t =>
try { p success pf(t) }
- catch { case t: Throwable => p complete resolver(t) }
+ catch { case NonFatal(t) => p complete resolver(t) }
case otherwise => p complete otherwise
}
@@ -364,7 +365,7 @@ trait Future[+T] extends Awaitable[T] {
try {
p completeWith pf(t)
} catch {
- case t: Throwable => p complete resolver(t)
+ case NonFatal(t) => p complete resolver(t)
}
case otherwise => p complete otherwise
}
diff --git a/src/library/scala/concurrent/impl/Future.scala b/src/library/scala/concurrent/impl/Future.scala
index 72ffa6a014..ca13981163 100644
--- a/src/library/scala/concurrent/impl/Future.scala
+++ b/src/library/scala/concurrent/impl/Future.scala
@@ -77,7 +77,9 @@ object Future {
try {
Right(body)
} catch {
- case e => scala.concurrent.resolver(e)
+ case NonFatal(e) =>
+ executor.reportFailure(e)
+ scala.concurrent.resolver(e)
}
}
}
@@ -115,13 +117,7 @@ object Future {
_taskStack set taskStack
while (taskStack.nonEmpty) {
val next = taskStack.pop()
- try {
- next.apply()
- } catch {
- case e =>
- // TODO catching all and continue isn't good for OOME
- executor.reportFailure(e)
- }
+ try next() catch { case NonFatal(e) => executor reportFailure e }
}
} finally {
_taskStack.remove()
diff --git a/src/library/scala/concurrent/impl/Promise.scala b/src/library/scala/concurrent/impl/Promise.scala
index 140cfa93a0..1388c8b357 100644
--- a/src/library/scala/concurrent/impl/Promise.scala
+++ b/src/library/scala/concurrent/impl/Promise.scala
@@ -180,7 +180,7 @@ object Promise {
try {
func(result)
} catch {
- case /*NonFatal(*/e/*)*/ => executor.reportFailure(e)
+ case NonFatal(e) => executor reportFailure e
}
}
}