InboxDirective StatefulUserInbox(Actor <S, T> actor, IActorInbox inbox, UserControlMessage msg, ActorItem parent) { if (IsPaused) { userQueue = userQueue.Enqueue(msg); } else { while (userQueue.Count > 0) { // Don't process messages if we've been paused if (IsPaused) { return(InboxDirective.Pause); } var qmsg = userQueue.Peek(); userQueue = userQueue.Dequeue(); ProcessInboxDirective(ActorInboxCommon.UserMessageInbox(actor, inbox, qmsg, parent), qmsg); } if (IsPaused) { // Don't process the message if we've been paused userQueue = userQueue.Enqueue(msg); return(InboxDirective.Pause); } return(ProcessInboxDirective(ActorInboxCommon.UserMessageInbox(actor, inbox, msg, parent), msg)); } return(InboxDirective.Default); }
InboxDirective StatefulUserInbox(Actor <S, T> actor, IActorInbox inbox, UserControlMessage msg, ActorItem parent) { if (IsPaused) { userQueue = userQueue.Enqueue(msg); } else { while (userQueue.Count > 0) { var qmsg = userQueue.Peek(); userQueue = userQueue.Dequeue(); ActorInboxCommon.UserMessageInbox(actor, inbox, qmsg, parent); } var directive = ActorInboxCommon.UserMessageInbox(actor, inbox, msg, parent); if (directive == InboxDirective.PushToFrontOfQueue) { var newQueue = Que <UserControlMessage> .Empty; while (userQueue.Count > 0) { newQueue = newQueue.Enqueue(userQueue.Peek()); userQueue.Dequeue(); } userQueue = newQueue; } } return(InboxDirective.Default); }
public Unit TellUserControl(UserControlMessage msg) { if (userInbox.CurrentQueueLength >= MailboxSize) { throw new ProcessInboxFullException(actor.Id, MailboxSize, "user"); } if (userInbox != null) { if (msg == null) { throw new ArgumentNullException(nameof(msg)); } if (IsPaused) { new ActorDispatchRemote(actor.Id, cluster, ActorContext.SessionId).TellUserControl(msg, ProcessId.None); } else { userInbox.Post(msg); } } return(unit); }
public Unit TellUserControl(UserControlMessage message) { if (message == null) { throw new ArgumentNullException(nameof(message)); } userMailbox.Post(message); return(unit); }
public Unit TellUserControl(UserControlMessage message) { if (Count >= MailboxSize) { throw new ProcessInboxFullException(actor.Id, MailboxSize, "user"); } if (userInbox != null) { if (message == null) { throw new ArgumentNullException(nameof(message)); } userInbox.Post(message); } return(unit); }
InboxDirective ProcessInboxDirective(InboxDirective directive, UserControlMessage msg) { IsPaused = (directive & InboxDirective.Pause) != 0; if ((directive & InboxDirective.PushToFrontOfQueue) != 0) { var newQueue = Que <UserControlMessage> .Empty.Enqueue(msg); while (userQueue.Count > 0) { newQueue = newQueue.Enqueue(userQueue.Peek()); userQueue = userQueue.Dequeue(); } userQueue = newQueue; } return(directive); }
/// <summary> /// Clears the state (keeps the mailbox items) /// </summary> public Unit Restart() { lock (actorLock) { // Take a copy of the messages from the dead mailbox var msgs = new Queue <UserControlMessage>(userMailbox.CurrentQueueLength); while (userMailbox.CurrentQueueLength > 0) { UserControlMessage userMessage = FSharpAsync.StartAsTask( userMailbox.Receive(FSharpOption <int> .None), FSharpOption <TaskCreationOptions> .None, FSharpOption <CancellationToken> .None ).Result; if (userMessage != null) { msgs.Enqueue(userMessage); } } // We shutdown the children, because we're about to restart which will // recreate them. Shutdown(false); // Start new mailboxes StartMailboxes(); // Copy the old messages while (msgs.Count > 0) { userMailbox.Post(msgs.Dequeue()); } return(unit); } }
public Unit TellUserControl(UserControlMessage message, ProcessId sender) => Tell(message, sender, "system", Message.Type.UserControl, message.Tag);
public Unit TellUserControl(UserControlMessage message, ProcessId sender) => ProcessOp.IO(() => Inbox.TellUserControl(message));
public static InboxDirective UserMessageInbox <S, T>(Actor <S, T> actor, IActorInbox inbox, UserControlMessage msg, ActorItem parent) { switch (msg.Tag) { case Message.TagSpec.UserAsk: var rmsg = (ActorRequest)msg; return(ActorContext.WithContext(new ActorItem(actor, inbox, actor.Flags), parent, rmsg.ReplyTo, rmsg, msg, msg.SessionId, () => actor.ProcessAsk(rmsg))); case Message.TagSpec.UserReply: var urmsg = (ActorResponse)msg; ActorContext.WithContext(new ActorItem(actor, inbox, actor.Flags), parent, urmsg.ReplyFrom, null, msg, msg.SessionId, () => actor.ProcessResponse(urmsg)); break; case Message.TagSpec.UserTerminated: var utmsg = (TerminatedMessage)msg; return(ActorContext.WithContext(new ActorItem(actor, inbox, actor.Flags), parent, utmsg.Id, null, msg, msg.SessionId, () => actor.ProcessTerminated(utmsg.Id))); case Message.TagSpec.User: var umsg = (UserMessage)msg; return(ActorContext.WithContext(new ActorItem(actor, inbox, actor.Flags), parent, umsg.Sender, null, msg, msg.SessionId, () => actor.ProcessMessage(umsg.Content))); case Message.TagSpec.ShutdownProcess: kill(actor.Id); break; } return(InboxDirective.Default); }
public Unit TellUserControl(UserControlMessage message, ProcessId sender) => IterRoleMembers(d => d.TellUserControl(message, sender));
public Unit TellUserControl(UserControlMessage message) => unit;
public static Unit TellUserControl(ProcessId pid, UserControlMessage message) => GetDispatcher(pid).TellUserControl(message, Self);
public Unit TellUserControl(UserControlMessage message, ProcessId sender) => Raise <Unit>();
public static void UserMessageInbox <S, T>(Actor <S, T> actor, IActorInbox inbox, UserControlMessage msg, ActorItem parent) { switch (msg.Tag) { case Message.TagSpec.UserAsk: var rmsg = (ActorRequest)msg; ActorContext.WithContext(new ActorItem(actor, inbox, actor.Flags), parent, rmsg.ReplyTo, rmsg, msg, () => actor.ProcessAsk(rmsg)); break; case Message.TagSpec.UserReply: var urmsg = (ActorResponse)msg; ActorContext.WithContext(new ActorItem(actor, inbox, actor.Flags), parent, urmsg.ReplyFrom, null, msg, () => actor.ProcessResponse(urmsg)); break; case Message.TagSpec.User: var umsg = (UserMessage)msg; ActorContext.WithContext(new ActorItem(actor, inbox, actor.Flags), parent, umsg.Sender, null, msg, () => actor.ProcessMessage(umsg.Content)); break; case Message.TagSpec.ShutdownProcess: kill(actor.Id); break; } }