summaryrefslogtreecommitdiff
path: root/gnuradio-runtime/lib/block_executor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gnuradio-runtime/lib/block_executor.cc')
-rw-r--r--gnuradio-runtime/lib/block_executor.cc21
1 files changed, 16 insertions, 5 deletions
diff --git a/gnuradio-runtime/lib/block_executor.cc b/gnuradio-runtime/lib/block_executor.cc
index 7a14c17431..85cf4bb2ab 100644
--- a/gnuradio-runtime/lib/block_executor.cc
+++ b/gnuradio-runtime/lib/block_executor.cc
@@ -192,6 +192,7 @@ namespace gr {
int max_noutput_items;
int new_alignment = 0;
int alignment_state = -1;
+ double rrate;
block *m = d_block.get();
block_detail *d = m->detail().get();
@@ -450,17 +451,27 @@ namespace gr {
m->set_is_unaligned(m->unaligned() != 0);
}
- if(!propagate_tags(m->tag_propagation_policy(), d,
- d_start_nitems_read, m->relative_rate(),
- d_returned_tags, m->unique_id()))
- goto were_done;
-
if(n == block::WORK_DONE)
goto were_done;
if(n != block::WORK_CALLED_PRODUCE)
d->produce_each (n); // advance write pointers
+ // Wait til after we've consumed and produced and recalculate
+ // the relative rate.
+ if(!d->sink_p() && !d->source_p()) {
+ rrate = ((double)m->nitems_written(0)) / ((double)m->nitems_read(0));
+ if(rrate > 0)
+ m->set_relative_rate(rrate);
+ }
+
+ // Now propagate the tags based on the new relative rate
+ if(!propagate_tags(m->tag_propagation_policy(), d,
+ d_start_nitems_read, m->relative_rate(),
+ d_returned_tags, m->unique_id()))
+ goto were_done;
+
+
if(d->d_produce_or > 0) // block produced something
return READY;