commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] [gnuradio] 25/28: core: added set_output_alignment (po


From: git
Subject: [Commit-gnuradio] [gnuradio] 25/28: core: added set_output_alignment (policy 2 version)
Date: Mon, 15 Aug 2016 00:47:08 +0000 (UTC)

This is an automated email from the git hooks/post-receive script.

nwest pushed a commit to annotated tag gr_basic_work
in repository gnuradio.

commit 936d56836c53f8f10683af7813de75541d3891ad
Author: Josh Blum <address@hidden>
Date:   Tue Nov 15 13:09:43 2011 -0800

    core: added set_output_alignment (policy 2 version)
---
 gnuradio-core/src/lib/runtime/gr_block.cc          | 10 ++++++++++
 gnuradio-core/src/lib/runtime/gr_block.h           | 13 +++++++++++++
 gnuradio-core/src/lib/runtime/gr_block_executor.cc | 13 +++++++++++++
 3 files changed, 36 insertions(+)

diff --git a/gnuradio-core/src/lib/runtime/gr_block.cc 
b/gnuradio-core/src/lib/runtime/gr_block.cc
index 498c928..0e7de93 100644
--- a/gnuradio-core/src/lib/runtime/gr_block.cc
+++ b/gnuradio-core/src/lib/runtime/gr_block.cc
@@ -34,6 +34,7 @@ gr_block::gr_block (const std::string &name,
                    gr_io_signature_sptr output_signature)
   : gr_basic_block(name, input_signature, output_signature),
     d_output_multiple (1),
+    d_output_alignment (1),
     d_relative_rate (1.0),
     d_history(1),
     d_fixed_rate(false),
@@ -89,6 +90,15 @@ gr_block::set_output_multiple (int multiple)
 }
 
 void
+gr_block::set_output_alignment (int alignment)
+{
+  if (alignment < 1)
+    throw std::invalid_argument ("gr_block::set_output_alignment");
+
+  d_output_alignment = alignment;
+}
+
+void
 gr_block::set_relative_rate (double relative_rate)
 {
   if (relative_rate < 0.0)
diff --git a/gnuradio-core/src/lib/runtime/gr_block.h 
b/gnuradio-core/src/lib/runtime/gr_block.h
index d0b3e8d..5981682 100644
--- a/gnuradio-core/src/lib/runtime/gr_block.h
+++ b/gnuradio-core/src/lib/runtime/gr_block.h
@@ -171,6 +171,18 @@ class GR_CORE_API gr_block : public gr_basic_block {
   int  output_multiple () const { return d_output_multiple; }
 
   /*!
+   * \brief Constrain the output alignment passed to work
+   *
+   * genral_work is called with noutput_items multiple of alignment.
+   * When this cannot be satisfied, genral_work will be called
+   * with sub-alignment noutput_items until alignment is regained.
+   *
+   * \param alignment a alignment multiple in number of items
+   */
+  void set_output_alignment (int alignment);
+  int  output_alignment () const { return d_output_alignment; }
+
+  /*!
    * \brief Tell the scheduler \p how_many_items of input stream \p 
which_input were consumed.
    */
   void consume (int which_input, int how_many_items);
@@ -248,6 +260,7 @@ class GR_CORE_API gr_block : public gr_basic_block {
  private:
 
   int                   d_output_multiple;
+  int                   d_output_alignment;
   double                d_relative_rate;       // approx output_rate / 
input_rate
   gr_block_detail_sptr d_detail;               // implementation details
   std::vector<bool>     d_inplace;
diff --git a/gnuradio-core/src/lib/runtime/gr_block_executor.cc 
b/gnuradio-core/src/lib/runtime/gr_block_executor.cc
index 737b26f..4273407 100644
--- a/gnuradio-core/src/lib/runtime/gr_block_executor.cc
+++ b/gnuradio-core/src/lib/runtime/gr_block_executor.cc
@@ -366,6 +366,19 @@ gr_block_executor::run_one_iteration()
     for (int i = 0; i < d->ninputs(); i++)
       d_start_nitems_read[i] = d->nitems_read(i);
 
+    // constrain the noutput_items to meet alignment requirements
+    if (m->output_alignment() > 1){
+        const int alignment_extra = m->nitems_written(0) % 
m->output_alignment();
+        //written non-multiple? this logic will re-align to multiple
+        if (alignment_extra != 0){
+            noutput_items = std::min(noutput_items, m->output_alignment() - 
alignment_extra);
+        }
+        //aligned? keep submitting multiples until we cant
+        else if (noutput_items > m->output_alignment()){
+            noutput_items -= noutput_items % m->output_alignment();
+        }
+    }
+
     // Do the actual work of the block
     int n = m->general_work (noutput_items, d_ninput_items,
                             d_input_items, d_output_items);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]