Пример #1
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
 public Unit TellUserControl(UserControlMessage message)
 {
     if (message == null)
     {
         throw new ArgumentNullException(nameof(message));
     }
     userMailbox.Post(message);
     return(unit);
 }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        /// <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);
Пример #9
0
 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));
Пример #12
0
 public Unit TellUserControl(UserControlMessage message) => unit;
Пример #13
0
 public static Unit TellUserControl(ProcessId pid, UserControlMessage message) =>
 GetDispatcher(pid).TellUserControl(message, Self);
Пример #14
0
 public Unit TellUserControl(UserControlMessage message, ProcessId sender) =>
 Raise <Unit>();
Пример #15
0
 public Unit TellUserControl(UserControlMessage message) => unit;
Пример #16
0
        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;
            }
        }