Moving all the logic for cleaning up mailboxes into the mailbox implementation itself

This commit is contained in:
Viktor Klang 2011-12-07 15:51:46 +01:00
parent bf3ce9bb87
commit 72d69cb7cc
3 changed files with 37 additions and 41 deletions

View file

@ -209,8 +209,29 @@ abstract class Mailbox(val actor: ActorCell) extends MessageQueue with SystemMes
/**
* Overridable callback to clean up the mailbox,
* called when an actor is unregistered.
* By default it dequeues all system messages + messages and ships them to the owning actors' systems' DeadLetterMailbox
*/
protected[dispatch] def cleanUp() {}
protected[dispatch] def cleanUp() {
val dlq = actor.systemImpl.deadLetterMailbox
if (hasSystemMessages) {
var message = systemDrain()
while (message ne null) {
// message must be virgin before being able to systemEnqueue again
val next = message.next
message.next = null
dlq.systemEnqueue(actor.self, message)
message = next
}
}
if (hasMessages) {
var envelope = dequeue
while (envelope ne null) {
dlq.enqueue(actor.self, envelope)
envelope = dequeue
}
}
}
}
trait MessageQueue {