示例#1
0
        private LatestFirstSystemMessageList UnstashAll()
        {
            var unstashed = _sysMsgStash;

            _sysMsgStash = SystemMessageList.LNil;
            return(unstashed);
        }
示例#2
0
        /// <summary>
        /// TBD
        /// </summary>
        /// <param name="old">TBD</param>
        /// <param name="newQueue">TBD</param>
        /// <returns>TBD</returns>
        internal bool SystemQueuePut(LatestFirstSystemMessageList old, LatestFirstSystemMessageList newQueue)
        {
            // Note: calling .head is not actually existing on the bytecode level as the parameters _old and _new
            // are SystemMessage instances hidden during compile time behind the SystemMessageList value class.
            // Without calling .head the parameters would be boxed in SystemMessageList wrapper.
            var prev = old.Head;

            return(Interlocked.CompareExchange(ref _systemQueueDoNotCallMeDirectly, newQueue.Head, old.Head) == prev);
        }
示例#3
0
 private void DrainSysMsgQueue(ICell cell)
 {
     while (_sysMsgQueue.NonEmpty)
     {
         var sysQ = _sysMsgQueue.Reverse;
         _sysMsgQueue = SystemMessageList.LNil;
         while (sysQ.NonEmpty)
         {
             var msg = sysQ.Head;
             sysQ = sysQ.Tail;
             msg.Unlink();
             cell.SendSystemMessage(msg);
         }
     }
 }
示例#4
0
 /// <summary>
 /// TBD
 /// </summary>
 /// <param name="message">TBD</param>
 public void SendSystemMessage(ISystemMessage message)
 {
     lock (_lock)
     {
         var cell = _self.Underlying;
         if (CellIsReady(cell))
         {
             cell.SendSystemMessage(message);
         }
         else
         {
             _sysMsgQueue = _sysMsgQueue + (SystemMessage)message;
             Mailbox.DebugPrint("{0} temp queueing system message {1}", Self, message);
         }
     }
 }
示例#5
0
        /// <summary>
        /// Drains <see cref="ISystemMessage"/> from this mailbox.
        /// </summary>
        /// <param name="newContents">The replacement queue for the system messages inside this mailbox.</param>
        internal virtual EarliestFirstSystemMessageList SystemDrain(LatestFirstSystemMessageList newContents)
        {
            var currentList = SystemQueue;

            if (currentList.Head is NoMessage)
            {
                return(new EarliestFirstSystemMessageList(null));
            }
            else if (SystemQueuePut(currentList, newContents))
            {
                return(currentList.Reverse);
            }
            else
            {
                return(SystemDrain(newContents));
            }
        }
示例#6
0
 /// <summary>
 /// TBD
 /// </summary>
 /// <param name="msg">TBD</param>
 protected void Stash(SystemMessage msg)
 {
     Assert.Assert(msg.Unlinked);
     _sysMsgStash = _sysMsgStash + msg;
 }
示例#7
0
 internal override EarliestFirstSystemMessageList SystemDrain(LatestFirstSystemMessageList newContents)
 {
     return SystemMessageList.ENil;
 }