summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2010-04-13 22:50:37 +0000
committerIulian Dragos <jaguarul@gmail.com>2010-04-13 22:50:37 +0000
commit7d6f1e7e4e8c9024f886f32804d5e341cd14bd11 (patch)
treeb6597ec4ebbb2edcf467bc4ee61dccb4486f5b40
parent6c213d1c8198423076c111271fd6018a82593087 (diff)
downloadscala-7d6f1e7e4e8c9024f886f32804d5e341cd14bd11.tar.gz
scala-7d6f1e7e4e8c9024f886f32804d5e341cd14bd11.tar.bz2
scala-7d6f1e7e4e8c9024f886f32804d5e341cd14bd11.zip
Fixed deadlocking behavior in actors.
Specialization removed a 'private' modifier on Actor.resumeActor. Mixin did not mix this method in actor implementations, believing it was private. At runtime, an AbstractMethodError was thrown, but swallowed by forkjoin (probably), resulting in an apparent deadlock. It would have been much faster to find and fix if the stacktrace was printed, as it is in Java 1.5. No review.
-rw-r--r--src/actors/scala/actors/Reactor.scala2
-rw-r--r--src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala8
2 files changed, 6 insertions, 4 deletions
diff --git a/src/actors/scala/actors/Reactor.scala b/src/actors/scala/actors/Reactor.scala
index a5bdcf1dd9..85dcd57189 100644
--- a/src/actors/scala/actors/Reactor.scala
+++ b/src/actors/scala/actors/Reactor.scala
@@ -195,7 +195,7 @@ trait Reactor[Msg >: Null] extends OutputChannel[Msg] with Combinators {
*
* @param handler a partial function with message patterns and actions
*/
- protected[actors] def react(handler: PartialFunction[Msg, Unit]): Nothing = {
+ protected def react(handler: PartialFunction[Msg, Unit]): Nothing = {
synchronized { drainSendBuffer(mailbox) }
searchMailbox(mailbox, handler, false)
throw Actor.suspendException
diff --git a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
index 5f18bb84ba..d5d7ca254e 100644
--- a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
+++ b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
@@ -1202,9 +1202,11 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
override def transform(tree: Tree): Tree = tree match {
case Select(qual, name) =>
if (tree.symbol.hasFlag(PRIVATE | PROTECTED)) {
- log("changing private flag of " + tree.symbol)
+ log("changing private flag of " + tree.symbol + " privateWithin: " + tree.symbol.privateWithin)
// tree.symbol.resetFlag(PRIVATE).setFlag(PROTECTED)
- tree.symbol.resetFlag(PRIVATE | PROTECTED)
+ tree.symbol.makeNotPrivate(tree.symbol.owner)
+// tree.symbol.resetFlag(PRIVATE | PROTECTED)
+// tree.symbol.privateWithin = NoSymbol
}
super.transform(tree)
@@ -1296,7 +1298,7 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
}
/** Create specialized class definitions */
- def implSpecClasses(trees: List[Tree]): List[Tree] = {
+ def implSpecClasses(trees: List[Tree]): List[Tree] = {
val buf = new mutable.ListBuffer[Tree]
for (tree <- trees)
tree match {