SendToState GetMessageToSend(out Message messageToSend)
        {
            SendToState result = SendToState.NoMessageToSendError;

            messageToSend = null;
            lock (m_OutgoingMessages)
            {
                if (m_QueueOverflowUnsentCounter > 0)
                {
                    //This means that we can't send message to ROS as fast as we're generating them.
                    //This could potentially be bad as it means that we are dropping messages!
                    m_QueueOverflowUnsentCounter--;
                    messageToSend = null;
                    result        = SendToState.QueueFullWarning;
                }
                else if (m_OutgoingMessages.Count > 0)
                {
                    //Retrieve the next message and populate messageToSend.
                    messageToSend = m_OutgoingMessages.First.Value;
                    m_OutgoingMessages.RemoveFirst();
                    result = SendToState.Normal;
                }
            }

            return(result);
        }
        public override SendToState SendInternal(MessageSerializer messageSerializer, Stream stream)
        {
            SendToState sendToState = GetMessageToSend(out Message toSend);

            if (sendToState == SendToState.Normal)
            {
                SendMessageWithStream(messageSerializer, stream, toSend);

                //Recycle the message (if applicable).
                if (m_LastMessageSent != null && m_LastMessageSent != toSend)
                {
                    TryRecycleMessage(m_LastMessageSent);
                }

                m_LastMessageSent = toSend;
            }

            return(sendToState);
        }