diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp index 8758895b903f2d61ea68d0f27d1817aed290dfa0..55e67715d93551d0f93385c1040f1b45fa0defa4 100644 --- a/indra/llplugin/llpluginprocessparent.cpp +++ b/indra/llplugin/llpluginprocessparent.cpp @@ -315,19 +315,24 @@ void LLPluginProcessParent::idle(void) do { // process queued messages - mIncomingQueueMutex.lock(); - while(!mIncomingQueue.empty()) + if (!mIncomingQueue.empty()) { - LLPluginMessage message = mIncomingQueue.front(); - mIncomingQueue.pop(); - mIncomingQueueMutex.unlock(); - - receiveMessage(message); - - mIncomingQueueMutex.lock(); - } + LLMutexTrylock locked_mtx(&mIncomingQueueMutex); + if (locked_mtx.isLocked()) + { + if (!mIncomingQueue.empty()) + { + std::deque<LLPluginMessage> local_queue; + local_queue.swap(mIncomingQueue); + + for(const auto& message : local_queue) + { + receiveMessage(message); + } + } + } - mIncomingQueueMutex.unlock(); + } // Give time to network processing if(mMessagePipe) @@ -870,10 +875,9 @@ void LLPluginProcessParent::poll(F64 timeout) if (that) { - that->mIncomingQueueMutex.lock(); + LLMutexLock incoming_lock(&that->mIncomingQueueMutex); that->servicePoll(); - that->mIncomingQueueMutex.unlock(); - } + } } } @@ -978,7 +982,7 @@ void LLPluginProcessParent::receiveMessageEarly(const LLPluginMessage &message) if(!handled) { // any message that wasn't handled early needs to be queued. - mIncomingQueue.push(message); + mIncomingQueue.push_back(message); } } diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h index 5dafac64b321ce78bb740c0b036b9b6530cdac3b..b2ac59774e0bbc29265e671da5315ee3d8001970 100644 --- a/indra/llplugin/llpluginprocessparent.h +++ b/indra/llplugin/llpluginprocessparent.h @@ -210,7 +210,7 @@ class LLPluginProcessParent : public LLPluginMessagePipeOwner bool pollTick(); LLMutex mIncomingQueueMutex; - std::queue<LLPluginMessage> mIncomingQueue; + std::deque<LLPluginMessage> mIncomingQueue; }; #endif // LL_LLPLUGINPROCESSPARENT_H