diff options
author | Brad Kittenbrink <brad@lindenlab.com> | 2019-03-14 11:55:42 -0700 |
---|---|---|
committer | Nat Goodspeed <nat@lindenlab.com> | 2020-03-25 18:39:21 -0400 |
commit | b09aa6a2bf2f908ff890b920149976e04fd420db (patch) | |
tree | 1062343d31db51a82cb0212fe22b0696ceb15c7b /indra | |
parent | 997bdfc88682de36f02931a22d3baa23f00b6ddb (diff) |
Improved shutdown behavior of LLCoprocedureManager
Diffstat (limited to 'indra')
-rw-r--r-- | indra/llmessage/llcoproceduremanager.cpp | 68 | ||||
-rw-r--r-- | indra/llmessage/llcoproceduremanager.h | 6 |
2 files changed, 20 insertions, 54 deletions
diff --git a/indra/llmessage/llcoproceduremanager.cpp b/indra/llmessage/llcoproceduremanager.cpp index 9501181509..1b82cb8c99 100644 --- a/indra/llmessage/llcoproceduremanager.cpp +++ b/indra/llmessage/llcoproceduremanager.cpp @@ -26,12 +26,17 @@ */ #include "linden_common.h" + #include "llcoproceduremanager.h" -#include "llexception.h" -#include "stringize.h" + +#include <chrono> + #include <boost/assign.hpp> #include <boost/fiber/unbuffered_channel.hpp> +#include "llexception.h" +#include "stringize.h" + //========================================================================= // Map of pool sizes for known pools static const std::map<std::string, U32> DefaultPoolSizes = @@ -65,10 +70,6 @@ public: /// If it has not yet been dequeued it is simply removed from the queue. //bool cancelCoprocedure(const LLUUID &id); - /// Requests a shutdown of the upload manager. Passing 'true' will perform - /// an immediate kill on the upload coroutine. - //void shutdown(bool hardShutdown = false); - // /// Returns the number of coprocedures in the queue awaiting processing. // /// // inline size_t countPending() const @@ -136,7 +137,10 @@ LLCoprocedureManager::LLCoprocedureManager() LLCoprocedureManager::~LLCoprocedureManager() { - + for(auto & poolEntry : mPoolMap) + { + poolEntry.second->close(); + } } LLCoprocedureManager::poolPtr_t LLCoprocedureManager::initializePool(const std::string &poolName) @@ -200,17 +204,6 @@ LLUUID LLCoprocedureManager::enqueueCoprocedure(const std::string &pool, const s // LL_INFOS() << "Coprocedure not found." << LL_ENDL; //} -/*==========================================================================*| -void LLCoprocedureManager::shutdown(bool hardShutdown) -{ - for (poolMap_t::const_iterator it = mPoolMap.begin(); it != mPoolMap.end(); ++it) - { - (*it).second->shutdown(hardShutdown); - } - mPoolMap.clear(); -} -|*==========================================================================*/ - void LLCoprocedureManager::setPropertyMethods(SettingQuery_t queryfn, SettingUpdate_t updatefn) { mPropertyQueryFn = queryfn; @@ -310,36 +303,9 @@ LLCoprocedurePool::LLCoprocedurePool(const std::string &poolName, size_t size): LLCoprocedurePool::~LLCoprocedurePool() { -/*==========================================================================*| - shutdown(); -|*==========================================================================*/ } //------------------------------------------------------------------------- -/*==========================================================================*| -void LLCoprocedurePool::shutdown(bool hardShutdown) -{ - CoroAdapterMap_t::iterator it; - - for (it = mCoroMapping.begin(); it != mCoroMapping.end(); ++it) - { - if (hardShutdown) - { - LLCoros::instance().kill((*it).first); - } - if ((*it).second) - { - (*it).second->cancelSuspendedOperation(); - } - } - - mShutdown = true; - mCoroMapping.clear(); - mPendingCoprocs.clear(); -} -|*==========================================================================*/ - -//------------------------------------------------------------------------- LLUUID LLCoprocedurePool::enqueueCoprocedure(const std::string &name, LLCoprocedurePool::CoProcedure_t proc) { LLUUID id(LLUUID::generateNewID()); @@ -379,11 +345,17 @@ LLUUID LLCoprocedurePool::enqueueCoprocedure(const std::string &name, LLCoproced //------------------------------------------------------------------------- void LLCoprocedurePool::coprocedureInvokerCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter) { - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - QueuedCoproc::ptr_t coproc; - while (mPendingCoprocs.pop(coproc) != boost::fibers::channel_op_status::closed) + boost::fibers::channel_op_status status; + using namespace std::chrono_literals; + while ((status = mPendingCoprocs.pop_wait_for(coproc, 10s)) != boost::fibers::channel_op_status::closed) { + if(status == boost::fibers::channel_op_status::timeout) + { + LL_INFOS() << "pool '" << mPoolName << "' stalled." << LL_ENDL; + continue; + } + ActiveCoproc_t::iterator itActive = mActiveCoprocs.insert(ActiveCoproc_t::value_type(coproc->mId, httpAdapter)).first; LL_INFOS() << "Dequeued and invoking coprocedure(" << coproc->mName << ") with id=" << coproc->mId.asString() << " in pool \"" << mPoolName << "\"" << LL_ENDL; diff --git a/indra/llmessage/llcoproceduremanager.h b/indra/llmessage/llcoproceduremanager.h index 93d699a714..299ec6742f 100644 --- a/indra/llmessage/llcoproceduremanager.h +++ b/indra/llmessage/llcoproceduremanager.h @@ -59,12 +59,6 @@ public: /// If it has not yet been dequeued it is simply removed from the queue. //void cancelCoprocedure(const LLUUID &id); -/*==========================================================================*| - /// Requests a shutdown of the upload manager. Passing 'true' will perform - /// an immediate kill on the upload coroutine. - void shutdown(bool hardShutdown = false); -|*==========================================================================*/ - void setPropertyMethods(SettingQuery_t queryfn, SettingUpdate_t updatefn); /// Returns the number of coprocedures in the queue awaiting processing. |