protected void TellWatchersWeDied()
{
var watchedBy = _state
.GetWatchedBy()
.ToList();
if (!watchedBy.Any()) return;
try
{
// Don't need to send to parent parent since it receives a DWN by default
/*
* It is important to notify the remote watchers first, otherwise RemoteDaemon might shut down, causing
* the remoting to shut down as well. At this point Terminated messages to remote watchers are no longer
* deliverable.
*
* The problematic case is:
* 1. Terminated is sent to RemoteDaemon
* 1a. RemoteDaemon is fast enough to notify the terminator actor in RemoteActorRefProvider
* 1b. The terminator is fast enough to enqueue the shutdown command in the remoting
* 2. Only at this point is the Terminated (to be sent remotely) enqueued in the mailbox of remoting
*
* If the remote watchers are notified first, then the mailbox of the Remoting will guarantee the correct order.
*/
foreach (var w in watchedBy) SendTerminated(false, (IInternalActorRef)w);
foreach (var w in watchedBy) SendTerminated(true, (IInternalActorRef)w);
}
finally
{
_state = _state.ClearWatching();
}
}