diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2010-04-13 22:50:37 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2010-04-13 22:50:37 +0000 |
commit | 7d6f1e7e4e8c9024f886f32804d5e341cd14bd11 (patch) | |
tree | b6597ec4ebbb2edcf467bc4ee61dccb4486f5b40 | |
parent | 6c213d1c8198423076c111271fd6018a82593087 (diff) | |
download | scala-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.scala | 2 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala | 8 |
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 { |