summaryrefslogtreecommitdiff
path: root/gnuradio-runtime/lib/block_detail.cc
diff options
context:
space:
mode:
authorAndy Walls <awalls.cx18@gmail.com>2017-12-11 19:25:01 -0500
committerMartin Braun <martin.braun@ettus.com>2018-02-03 14:23:32 +0100
commiteee29fbe8ff4c58ae68af89384328f23f0a8e7b6 (patch)
tree35c9a212e0dfc2dbcf2cc3d01ef8e40bf22244c0 /gnuradio-runtime/lib/block_detail.cc
parentb0912d31f1a2cfea93a5588898cae0c652cd89d4 (diff)
gnuradio-runtime: Optimize some buffer[_reader]_sptr grabs and releases
Optimize some reference counted buffer[_reader]_sptr grabs and releases that show up as minor CPU wasters in profiling when there are a lot of tags or some blocks that "return 0" often. At high sample rates (e.g. 160 Msps), this can save ~2% CPU on blocks that propagate a fair number of tags.
Diffstat (limited to 'gnuradio-runtime/lib/block_detail.cc')
-rw-r--r--gnuradio-runtime/lib/block_detail.cc28
1 files changed, 16 insertions, 12 deletions
diff --git a/gnuradio-runtime/lib/block_detail.cc b/gnuradio-runtime/lib/block_detail.cc
index 9e2e29fcd9..3da150ed8f 100644
--- a/gnuradio-runtime/lib/block_detail.cc
+++ b/gnuradio-runtime/lib/block_detail.cc
@@ -313,17 +313,19 @@ namespace gr {
d_total_noutput_items = noutput_items;
d_pc_start_time = (float)gr::high_res_timer_now();
for(size_t i=0; i < d_input.size(); i++) {
- gr::thread::scoped_lock guard(*d_input[i]->mutex());
- float pfull = static_cast<float>(d_input[i]->items_available()) /
- static_cast<float>(d_input[i]->max_possible_items_available());
+ buffer_reader_sptr in_buf = d_input[i];
+ gr::thread::scoped_lock guard(*in_buf->mutex());
+ float pfull = static_cast<float>(in_buf->items_available()) /
+ static_cast<float>(in_buf->max_possible_items_available());
d_ins_input_buffers_full[i] = pfull;
d_avg_input_buffers_full[i] = pfull;
d_var_input_buffers_full[i] = 0;
}
for(size_t i=0; i < d_output.size(); i++) {
- gr::thread::scoped_lock guard(*d_output[i]->mutex());
- float pfull = 1.0f - static_cast<float>(d_output[i]->space_available()) /
- static_cast<float>(d_output[i]->bufsize());
+ buffer_sptr out_buf = d_output[i];
+ gr::thread::scoped_lock guard(*out_buf->mutex());
+ float pfull = 1.0f - static_cast<float>(out_buf->space_available()) /
+ static_cast<float>(out_buf->bufsize());
d_ins_output_buffers_full[i] = pfull;
d_avg_output_buffers_full[i] = pfull;
d_var_output_buffers_full[i] = 0;
@@ -351,9 +353,10 @@ namespace gr {
d_avg_throughput = d_total_noutput_items / monitor_time;
for(size_t i=0; i < d_input.size(); i++) {
- gr::thread::scoped_lock guard(*d_input[i]->mutex());
- float pfull = static_cast<float>(d_input[i]->items_available()) /
- static_cast<float>(d_input[i]->max_possible_items_available());
+ buffer_reader_sptr in_buf = d_input[i];
+ gr::thread::scoped_lock guard(*in_buf->mutex());
+ float pfull = static_cast<float>(in_buf->items_available()) /
+ static_cast<float>(in_buf->max_possible_items_available());
d = pfull - d_avg_input_buffers_full[i];
d_ins_input_buffers_full[i] = pfull;
@@ -362,9 +365,10 @@ namespace gr {
}
for(size_t i=0; i < d_output.size(); i++) {
- gr::thread::scoped_lock guard(*d_output[i]->mutex());
- float pfull = 1.0f - static_cast<float>(d_output[i]->space_available()) /
- static_cast<float>(d_output[i]->bufsize());
+ buffer_sptr out_buf = d_output[i];
+ gr::thread::scoped_lock guard(*out_buf->mutex());
+ float pfull = 1.0f - static_cast<float>(out_buf->space_available()) /
+ static_cast<float>(out_buf->bufsize());
d = pfull - d_avg_output_buffers_full[i];
d_ins_output_buffers_full[i] = pfull;