void LLMediaDataClient::enqueue(const Request *request) { if (request->isNew()) { // Add to sorted queue if (LLMediaDataClient::findOrRemove(mSortedQueue, request->getObject(), true/*remove*/, request->getType()).notNull()) { LL_DEBUGS("LLMediaDataClient") << "REMOVING OLD request for " << *request << " ALREADY THERE!" << LL_ENDL; } LL_DEBUGS("LLMediaDataClient") << "Queuing SORTED request for " << *request << LL_ENDL; // Sadly, we have to const-cast because items put into the queue are not const mSortedQueue.push_back(const_cast<LLMediaDataClient::Request*>(request)); LL_DEBUGS("LLMediaDataClientQueue") << "SORTED queue:" << mSortedQueue << LL_ENDL; } else { if (mRoundRobinQueue.size() > mMaxRoundRobinQueueSize) { LL_INFOS_ONCE("LLMediaDataClient") << "RR QUEUE MAXED OUT!!!" << LL_ENDL; LL_DEBUGS("LLMediaDataClient") << "Not queuing " << *request << LL_ENDL; return; } // ROUND ROBIN: if it is there, and it is a GET request, leave it. If not, put at front! request_ptr_t existing_request; if (request->getType() == Request::GET) { existing_request = LLMediaDataClient::findOrRemove(mRoundRobinQueue, request->getObject(), false/*remove*/, request->getType()); } if (existing_request.isNull()) { LL_DEBUGS("LLMediaDataClient") << "Queuing RR request for " << *request << LL_ENDL; // Push the request on the pending queue // Sadly, we have to const-cast because items put into the queue are not const mRoundRobinQueue.push_front(const_cast<LLMediaDataClient::Request*>(request)); LL_DEBUGS("LLMediaDataClientQueue") << "RR queue:" << mRoundRobinQueue << LL_ENDL; } else { LL_DEBUGS("LLMediaDataClient") << "ALREADY THERE: NOT Queuing request for " << *request << LL_ENDL; existing_request->markSent(false); } } // Start the timer if not already running startQueueTimer(); }
void LLObjectMediaNavigateClient::enqueue(Request *request) { if(request->isDead()) { LL_DEBUGS("LLMediaDataClient") << "not queueing dead request " << *request << LL_ENDL; return; } // If there's already a matching request in the queue, remove it. request_queue_t::iterator iter = find_matching_request(mQueue, request); if(iter != mQueue.end()) { LL_DEBUGS("LLMediaDataClient") << "removing matching queued request " << (**iter) << LL_ENDL; mQueue.erase(iter); } else { request_set_t::iterator set_iter = find_matching_request(mUnQueuedRequests, request); if(set_iter != mUnQueuedRequests.end()) { LL_DEBUGS("LLMediaDataClient") << "removing matching unqueued request " << (**set_iter) << LL_ENDL; mUnQueuedRequests.erase(set_iter); } } #if 0 // Sadly, this doesn't work. It ends up creating a race condition when the user navigates and then hits the "back" button // where the navigate-back appears to be spurious and doesn't get broadcast. if(request->getObject()->isCurrentMediaUrl(request->getFace(), request->getURL())) { // This navigate request is trying to send the face to the current URL. Drop it. LL_DEBUGS("LLMediaDataClient") << "dropping spurious request " << (*request) << LL_ENDL; } else #endif { LL_DEBUGS("LLMediaDataClient") << "queueing new request " << (*request) << LL_ENDL; mQueue.push_back(request); // Start the timer if not already running startQueueTimer(); } }
void LLObjectMediaDataClient::enqueue(Request *request) { if(request->isDead()) { LL_DEBUGS("LLMediaDataClient") << "not queueing dead request " << *request << LL_ENDL; return; } // Invariants: // new requests always go into the sorted queue. // bool is_new = request->isNew(); if(!is_new && (request->getType() == Request::GET)) { // For GET requests that are not new, if a matching request is already in the round robin queue, // in flight, or being retried, leave it at its current position. request_queue_t::iterator iter = find_matching_request(mRoundRobinQueue, request->getID(), Request::GET); request_set_t::iterator iter2 = find_matching_request(mUnQueuedRequests, request->getID(), Request::GET); if( (iter != mRoundRobinQueue.end()) || (iter2 != mUnQueuedRequests.end()) ) { LL_DEBUGS("LLMediaDataClient") << "ALREADY THERE: NOT Queuing request for " << *request << LL_ENDL; return; } } // TODO: should an UPDATE cause pending GET requests for the same object to be removed from the queue? // IF the update will cause an object update message to be sent out at some point in the future, it probably should. // Remove any existing requests of this type for this object remove_matching_requests(mQueue, request->getID(), request->getType()); remove_matching_requests(mRoundRobinQueue, request->getID(), request->getType()); remove_matching_requests(mUnQueuedRequests, request->getID(), request->getType()); if (is_new) { LL_DEBUGS("LLMediaDataClient") << "Queuing SORTED request for " << *request << LL_ENDL; mQueue.push_back(request); LL_DEBUGS("LLMediaDataClientQueue") << "SORTED queue:" << mQueue << LL_ENDL; } else { if (mRoundRobinQueue.size() > mMaxRoundRobinQueueSize) { LL_INFOS_ONCE("LLMediaDataClient") << "RR QUEUE MAXED OUT!!!" << LL_ENDL; LL_DEBUGS("LLMediaDataClient") << "Not queuing " << *request << LL_ENDL; return; } LL_DEBUGS("LLMediaDataClient") << "Queuing RR request for " << *request << LL_ENDL; // Push the request on the pending queue mRoundRobinQueue.push_back(request); LL_DEBUGS("LLMediaDataClientQueue") << "RR queue:" << mRoundRobinQueue << LL_ENDL; } // Start the timer if not already running startQueueTimer(); }