/// <summary> /// Reprioritize all of the currently queued events /// </summary> public void Reprioritize() { lock (m_syncRoot) { List <QueuedInterestListEvent> removedEvents = new List <QueuedInterestListEvent>(0); foreach (C5.PriorityQueueHandle handle in m_eventIDs.Values) { QueuedInterestListEvent qile = m_eventHeap[handle]; double?priority = qile.Handler.PriorityCallback(qile.Event, m_presence); if (priority.HasValue) { // Update the event with its new priority and reinsert qile.Priority = priority.Value; m_eventHeap.Replace(handle, qile); } else { // Delete this event from the priority queue and mark // it for removal from the dictionary m_eventHeap.Delete(handle); removedEvents.Add(qile); } } // Erase any removed events from the m_eventIDs dictionary for (int i = 0; i < removedEvents.Count; i++) { m_eventIDs.Remove(removedEvents[i].Event.ID); } } }
/// <summary> /// Removes the item with the given key /// </summary> /// <param name="key"></param> public bool Remove(I key) { C5.IPriorityQueueHandle <IndexedItem> handle; if (_index.TryGetValue(key, out handle)) { _priQueue.Delete(handle); _index.Remove(key); return(true); } return(false); }
/// <summary> /// Handles an incoming texture request or update to an existing texture request /// </summary> /// <param name="newRequest"></param> public void EnqueueReq(TextureRequestArgs newRequest) { //Make sure we're not shutting down.. if (!m_shuttingdown) { J2KImage imgrequest; // Do a linear search for this texture download lock (m_syncRoot) m_priorityQueue.Find(delegate(J2KImage img) { return(img.TextureID == newRequest.RequestedAssetID); }, out imgrequest); if (imgrequest != null) { if (newRequest.DiscardLevel == -1 && newRequest.Priority == 0f) { //m_log.Debug("[TEX]: (CAN) ID=" + newRequest.RequestedAssetID); try { lock (m_syncRoot) m_priorityQueue.Delete(imgrequest.PriorityQueueHandle); } catch (Exception) { } } else { //m_log.DebugFormat("[TEX]: (UPD) ID={0}: D={1}, S={2}, P={3}", // newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority); //Check the packet sequence to make sure this isn't older than //one we've already received if (newRequest.requestSequence > imgrequest.LastSequence) { //Update the sequence number of the last RequestImage packet imgrequest.LastSequence = newRequest.requestSequence; //Update the requested discard level imgrequest.DiscardLevel = newRequest.DiscardLevel; //Update the requested packet number imgrequest.StartPacket = Math.Max(1, newRequest.PacketNumber); //Update the requested priority imgrequest.Priority = newRequest.Priority; UpdateImageInQueue(imgrequest); //Run an update imgrequest.RunUpdate(); } } } else { if (newRequest.DiscardLevel == -1 && newRequest.Priority == 0f) { //m_log.DebugFormat("[TEX]: (IGN) ID={0}: D={1}, S={2}, P={3}", // newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority); } else { //m_log.DebugFormat("[TEX]: (NEW) ID={0}: D={1}, S={2}, P={3}", // newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority); imgrequest = new J2KImage(this); imgrequest.J2KDecoder = m_j2kDecodeModule; imgrequest.AssetService = m_assetCache; imgrequest.AgentID = m_client.AgentId; imgrequest.InventoryAccessModule = m_client.Scene.RequestModuleInterface <IInventoryAccessModule>(); imgrequest.DiscardLevel = newRequest.DiscardLevel; imgrequest.StartPacket = Math.Max(1, newRequest.PacketNumber); imgrequest.Priority = newRequest.Priority; imgrequest.TextureID = newRequest.RequestedAssetID; imgrequest.Priority = newRequest.Priority; //Add this download to the priority queue AddImageToQueue(imgrequest); //Run an update imgrequest.RunUpdate(); } } } }
private void EnqueueRequest(LLAgent agent, UUID textureID, sbyte discardLevel, float priority, uint packetNumber, uint sequenceNumber) { J2KImage image; // Look up this texture download lock (m_priorityQueue) m_queuedTextures.TryGetValue(textureID, out image); if (image != null) { // Update for an existing texture request if (discardLevel == -1 && priority == 0f) { //m_log.Debug("[TEX]: (CAN) ID=" + textureID); try { lock (m_priorityQueue) { m_priorityQueue.Delete(image.PriorityQueueHandle); m_queuedTextures.Remove(textureID); } } catch (Exception) { } } else { //m_log.DebugFormat("[TEX]: (UPD) ID={0}: D={1}, S={2}, P={3}", textureID, discardLevel, packetNumber, priority); // Check the packet sequence to make sure this update isn't older than // one we've already received if (sequenceNumber > image.LastSequence) { // Update the sequence number of the last RequestImage packet image.LastSequence = sequenceNumber; //Update the requested discard level image.DiscardLevel = discardLevel; //Update the requested packet number image.StartPacket = Math.Max(1, packetNumber); //Update the requested priority image.Priority = priority; // Update the start/end offsets for this request image.UpdateOffsets(); UpdateImageInQueue(image); } } } else { // New texture request if (discardLevel == -1 && priority == 0f) { //m_log.DebugFormat("[TEX]: (IGN) ID={0}", textureID); } else { //m_log.DebugFormat("[TEX]: (NEW) ID={0}: D={1}, S={2}, P={3}", textureID, discardLevel, packetNumber, priority); Asset asset; if (m_assetClient.TryGetAsset(textureID, "image/x-j2c", out asset)) { image = new J2KImage(m_udp, asset, agent, discardLevel, Math.Max(1, packetNumber), priority); // Update the start/end offsets for this request image.UpdateOffsets(); // Add this download to the priority queue UpdateImageInQueue(image); } else { ImageNotInDatabasePacket missing = new ImageNotInDatabasePacket(); missing.ImageID.ID = textureID; m_udp.SendPacket(agent, missing, ThrottleCategory.Asset, true); } } } }
private void Delete(DeferredEventList eventList) { _sortedEvents.Delete(eventList.Handle); _eventsByScript.Remove(eventList.ItemId); }
/// <summary> /// Handles an incoming texture request or update to an existing texture request /// </summary> /// <param name="newRequest"></param> public void EnqueueReq(TextureRequestArgs newRequest) { if (!m_shuttingdown) { J2KImage imgrequest; // Do a linear search for this texture download lock (m_syncRoot) m_priorityQueue.Find(delegate(J2KImage img) { return(img.TextureID == newRequest.RequestedAssetID); }, out imgrequest); if (imgrequest != null) { if (newRequest.DiscardLevel < 0) { //m_log.Debug("[TEX]: (CAN) ID=" + newRequest.RequestedAssetID); try { lock (m_syncRoot) m_priorityQueue.Delete(imgrequest.PriorityQueueHandle); } catch (Exception) { } } else { // m_log.DebugFormat( // "[LL IMAGE MANAGER]: Received duplicate of existing request for {0}, start packet {1} from {2}", // newRequest.RequestedAssetID, newRequest.PacketNumber, m_client.Name); // m_log.DebugFormat("[TEX]: (UPD) ID={0}: D={1}, S={2}, P={3}", // newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority); //Check the packet sequence to make sure this isn't older than //one we've already received if (newRequest.requestSequence > imgrequest.LastSequence) { //Update the sequence number of the last RequestImage packet imgrequest.LastSequence = newRequest.requestSequence; //Update the requested discard level imgrequest.DiscardLevel = newRequest.DiscardLevel; //Update the requested packet number imgrequest.StartPacket = Math.Max(1, newRequest.PacketNumber); //Update the requested priority imgrequest.Priority = newRequest.Priority; UpdateImageInQueue(imgrequest); imgrequest.RunUpdate(); // J2KImage imgrequest2 = new J2KImage(this); // imgrequest2.J2KDecoder = m_j2kDecodeModule; // imgrequest2.AssetService = m_assetCache; // imgrequest2.AgentID = m_client.AgentId; // imgrequest2.InventoryAccessModule = m_client.Scene.RequestModuleInterface<IInventoryAccessModule>(); // imgrequest2.DiscardLevel = newRequest.DiscardLevel; // imgrequest2.StartPacket = Math.Max(1, newRequest.PacketNumber); // imgrequest2.Priority = newRequest.Priority; // imgrequest2.TextureID = newRequest.RequestedAssetID; // imgrequest2.Priority = newRequest.Priority; // // //Add this download to the priority queue // AddImageToQueue(imgrequest2); // // imgrequest2.RunUpdate(); } // else // { // m_log.DebugFormat( // "[LL IMAGE MANAGER]: Ignoring duplicate of existing request for {0} (sequence {1}) from {2} as its request sequence {3} is not greater", // newRequest.RequestedAssetID, imgrequest.LastSequence, m_client.Name, newRequest.requestSequence); // } } } else { if (newRequest.DiscardLevel < 0) { //m_log.DebugFormat("[TEX]: (IGN) ID={0}: D={1}, S={2}, P={3}", // newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority); } else { // m_log.DebugFormat( // "[LL IMAGE MANAGER]: Received request for {0}, start packet {1} from {2}", // newRequest.RequestedAssetID, newRequest.PacketNumber, m_client.Name); //m_log.DebugFormat("[TEX]: (NEW) ID={0}: D={1}, S={2}, P={3}", // newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority); imgrequest = new J2KImage(this); imgrequest.J2KDecoder = m_j2kDecodeModule; imgrequest.AssetService = m_assetCache; imgrequest.AgentID = Client.AgentId; imgrequest.InventoryAccessModule = Client.Scene.RequestModuleInterface <IInventoryAccessModule>(); imgrequest.DiscardLevel = newRequest.DiscardLevel; imgrequest.StartPacket = Math.Max(1, newRequest.PacketNumber); imgrequest.Priority = newRequest.Priority; imgrequest.TextureID = newRequest.RequestedAssetID; imgrequest.Priority = newRequest.Priority; //Add this download to the priority queue AddImageToQueue(imgrequest); imgrequest.RunUpdate(); } } } }