Merge pull request #782 from akka/wip-null-is-not-tasty-√

Changing the default sender of ! to be Actor.noSender to keep null in on...
This commit is contained in:
Viktor Klang (√) 2012-10-07 22:02:37 -07:00
commit 5b0a2ec7ee
11 changed files with 19 additions and 14 deletions

View file

@ -300,6 +300,11 @@ object Actor {
def apply(x: Any) = throw new UnsupportedOperationException("Empty behavior apply()")
}
/**
* Default placeholder (null) used for "!" to indicate that there is no sender of the message,
* that will be translated to the receiving system's deadLetters.
*/
final val noSender: ActorRef = null
}
/**

View file

@ -153,7 +153,7 @@ trait ScalaActorRef { ref: ActorRef ⇒
* </pre>
* <p/>
*/
def !(message: Any)(implicit sender: ActorRef = null): Unit
def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit
}
@ -341,7 +341,7 @@ private[akka] class LocalActorRef private[akka] (
override def sendSystemMessage(message: SystemMessage): Unit = actorCell.sendSystemMessage(message)
override def !(message: Any)(implicit sender: ActorRef = null): Unit = actorCell.tell(message, sender)
override def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit = actorCell.tell(message, sender)
override def restart(cause: Throwable): Unit = actorCell.restart(cause)
@ -395,7 +395,7 @@ private[akka] trait MinimalActorRef extends InternalActorRef with LocalRef {
override def stop(): Unit = ()
override def isTerminated = false
override def !(message: Any)(implicit sender: ActorRef = null): Unit = ()
override def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit = ()
override def sendSystemMessage(message: SystemMessage): Unit = ()
override def restart(cause: Throwable): Unit = ()
@ -435,7 +435,7 @@ private[akka] class EmptyLocalActorRef(override val provider: ActorRefProvider,
override def sendSystemMessage(message: SystemMessage): Unit = specialHandle(message)
override def !(message: Any)(implicit sender: ActorRef = null): Unit = message match {
override def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit = message match {
case d: DeadLetter specialHandle(d.message) // do NOT form endless loops, since deadLetters will resend!
case _ if (!specialHandle(message)) eventStream.publish(DeadLetter(message, sender, this))
}

View file

@ -375,7 +375,7 @@ class LocalActorRefProvider(
override def stop(): Unit = stopped switchOn { terminationPromise.complete(causeOfTermination.map(Failure(_)).getOrElse(Success(()))) }
override def isTerminated: Boolean = stopped.isOn
override def !(message: Any)(implicit sender: ActorRef = null): Unit = stopped.ifOff(message match {
override def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit = stopped.ifOff(message match {
case Failed(ex, _) if sender ne null causeOfTermination = Some(ex); sender.asInstanceOf[InternalActorRef].stop()
case NullMessage // do nothing
case _ log.error(this + " received unexpected message [" + message + "]")

View file

@ -70,5 +70,5 @@ object ActorSelection {
trait ScalaActorSelection {
this: ActorSelection
def !(msg: Any)(implicit sender: ActorRef = null) = tell(msg, sender)
def !(msg: Any)(implicit sender: ActorRef = Actor.noSender) = tell(msg, sender)
}

View file

@ -112,7 +112,7 @@ private[akka] class RepointableActorRef(
}
} else this
def !(message: Any)(implicit sender: ActorRef = null) = underlying.tell(message, sender)
def !(message: Any)(implicit sender: ActorRef = Actor.noSender) = underlying.tell(message, sender)
def sendSystemMessage(message: SystemMessage) = underlying.sendSystemMessage(message)

View file

@ -708,7 +708,7 @@ object Logging {
val path: ActorPath = new RootActorPath(Address("akka", "all-systems"), "/StandardOutLogger")
def provider: ActorRefProvider = throw new UnsupportedOperationException("StandardOutLogger does not provide")
override val toString = "StandardOutLogger"
override def !(message: Any)(implicit sender: ActorRef = null): Unit = print(message)
override def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit = print(message)
}
val StandardOutLogger = new StandardOutLogger

View file

@ -247,7 +247,7 @@ private[akka] final class PromiseActorRef private (val provider: ActorRefProvide
case Registering path // spin until registration is completed
}
override def !(message: Any)(implicit sender: ActorRef = null): Unit = state match {
override def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit = state match {
case Stopped | _: StoppedWithPath provider.deadLetters ! message
case _ if (!(result.tryComplete(
message match {

View file

@ -7,12 +7,12 @@ import language.implicitConversions
import scala.concurrent.{ Future, ExecutionContext }
import scala.util.{ Failure, Success }
import akka.actor.{ Status, ActorRef }
import akka.actor.{ Status, ActorRef, Actor }
trait PipeToSupport {
final class PipeableFuture[T](val future: Future[T])(implicit executionContext: ExecutionContext) {
def pipeTo(recipient: ActorRef)(implicit sender: ActorRef = null): Future[T] = {
def pipeTo(recipient: ActorRef)(implicit sender: ActorRef = Actor.noSender): Future[T] = {
future onComplete {
case Success(r) recipient ! r
case Failure(f) recipient ! Status.Failure(f)

View file

@ -45,7 +45,7 @@ trait Listeners { self: Actor ⇒
* @param msg
* @param sender
*/
protected def gossip(msg: Any)(implicit sender: ActorRef = null): Unit = {
protected def gossip(msg: Any)(implicit sender: ActorRef = Actor.noSender): Unit = {
val i = listeners.iterator
while (i.hasNext) i.next ! msg
}

View file

@ -235,7 +235,7 @@ private[akka] class RemoteActorRef private[akka] (
provider.deadLetters ! message
}
override def !(message: Any)(implicit sender: ActorRef = null): Unit =
override def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit =
try remote.send(message, Option(sender), this)
catch {
case e @ (_: InterruptedException | NonFatal(_))

View file

@ -63,7 +63,7 @@ private[akka] class RemoteSystemDaemon(
}
}
override def !(msg: Any)(implicit sender: ActorRef = null): Unit = msg match {
override def !(msg: Any)(implicit sender: ActorRef = Actor.noSender): Unit = msg match {
case message: DaemonMsg
log.debug("Received command [{}] to RemoteSystemDaemon on [{}]", message, path.address)
message match {