internal void QueueCommand(Commands.BaseCommand command) { if (command == null) { throw new ArgumentNullException("command"); } // check whether a new command can be queued at this timing if (RunningCommand != null) { Debug.Assert(RunningCommand.ExecutionPhase != Commands.CommandPhase.Pending); if (RunningCommand.ExecutionPhase == Commands.CommandPhase.Prerequisite) { throw new InvalidOperationException("Command can't be queued in Prerequisite phase."); } } InitializeCommand(command); command.ValidateOnIssue(); if (RunningCommand != null && RunningCommand.ExecutionPhase == Commands.CommandPhase.Prolog) { Debug.Assert(m_timingGroupHead != null && m_timingGroupTail != null); command.Next = m_timingGroupTail.Next; m_timingGroupTail.Next = command; m_timingGroupTail = command; } else { CommandQueue.PushTail(command, ref m_commandQueueHead, ref m_commandQueueTail); } }
private void QueueResourceCommand(Commands.BaseCommand command) { // can only queue command at head when issueing resource consuming commands Debug.Assert(RunningCommand != null && RunningCommand.ExecutionPhase == Commands.CommandPhase.Condition); InitializeCommand(command); command.ValidateOnIssue(); CommandQueue.PushTail(command, ref m_resourceCommandQueueHead, ref m_resourceCommandQueueTail); }