/// <summary>
        /// Place a ready texture sender on the processing queue.
        /// </summary>
        /// <param name="textureSender"></param>
        private void EnqueueTextureSender(ITextureSender textureSender)
        {
            textureSender.Cancel  = false;
            textureSender.Sending = true;

            if (!m_sharedSendersQueue.Contains(textureSender))
            {
                m_sharedSendersQueue.Enqueue(textureSender);
            }
        }
        /// <summary>
        /// Entry point for the thread dedicated to processing the texture queue.
        /// </summary>
        public void ProcessTextureSenders()
        {
            ITextureSender sender = null;

            try
            {
                while (true)
                {
                    sender = m_queueSenders.Dequeue();

                    if (sender.Cancel)
                    {
                        TextureSent(sender);

                        sender.Cancel = false;
                    }
                    else
                    {
                        bool finished = sender.SendTexturePacket();
                        if (finished)
                        {
                            TextureSent(sender);
                        }
                        else
                        {
                            m_queueSenders.Enqueue(sender);
                        }
                    }

                    // Make sure that any sender we currently have can get garbage collected
                    sender = null;

                    //m_log.InfoFormat("[TEXTURE] Texture sender queue size: {0}", m_queueSenders.Count());
                }
            }
            catch (Exception e)
            {
                // TODO: Let users in the sim and those entering it and possibly an external watchdog know what has happened
                m_log.ErrorFormat(
                    "[TEXTURE]: Texture send thread terminating with exception.  PLEASE REBOOT YOUR SIM - TEXTURES WILL NOT BE AVAILABLE UNTIL YOU DO.  Exception is {0}",
                    e);
            }
        }
        /// <summary>
        /// Place a ready texture sender on the processing queue.
        /// </summary>
        /// <param name="textureSender"></param>
        private void EnqueueTextureSender(ITextureSender textureSender)
        {
            textureSender.Cancel = false;
            textureSender.Sending = true;

            if (!m_sharedSendersQueue.Contains(textureSender))
            {
                m_sharedSendersQueue.Enqueue(textureSender);
            }
        }
 /// <summary>
 /// Called when the texture has finished sending.
 /// </summary>
 /// <param name="sender"></param>
 private void TextureSent(ITextureSender sender)
 {
     sender.Sending = false;
     //m_log.DebugFormat("[TEXTURE]: Removing download stat for {0}", sender.assetID);
     m_scene.StatsReporter.AddPendingDownloads(-1);
 }
 /// <summary>
 /// Called when the texture has finished sending.
 /// </summary>
 /// <param name="sender"></param>
 private void TextureSent(ITextureSender sender)
 {
     sender.Sending = false;
     //m_log.DebugFormat("[TEXTURE]: Removing download stat for {0}", sender.assetID);
     m_scene.StatsReporter.AddPendingDownloads(-1);
 }