diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llcommon/workqueue.h | 6 | ||||
| -rw-r--r-- | indra/llrender/llimagegl.cpp | 17 | ||||
| -rw-r--r-- | indra/llrender/llimagegl.h | 2 | 
3 files changed, 24 insertions, 1 deletions
| diff --git a/indra/llcommon/workqueue.h b/indra/llcommon/workqueue.h index b88aef989a..5ec790da79 100644 --- a/indra/llcommon/workqueue.h +++ b/indra/llcommon/workqueue.h @@ -94,6 +94,12 @@ namespace LL          void postEvery(const std::chrono::duration<Rep, Period>& interval,                         CALLABLE&& callable); +        template <typename CALLABLE> +        bool tryPost(CALLABLE&& callable) +        { +            return mQueue.tryPush(TimedWork(TimePoint::clock::now(), std::move(callable))); +        } +          /*------------------------- handshake API --------------------------*/          /** diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 09b1c71f02..cbc5392882 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -2288,7 +2288,10 @@ bool LLImageGLThread::postCallback(const std::function<void()>& callback)  {      try      { -        mCallbackQueue.post(callback); +        if (!mCallbackQueue.tryPost(callback)) +        { +            mPendingCallbackQ.push(callback); +        }      }      catch (LLThreadSafeQueueInterrupt e)      { @@ -2304,6 +2307,18 @@ void LLImageGLThread::executeCallbacks()      LL_PROFILE_ZONE_SCOPED;      //executed from main thread      mCallbackQueue.runPending(); + +    while (!mPendingCallbackQ.empty()) +    { +        if (mCallbackQueue.tryPost(mPendingCallbackQ.front())) +        { +            mPendingCallbackQ.pop(); +        } +        else +        { +            break; +        } +    }  }  void LLImageGLThread::run() diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h index 95b60bd0bd..8264e4a5f2 100644 --- a/indra/llrender/llimagegl.h +++ b/indra/llrender/llimagegl.h @@ -332,6 +332,8 @@ public:      void* mContext;      LLAtomicBool mFinished; +    std::queue<std::function<void()>> mPendingCallbackQ; +      static LLImageGLThread* sInstance;  }; | 
