diff options
Diffstat (limited to 'indra/newview/llmediadataclient.h')
-rwxr-xr-x | indra/newview/llmediadataclient.h | 168 |
1 files changed, 114 insertions, 54 deletions
diff --git a/indra/newview/llmediadataclient.h b/indra/newview/llmediadataclient.h index 9504a0a2a9..3961442412 100755 --- a/indra/newview/llmediadataclient.h +++ b/indra/newview/llmediadataclient.h @@ -34,7 +34,7 @@ #define LL_LLMEDIADATACLIENT_H #include "llhttpclient.h" -#include <queue> +#include <set> #include "llrefcount.h" #include "llpointer.h" #include "lleventtimer.h" @@ -48,6 +48,8 @@ public: virtual U8 getMediaDataCount() const = 0; // Get the media data at index, as an LLSD virtual LLSD getMediaDataLLSD(U8 index) const = 0; + // Return true if the current URL for the face in the media data matches the specified URL. + virtual bool isCurrentMediaUrl(U8 index, const std::string &url) const = 0; // Get this object's UUID virtual LLUUID getID() const = 0; // Navigate back to previous URL @@ -96,16 +98,16 @@ public: F32 getRetryTimerDelay() const { return mRetryTimerDelay; } // Returns true iff the queue is empty - bool isEmpty() const; + virtual bool isEmpty() const; // Returns true iff the given object is in the queue - bool isInQueue(const LLMediaDataClientObject::ptr_t &object); + virtual bool isInQueue(const LLMediaDataClientObject::ptr_t &object); // Remove the given object from the queue. Returns true iff the given object is removed. - bool removeFromQueue(const LLMediaDataClientObject::ptr_t &object); + virtual void removeFromQueue(const LLMediaDataClientObject::ptr_t &object); // Called only by the Queue timer and tests (potentially) - bool processQueueTimer(); + virtual bool processQueueTimer(); protected: // Destructor @@ -122,6 +124,8 @@ protected: // and must create the correct type of responder. virtual Responder *createResponder() = 0; + virtual std::string getURL() { return ""; } + enum Type { GET, UPDATE, @@ -131,15 +135,14 @@ protected: protected: // The only way to create one of these is through a subclass. - Request(Type in_type, LLMediaDataClientObject *obj, LLMediaDataClient *mdc); + Request(Type in_type, LLMediaDataClientObject *obj, LLMediaDataClient *mdc, S32 face = -1); public: LLMediaDataClientObject *getObject() const { return mObject; } U32 getNum() const { return mNum; } U32 getRetryCount() const { return mRetryCount; } - void incRetryCount() { mRetryCount++; }; - Type getType() const { return mType; }; - bool isMarkedSent() const { return mMarkedSent; } + void incRetryCount() { mRetryCount++; } + Type getType() const { return mType; } F64 getScore() const { return mScore; } // Note: may return empty string! @@ -153,13 +156,26 @@ protected: F32 getRetryTimerDelay() const; U32 getMaxNumRetries() const; - bool isNew() const { return mObject.notNull() ? mObject->isNew() : false; } - bool isObjectValid() const { return mObject.notNull() ? (!mObject->isDead()) : false; } - void markSent(bool flag); + bool isObjectValid() const { return mObject.notNull() && (!mObject->isDead()); } + bool isNew() const { return isObjectValid() && mObject->isNew(); } void updateScore(); + void markDead(); + bool isDead(); + void startTracking(); + void stopTracking(); + friend std::ostream& operator<<(std::ostream &s, const Request &q); - + + const LLUUID &getID() const { return mObjectID; } + S32 getFace() const { return mFace; } + + bool isMatch (const Request* other, Type match_type = ANY) const + { + return ((match_type == ANY) || (mType == other->mType)) && + (mFace == other->mFace) && + (mObjectID == other->mObjectID); + } protected: LLMediaDataClientObject::ptr_t mObject; private: @@ -169,7 +185,9 @@ protected: static U32 sNum; U32 mRetryCount; F64 mScore; - bool mMarkedSent; + + LLUUID mObjectID; + S32 mFace; // Back pointer to the MDC...not a ref! LLMediaDataClient *mMDC; @@ -189,39 +207,63 @@ protected: request_ptr_t &getRequest() { return mRequest; } private: + request_ptr_t mRequest; + }; - class RetryTimer : public LLEventTimer - { - public: - RetryTimer(F32 time, Responder *); - virtual BOOL tick(); - private: - // back-pointer - boost::intrusive_ptr<Responder> mResponder; - }; - + class RetryTimer : public LLEventTimer + { + public: + RetryTimer(F32 time, request_ptr_t); + virtual BOOL tick(); + private: + // back-pointer request_ptr_t mRequest; }; + protected: + typedef std::list<request_ptr_t> request_queue_t; + typedef std::set<request_ptr_t> request_set_t; // Subclasses must override to return a cap name virtual const char *getCapabilityName() const = 0; + + // Puts the request into a queue, appropriately handling duplicates, etc. + virtual void enqueue(Request*) = 0; - virtual bool request_needs_purge(request_ptr_t request); - virtual void sortQueue(); virtual void serviceQueue(); - virtual void enqueue(Request*); + virtual request_queue_t *getQueue() { return &mQueue; }; + + // Gets the next request, removing it from the queue + virtual request_ptr_t dequeue(); -private: - typedef std::list<request_ptr_t> request_queue_t; + virtual bool canServiceRequest(request_ptr_t request) { return true; }; + + // Returns a request to the head of the queue (should only be used for requests that came from dequeue + virtual void pushBack(request_ptr_t request); - // Return whether the given object is/was in the queue - static LLMediaDataClient::request_ptr_t findOrRemove(request_queue_t &queue, const LLMediaDataClientObject::ptr_t &obj, bool remove, Request::Type type); + void trackRequest(request_ptr_t request); + void stopTrackingRequest(request_ptr_t request); + + request_queue_t mQueue; + + const F32 mQueueTimerDelay; + const F32 mRetryTimerDelay; + const U32 mMaxNumRetries; + const U32 mMaxSortedQueueSize; + const U32 mMaxRoundRobinQueueSize; + + // Set for keeping track of requests that aren't in either queue. This includes: + // Requests that have been sent and are awaiting a response (pointer held by the Responder) + // Requests that are waiting for their retry timers to fire (pointer held by the retry timer) + request_set_t mUnQueuedRequests; + + void startQueueTimer(); + void stopQueueTimer(); + +private: - // Comparator for sorting - static bool compareRequests(const request_ptr_t &o1, const request_ptr_t &o2); static F64 getObjectScore(const LLMediaDataClientObject::ptr_t &obj); friend std::ostream& operator<<(std::ostream &s, const Request &q); @@ -237,24 +279,10 @@ private: LLPointer<LLMediaDataClient> mMDC; }; - void startQueueTimer(); - void stopQueueTimer(); void setIsRunning(bool val) { mQueueTimerIsRunning = val; } - - void swapCurrentQueue(); - request_queue_t *getCurrentQueue(); - - const F32 mQueueTimerDelay; - const F32 mRetryTimerDelay; - const U32 mMaxNumRetries; - const U32 mMaxSortedQueueSize; - const U32 mMaxRoundRobinQueueSize; - + bool mQueueTimerIsRunning; - - request_queue_t mSortedQueue; - request_queue_t mRoundRobinQueue; - bool mCurrentQueueIsTheSortedQueue; + }; @@ -262,14 +290,15 @@ private: class LLObjectMediaDataClient : public LLMediaDataClient { public: + LOG_CLASS(LLObjectMediaDataClient); LLObjectMediaDataClient(F32 queue_timer_delay = QUEUE_TIMER_DELAY, F32 retry_timer_delay = UNAVAILABLE_RETRY_TIMER_DELAY, U32 max_retries = MAX_RETRIES, U32 max_sorted_queue_size = MAX_SORTED_QUEUE_SIZE, U32 max_round_robin_queue_size = MAX_ROUND_ROBIN_QUEUE_SIZE) - : LLMediaDataClient(queue_timer_delay, retry_timer_delay, max_retries) + : LLMediaDataClient(queue_timer_delay, retry_timer_delay, max_retries), + mCurrentQueueIsTheSortedQueue(true) {} - virtual ~LLObjectMediaDataClient() {} void fetchMedia(LLMediaDataClientObject *object); void updateMedia(LLMediaDataClientObject *object); @@ -289,11 +318,29 @@ public: /*virtual*/ LLSD getPayload() const; /*virtual*/ Responder *createResponder(); }; + + // Returns true iff the queue is empty + virtual bool isEmpty() const; + + // Returns true iff the given object is in the queue + virtual bool isInQueue(const LLMediaDataClientObject::ptr_t &object); + // Remove the given object from the queue. Returns true iff the given object is removed. + virtual void removeFromQueue(const LLMediaDataClientObject::ptr_t &object); + + virtual bool processQueueTimer(); + + virtual bool canServiceRequest(request_ptr_t request); + protected: // Subclasses must override to return a cap name virtual const char *getCapabilityName() const; - + + virtual request_queue_t *getQueue(); + + // Puts the request into the appropriate queue + virtual void enqueue(Request*); + class Responder : public LLMediaDataClient::Responder { public: @@ -301,6 +348,16 @@ protected: : LLMediaDataClient::Responder(request) {} virtual void result(const LLSD &content); }; +private: + // The Get/Update data client needs a second queue to avoid object updates starving load-ins. + void swapCurrentQueue(); + + request_queue_t mRoundRobinQueue; + bool mCurrentQueueIsTheSortedQueue; + + // Comparator for sorting + static bool compareRequestScores(const request_ptr_t &o1, const request_ptr_t &o2); + void sortQueue(); }; @@ -308,6 +365,7 @@ protected: class LLObjectMediaNavigateClient : public LLMediaDataClient { public: + LOG_CLASS(LLObjectMediaNavigateClient); // NOTE: from llmediaservice.h static const int ERROR_PERMISSION_DENIED_CODE = 8002; @@ -318,18 +376,20 @@ public: U32 max_round_robin_queue_size = MAX_ROUND_ROBIN_QUEUE_SIZE) : LLMediaDataClient(queue_timer_delay, retry_timer_delay, max_retries) {} - virtual ~LLObjectMediaNavigateClient() {} void navigate(LLMediaDataClientObject *object, U8 texture_index, const std::string &url); + // Puts the request into the appropriate queue + virtual void enqueue(Request*); + class RequestNavigate: public Request { public: RequestNavigate(LLMediaDataClientObject *obj, LLMediaDataClient *mdc, U8 texture_index, const std::string &url); /*virtual*/ LLSD getPayload() const; /*virtual*/ Responder *createResponder(); + /*virtual*/ std::string getURL() { return mURL; } private: - U8 mTextureIndex; std::string mURL; }; |