summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/gnuradio/thread_pool.hpp41
-rw-r--r--lib/block_actor.cpp38
2 files changed, 54 insertions, 25 deletions
diff --git a/include/gnuradio/thread_pool.hpp b/include/gnuradio/thread_pool.hpp
index c0adc1c..d34c161 100644
--- a/include/gnuradio/thread_pool.hpp
+++ b/include/gnuradio/thread_pool.hpp
@@ -20,6 +20,7 @@
#include <gnuradio/gras.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
+#include <string>
//! ThreadPool is an unexposed Theron Framework
//! Forward declare the Framwork for c++ users
@@ -31,6 +32,38 @@ namespace Theron
namespace gnuradio
{
+struct GRAS_API ThreadPoolConfig
+{
+ ThreadPoolConfig(void);
+
+ /*!
+ * The initial number of worker threads to create within the framework.
+ * Default is the number of CPUs on the system.
+ */
+ size_t thread_count;
+
+ /*!
+ * Specifies the NUMA processor nodes upon which the framework may execute.
+ * Default is all NUMA nodes on the system.
+ */
+ size_t node_mask;
+
+ /*!
+ * Specifies the subset of the processors in each NUMA processor node upon which the framework may execute.
+ * Default is all CPUs per NUMA node.
+ */
+ size_t processor_mask;
+
+ /*!
+ * Yield strategy employed by the worker threads in the framework.
+ * POLITE, ///< Threads go to sleep when not in use.
+ * STRONG, ///< Threads yield to other threads but don't go to sleep.
+ * AGGRESSIVE ///< Threads never yield to other threads.
+ * Default is STRONG.
+ */
+ std::string yield_strategy;
+};
+
/*!
* Thread Pool is is a this wrapper of Theron Framework, see link for more details:
* http://docs.theron-library.com/5.00/structTheron_1_1Framework_1_1Parameters.html
@@ -44,13 +77,7 @@ struct GRAS_API ThreadPool : boost::shared_ptr<Theron::Framework>
ThreadPool(boost::weak_ptr<Theron::Framework> p);
//! Create a new thread pool with parameters
- ThreadPool(const unsigned long threadCount);
-
- //! Create a new thread pool with parameters
- ThreadPool(const unsigned long threadCount, const unsigned long nodeMask);
-
- //! Create a new thread pool with parameters
- ThreadPool(const unsigned long threadCount, const unsigned long nodeMask, const unsigned long processorMask);
+ ThreadPool(const ThreadPoolConfig &config);
/*!
* When a block is created, it will execute in the active pool.
diff --git a/lib/block_actor.cpp b/lib/block_actor.cpp
index e522624..108e7d3 100644
--- a/lib/block_actor.cpp
+++ b/lib/block_actor.cpp
@@ -21,6 +21,15 @@
using namespace gnuradio;
+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 = "STRONG";
+}
+
/***********************************************************************
* Thread pool implementation
**********************************************************************/
@@ -35,26 +44,19 @@ ThreadPool::ThreadPool(boost::weak_ptr<Theron::Framework> p):
//NOP
}
-const size_t default_concurrency(void)
-{
- const size_t n = boost::thread::hardware_concurrency();
- return std::max(size_t(2), n);
-}
-
-ThreadPool::ThreadPool(unsigned long threadCount)
+ThreadPool::ThreadPool(const ThreadPoolConfig &config)
{
- if (threadCount == 0) threadCount = default_concurrency();
- this->reset(new Theron::Framework(Theron::Framework::Parameters(threadCount, 0)));
-}
+ Theron::Framework::Parameters params(
+ config.thread_count,
+ config.node_mask,
+ config.processor_mask
+ );
-ThreadPool::ThreadPool(const unsigned long threadCount, const unsigned long nodeMask)
-{
- this->reset(new Theron::Framework(Theron::Framework::Parameters(threadCount, nodeMask)));
-}
+ if (config.yield_strategy == "POLITE") params.mYieldStrategy = Theron::Framework::YIELD_STRATEGY_POLITE;
+ if (config.yield_strategy == "STRONG") params.mYieldStrategy = Theron::Framework::YIELD_STRATEGY_STRONG;
+ if (config.yield_strategy == "AGGRESSIVE") params.mYieldStrategy = Theron::Framework::YIELD_STRATEGY_AGGRESSIVE;
-ThreadPool::ThreadPool(const unsigned long threadCount, const unsigned long nodeMask, const unsigned long processorMask)
-{
- this->reset(new Theron::Framework(Theron::Framework::Parameters(threadCount, nodeMask, processorMask)));
+ this->reset(new Theron::Framework(Theron::Framework::Parameters(params)));
}
/***********************************************************************
@@ -73,7 +75,7 @@ static ThreadPool get_active_thread_pool(void)
{
if (not weak_framework.lock())
{
- active_thread_pool = ThreadPool(0);
+ active_thread_pool = ThreadPool(ThreadPoolConfig());
active_thread_pool.set_active();
std::cout << "Created default thread pool with " << active_thread_pool->GetNumThreads() << " threads." << std::endl;
}