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