summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/gras/block.hpp43
-rw-r--r--include/gras/block_config.hpp159
2 files changed, 174 insertions, 28 deletions
diff --git a/include/gras/block.hpp b/include/gras/block.hpp
index 72ae9b9..f2f1b2b 100644
--- a/include/gras/block.hpp
+++ b/include/gras/block.hpp
@@ -28,9 +28,22 @@ struct GRAS_API Block : Element
virtual ~Block(void);
/*******************************************************************
- * Deal with input and output port configuration
+ * Deal with block configuration configuration
******************************************************************/
+ /*!
+ * Set the thread pool of this block.
+ * Every block is created in the default active thread pool.
+ * This call will migrate the block to a new specified pool.
+ */
+ void set_thread_pool(const ThreadPool &thread_pool);
+
+ //! Get the global block config settings
+ const GlobalBlockConfig &global_config(void) const;
+
+ //! Get the global block config settings
+ GlobalBlockConfig &global_config(void);
+
//! Get the configuration rules of an input port
const InputPortConfig &input_config(const size_t which_input) const;
@@ -380,36 +393,10 @@ struct GRAS_API Block : Element
virtual void notify_topology(const size_t num_inputs, const size_t num_outputs);
/*******************************************************************
- * routines related to affinity and allocation
+ * custom buffer queue API
******************************************************************/
/*!
- * Set the thread pool of this block.
- * Every block is created in the default active thread pool.
- * This call will migrate the block to a new specified pool.
- */
- void set_thread_pool(const ThreadPool &thread_pool);
-
- /*!
- * Set if the work call should be interruptible by stop().
- * Some work implementations block with the expectation of
- * getting a boost thread interrupt in a blocking call.
- * Set set_interruptible_work(true) if this is the case.
- * By default, work implementations are not interruptible.
- */
- void set_interruptible_work(const bool enb);
-
- /*!
- * Set the node affinity of this block.
- * This call affects how output buffers are allocated.
- * By default memory is allocated by malloc.
- * When the affinity is set, virtual memory
- * will be locked to a physical CPU/memory node.
- * \param affinity a memory node on the system
- */
- void set_buffer_affinity(const long affinity);
-
- /*!
* The output buffer allocator method.
* This method is called by the scheduler to allocate output buffers.
* The user may overload this method to create a custom allocator.
diff --git a/include/gras/block_config.hpp b/include/gras/block_config.hpp
new file mode 100644
index 0000000..c026cba
--- /dev/null
+++ b/include/gras/block_config.hpp
@@ -0,0 +1,159 @@
+// Copyright (C) by Josh Blum. See LICENSE.txt for licensing information.
+
+#ifndef INCLUDED_GRAS_BLOCK_CONFIG_HPP
+#define INCLUDED_GRAS_BLOCK_CONFIG_HPP
+
+#include <gras/gras.hpp>
+#include <cstddef>
+
+namespace gras
+{
+
+//! Configuration parameters for a block
+struct GRAS_API GlobalBlockConfig
+{
+ GlobalBlockConfig(void);
+
+ /*!
+ * Constrain the maximum number of items that
+ * work can be called with for all output ports.
+ *
+ * Default = 0 aka disabled.
+ */
+ size_t maximum_output_items;
+
+ /*!
+ * Set the global memory node affinity.
+ * Blocks that have not been explicitly set,
+ * will take on this new buffer_affinity.
+ *
+ * This param affects how buffers are allocated.
+ * By default memory is allocated by malloc.
+ * When the affinity is set, virtual memory
+ * will be locked to a physical CPU/memory node.
+ *
+ * Default = -1 aka no affinity.
+ */
+ long buffer_affinity;
+
+ /*!
+ * True if the work call should be interruptible by stop().
+ * Some work implementations block with the expectation of
+ * getting a boost thread interrupt in a blocking call.
+ * If this is the case, this parameter should be set true.
+ * By default, work implementations are not interruptible.
+ *
+ * Default = false.
+ */
+ bool interruptible_work;
+};
+
+//! Configuration parameters for an input port
+struct GRAS_API InputPortConfig
+{
+ InputPortConfig(void);
+
+ //! The size of an item in bytes
+ size_t item_size;
+
+ /*!
+ * Set an input reserve requirement such that work is called
+ * with an input buffer at least reserve items in size.
+ *
+ * Default = 1.
+ */
+ size_t reserve_items;
+
+ /*!
+ * Constrain the input buffer allocation size:
+ * The scheduler may accumulate multiple buffers
+ * into a single larger buffer under failure conditions.
+ * The maximum size of this accumulated buffer
+ * is constrained by this maximum_items setting.
+ *
+ * Default = 0 aka disabled.
+ */
+ size_t maximum_items;
+
+ /*!
+ * Set buffer inlining for this port config.
+ * Inlining means that the input buffer can be used as an output buffer.
+ * The goal is to make better use of cache and memory bandwidth.
+ *
+ * By default, inlining is disabled on all input ports.
+ * The user should enable inlining on an input port
+ * when it is understood that the work function will read
+ * before writting to a particular section of the buffer.
+ *
+ * The scheduler will inline a buffer when
+ * * inlining is enabled on the particular input port
+ * * block holds the only buffer reference aka unique
+ * * the input buffer has the same affinity as the block
+ * * the input port has a buffer look-ahead of 0
+ *
+ * Default = false.
+ */
+ bool inline_buffer;
+
+ /*!
+ * Preload the input queue with num preload items.
+ * All items preloaded into the buffer will be 0.
+ * This is used to implement zero-padding for
+ * things like sliding dot products/FIR filters.
+ *
+ * - Increasing the preload at runtime will
+ * inject more items into the input queue.
+ * - Decreasing the preload at runtime will
+ * consume random items from the input queue.
+ *
+ * Default = 0.
+ */
+ size_t preload_items;
+
+ /*!
+ * Force this block done when input port is done.
+ * When the upstream feeding this port declares done,
+ * this block will mark done once upstream notifies.
+ * The primary usage is to modify the done logic
+ * for the purposes of unit test confiruability.
+ *
+ * If the force done option is false, the block will
+ * not mark done when this port's upstream is done.
+ * However, this block will mark done when all
+ * input ports are done, reguardless of this setting.
+ *
+ * Default = true.
+ */
+ bool force_done;
+};
+
+//! Configuration parameters for an output port
+struct GRAS_API OutputPortConfig
+{
+ OutputPortConfig(void);
+
+ //! The size of an item in bytes
+ size_t item_size;
+
+ /*!
+ * Set an output reserve requirement such that work is called
+ * with an output buffer at least reserve items in size.
+ *
+ * Default = 1.
+ */
+ size_t reserve_items;
+
+ /*!
+ * Constrain the output buffer allocation size:
+ * The user might set a small maximum items
+ * to reduce the amount of buffered items
+ * waiting for processing in downstream queues.
+ *
+ * Default = 0 aka disabled.
+ */
+ size_t maximum_items;
+};
+
+} //namespace gras
+
+#endif /*INCLUDED_GRAS_BLOCK_CONFIG_HPP*/