diff options
author | Josh Blum | 2013-03-01 03:06:22 -0600 |
---|---|---|
committer | Josh Blum | 2013-03-01 03:06:22 -0600 |
commit | 69382ea010dab3cc218774a17cafacfec0dde86d (patch) | |
tree | 30306806ceea0aebb011035e4fcdc622e8f493a8 | |
parent | 964ebc0f4c8581b4147a53fdf1bfd7005d91ee2f (diff) | |
download | sandhi-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--------- | gnuradio | 0 | ||||
m--------- | grextras | 0 | ||||
-rw-r--r-- | lib/block_task.cpp | 11 | ||||
-rw-r--r-- | lib/gras_impl/block_actor.hpp | 1 | ||||
-rw-r--r-- | lib/topology_handler.cpp | 1 |
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); |