summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Blum2013-03-01 03:06:22 -0600
committerJosh Blum2013-03-01 03:06:22 -0600
commit69382ea010dab3cc218774a17cafacfec0dde86d (patch)
tree30306806ceea0aebb011035e4fcdc622e8f493a8
parent964ebc0f4c8581b4147a53fdf1bfd7005d91ee2f (diff)
downloadsandhi-69382ea010dab3cc218774a17cafacfec0dde86d.tar.gz
sandhi-69382ea010dab3cc218774a17cafacfec0dde86d.tar.bz2
sandhi-69382ea010dab3cc218774a17cafacfec0dde86d.zip
gras: use new flag for marking produce
This way we dont produce stuff when the user gets access to the internal buffer, but only when the user is calling produce.
m---------gnuradio0
m---------grextras0
-rw-r--r--lib/block_task.cpp11
-rw-r--r--lib/gras_impl/block_actor.hpp1
-rw-r--r--lib/topology_handler.cpp1
5 files changed, 10 insertions, 3 deletions
diff --git a/gnuradio b/gnuradio
-Subproject c60a6dc8b61c26c37874b27e4440c02e573dca2
+Subproject e0e4eafabfc61ff492a30ee05aceebbf9cb27bc
diff --git a/grextras b/grextras
-Subproject 1ebef1dfa208ea00dd67376cafde89988e0a845
+Subproject a90030d340c64159de8ee23fafbac6640e2efe0
diff --git a/lib/block_task.cpp b/lib/block_task.cpp
index 56d89fb..4d85aaf 100644
--- a/lib/block_task.cpp
+++ b/lib/block_task.cpp
@@ -244,6 +244,7 @@ void BlockActor::produce(const size_t i, const size_t items)
this->stats.items_produced[i] += items;
const size_t bytes = items*this->output_configs[i].item_size;
buff.length += bytes;
+ this->produce_outputs[i] = true;
}
void BlockActor::produce_buffer(const size_t i, const SBuffer &buffer)
@@ -260,9 +261,13 @@ GRAS_FORCE_INLINE void BlockActor::flush_output(const size_t i)
{
if GRAS_UNLIKELY(this->output_queues.empty(i) or this->output_queues.front(i).length == 0) return;
SBuffer &buff = this->output_queues.front(i);
- InputBufferMessage buff_msg;
- buff_msg.buffer = buff;
- this->post_downstream(i, buff_msg);
+ if GRAS_LIKELY(this->produce_outputs[i])
+ {
+ this->produce_outputs[i] = false;
+ InputBufferMessage buff_msg;
+ buff_msg.buffer = buff;
+ this->post_downstream(i, buff_msg);
+ }
//increment buffer for next use
buff.offset += buff.length;
diff --git a/lib/gras_impl/block_actor.hpp b/lib/gras_impl/block_actor.hpp
index 8bea03c..d40152a 100644
--- a/lib/gras_impl/block_actor.hpp
+++ b/lib/gras_impl/block_actor.hpp
@@ -140,6 +140,7 @@ struct BlockActor : Apology::Worker
InputBufferQueues input_queues;
OutputBufferQueues output_queues;
BitSet inputs_available;
+ std::vector<bool> produce_outputs;
//tag tracking
std::vector<bool> input_tags_changed;
diff --git a/lib/topology_handler.cpp b/lib/topology_handler.cpp
index f0a8b21..a3d7e6a 100644
--- a/lib/topology_handler.cpp
+++ b/lib/topology_handler.cpp
@@ -46,6 +46,7 @@ void BlockActor::handle_topology(
this->input_queues.resize(num_inputs);
this->output_queues.resize(num_outputs);
this->inputs_available.resize(num_inputs);
+ this->produce_outputs.resize(num_outputs, false);
if (num_inputs == 0) this->inputs_available.resize(1, true); //so its always "available"
this->input_tokens.resize(num_inputs);