diff options
author | Josh Blum | 2013-05-11 14:19:51 -0700 |
---|---|---|
committer | Josh Blum | 2013-05-11 14:19:51 -0700 |
commit | 476e5e7f8c949251436646dfd155cdd4430c37f2 (patch) | |
tree | 80e997c6bba4b58d4f4b5add12e362af07afb2e4 /lib/thread_pool.cpp | |
parent | 121a609ed2cadd50e5e85093e2ac524bdd279d02 (diff) | |
download | sandhi-476e5e7f8c949251436646dfd155cdd4430c37f2.tar.gz sandhi-476e5e7f8c949251436646dfd155cdd4430c37f2.tar.bz2 sandhi-476e5e7f8c949251436646dfd155cdd4430c37f2.zip |
gras: added thread prio support hooks
Diffstat (limited to 'lib/thread_pool.cpp')
-rw-r--r-- | lib/thread_pool.cpp | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/lib/thread_pool.cpp b/lib/thread_pool.cpp new file mode 100644 index 0000000..cd5c320 --- /dev/null +++ b/lib/thread_pool.cpp @@ -0,0 +1,57 @@ +// Copyright (C) by Josh Blum. See LICENSE.txt for licensing information. + +#include <gras/thread_pool.hpp> +#include <boost/thread/thread.hpp> +#include <Theron/EndPoint.h> +#include <Theron/Framework.h> +#include <stdexcept> + +using namespace gras; + +ThreadPoolConfig::ThreadPoolConfig(void) +{ + thread_count = boost::thread::hardware_concurrency(); + thread_count = std::max(size_t(2), thread_count); + node_mask = 0; + processor_mask = 0xffffffff; + yield_strategy = "BLOCKING"; + thread_priority = 0.0f; + + //environment variable override + const char * gras_yield = getenv("GRAS_YIELD"); + if (gras_yield != NULL) yield_strategy = gras_yield; +} + +/*********************************************************************** + * Thread pool implementation + **********************************************************************/ +ThreadPool::ThreadPool(void) +{ + //NOP +} + +ThreadPool::ThreadPool(boost::weak_ptr<Theron::Framework> p): + boost::shared_ptr<Theron::Framework>(p.lock()) +{ + //NOP +} + +ThreadPool::ThreadPool(const ThreadPoolConfig &config) +{ + Theron::Framework::Parameters params( + config.thread_count, + config.node_mask, + config.processor_mask + ); + + if (config.yield_strategy.empty()) params.mYieldStrategy = Theron::YIELD_STRATEGY_STRONG; + else if (config.yield_strategy == "BLOCKING") params.mYieldStrategy = Theron::YIELD_STRATEGY_BLOCKING; + else if (config.yield_strategy == "POLITE") params.mYieldStrategy = Theron::YIELD_STRATEGY_POLITE; + else if (config.yield_strategy == "STRONG") params.mYieldStrategy = Theron::YIELD_STRATEGY_STRONG; + else if (config.yield_strategy == "AGGRESSIVE") params.mYieldStrategy = Theron::YIELD_STRATEGY_AGGRESSIVE; + else throw std::runtime_error("gras::ThreadPoolConfig yield_strategy unknown: " + config.yield_strategy); + + params.mThreadPriority = config.thread_priority; + + this->reset(new Theron::Framework(Theron::Framework::Parameters(params))); +} |