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);
        }