private LatestFirstSystemMessageList UnstashAll() { var unstashed = _sysMsgStash; _sysMsgStash = SystemMessageList.LNil; return(unstashed); }
/// <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); }
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); } } }
/// <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); } } }
/// <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)); } }
/// <summary> /// TBD /// </summary> /// <param name="msg">TBD</param> protected void Stash(SystemMessage msg) { Assert.Assert(msg.Unlinked); _sysMsgStash = _sysMsgStash + msg; }
internal override EarliestFirstSystemMessageList SystemDrain(LatestFirstSystemMessageList newContents) { return SystemMessageList.ENil; }