summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Rondeau <trondeau@vt.edu>2013-02-07 13:49:58 -0500
committerTom Rondeau <trondeau@vt.edu>2013-02-07 17:34:34 -0500
commit308051abeb515b52c4fb906bdfb2622ac6183508 (patch)
tree69a667d5fb56e8965c432ed325eef03593e8985e
parent8585cd0d10ba82c9f4dd1c2b4397346c5a874d43 (diff)
sched: added ControlPort interface to setup and access perf counters.
Conflicts: gnuradio-core/src/lib/runtime/gr_block.h
-rw-r--r--gnuradio-core/src/lib/runtime/gr_block.cc38
-rw-r--r--gnuradio-core/src/lib/runtime/gr_block.h19
-rw-r--r--gnuradio-core/src/lib/runtime/gr_block_detail.h2
-rw-r--r--gnuradio-core/src/lib/runtime/gr_flat_flowgraph.cc12
-rw-r--r--gnuradio-core/src/lib/runtime/gr_flat_flowgraph.h6
-rw-r--r--gnuradio-core/src/lib/runtime/gr_top_block_impl.cc2
-rw-r--r--gnuradio-core/src/lib/runtime/nop_impl.cc1
7 files changed, 78 insertions, 2 deletions
diff --git a/gnuradio-core/src/lib/runtime/gr_block.cc b/gnuradio-core/src/lib/runtime/gr_block.cc
index fd82ab580e..33c460e1a0 100644
--- a/gnuradio-core/src/lib/runtime/gr_block.cc
+++ b/gnuradio-core/src/lib/runtime/gr_block.cc
@@ -44,6 +44,7 @@ gr_block::gr_block (const std::string &name,
d_max_noutput_items_set(false),
d_max_noutput_items(0),
d_tag_propagation_policy(TPP_ALL_TO_ALL),
+ d_pc_rpc_set(false),
d_max_output_buffer(std::max(output_signature->max_streams(),1), -1),
d_min_output_buffer(std::max(output_signature->max_streams(),1), -1)
{
@@ -346,6 +347,43 @@ gr_block::pc_work_time()
}
}
+void
+gr_block::setup_pc_rpc()
+{
+ d_pc_rpc_set = true;
+#ifdef GR_CTRLPORT
+ d_rpc_vars.push_back(
+ rpcbasic_sptr(new rpcbasic_register_get<gr_block, float>(
+ alias(), "noutput_items", &gr_block::pc_noutput_items,
+ pmt::mp(0), pmt::mp(32768), pmt::mp(0),
+ "", "Average noutput items", RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+
+ d_rpc_vars.push_back(
+ rpcbasic_sptr(new rpcbasic_register_get<gr_block, float>(
+ alias(), "nproduced", &gr_block::pc_nproduced,
+ pmt::mp(0), pmt::mp(32768), pmt::mp(0),
+ "", "Average items produced", RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+
+ d_rpc_vars.push_back(
+ rpcbasic_sptr(new rpcbasic_register_get<gr_block, float>(
+ alias(), "work time", &gr_block::pc_work_time,
+ pmt::mp(0), pmt::mp(1e9), pmt::mp(0),
+ "", "Average clock cycles in call to work", RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+
+ d_rpc_vars.push_back(
+ rpcbasic_sptr(new rpcbasic_register_get<gr_block, std::vector<float> >(
+ alias(), "input \% full", &gr_block::pc_input_buffers_full,
+ pmt::make_c32vector(0,0), pmt::make_c32vector(0,1), pmt::make_c32vector(0,0),
+ "", "Average of how full input buffers are", RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+
+ d_rpc_vars.push_back(
+ rpcbasic_sptr(new rpcbasic_register_get<gr_block, std::vector<float> >(
+ alias(), "output \% full", &gr_block::pc_output_buffers_full,
+ pmt::make_c32vector(0,0), pmt::make_c32vector(0,1), pmt::make_c32vector(0,0),
+ "", "Average of how full output buffers are", RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+#endif /* GR_CTRLPORT */
+}
+
std::ostream&
operator << (std::ostream& os, const gr_block *m)
{
diff --git a/gnuradio-core/src/lib/runtime/gr_block.h b/gnuradio-core/src/lib/runtime/gr_block.h
index c9d2d8f530..96e07439ef 100644
--- a/gnuradio-core/src/lib/runtime/gr_block.h
+++ b/gnuradio-core/src/lib/runtime/gr_block.h
@@ -395,6 +395,24 @@ class GR_CORE_API gr_block : public gr_basic_block {
*/
float pc_work_time();
+ /*!
+ * \brief Sets up export of perf. counters to ControlPort. Only
+ * called by the scheduler.
+ */
+ void setup_pc_rpc();
+
+ /*!
+ * \brief Checks if this block is already exporting perf. counters
+ * to ControlPort.
+ */
+ bool is_pc_rpc_set() { return d_pc_rpc_set; }
+
+ /*!
+ * \brief If the block calls this in its constructor, it's
+ * perf. counters will not be exported.
+ */
+ void no_pc_rpc() { d_pc_rpc_set = true; }
+
// ----------------------------------------------------------------------------
// Functions to handle thread affinity
@@ -432,6 +450,7 @@ class GR_CORE_API gr_block : public gr_basic_block {
int d_max_noutput_items; // value of max_noutput_items for this block
tag_propagation_policy_t d_tag_propagation_policy; // policy for moving tags downstream
std::vector<unsigned int> d_affinity; // thread affinity proc. mask
+ bool d_pc_rpc_set;
protected:
gr_block (void){} //allows pure virtual interface sub-classes
diff --git a/gnuradio-core/src/lib/runtime/gr_block_detail.h b/gnuradio-core/src/lib/runtime/gr_block_detail.h
index a8ed8da908..dd8be71c9c 100644
--- a/gnuradio-core/src/lib/runtime/gr_block_detail.h
+++ b/gnuradio-core/src/lib/runtime/gr_block_detail.h
@@ -182,7 +182,7 @@ class GR_CORE_API gr_block_detail {
float pc_output_buffers_full(size_t which);
std::vector<float> pc_output_buffers_full();
float pc_work_time();
-
+
gr_tpb_detail d_tpb; // used by thread-per-block scheduler
int d_produce_or;
diff --git a/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.cc b/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.cc
index e7b75d95cd..79b0b0f59d 100644
--- a/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.cc
+++ b/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.cc
@@ -401,3 +401,15 @@ void gr_flat_flowgraph::replace_endpoint(const gr_msg_endpoint &e, const gr_msg_
}
}
+void
+gr_flat_flowgraph::enable_pc_rpc()
+{
+#ifdef GR_PERFORMANCE_COUNTERS
+ gr_basic_block_viter_t p;
+ for(p = d_blocks.begin(); p != d_blocks.end(); p++) {
+ gr_block_sptr block = cast_to_block_sptr(*p);
+ if(!block->is_pc_rpc_set())
+ block->setup_pc_rpc();
+ }
+#endif /* GR_PERFORMANCE_COUNTERS */
+}
diff --git a/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.h b/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.h
index 5c8268d7df..031564f2ec 100644
--- a/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.h
+++ b/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.h
@@ -60,6 +60,12 @@ public:
void replace_endpoint(const gr_msg_endpoint &e, const gr_msg_endpoint &r, bool is_src);
void clear_endpoint(const gr_msg_endpoint &e, bool is_src);
+ /*!
+ * Enables export of perf. counters to ControlPort on all blocks in
+ * the flowgraph.
+ */
+ void enable_pc_rpc();
+
private:
gr_flat_flowgraph();
diff --git a/gnuradio-core/src/lib/runtime/gr_top_block_impl.cc b/gnuradio-core/src/lib/runtime/gr_top_block_impl.cc
index 4a3694163b..e563fbadb8 100644
--- a/gnuradio-core/src/lib/runtime/gr_top_block_impl.cc
+++ b/gnuradio-core/src/lib/runtime/gr_top_block_impl.cc
@@ -108,6 +108,8 @@ gr_top_block_impl::start(int max_noutput_items)
d_ffg->validate();
d_ffg->setup_connections();
+ d_ffg->enable_pc_rpc();
+
d_scheduler = make_scheduler(d_ffg, d_max_noutput_items);
d_state = RUNNING;
}
diff --git a/gnuradio-core/src/lib/runtime/nop_impl.cc b/gnuradio-core/src/lib/runtime/nop_impl.cc
index 1aaba1b0cd..b6764c2257 100644
--- a/gnuradio-core/src/lib/runtime/nop_impl.cc
+++ b/gnuradio-core/src/lib/runtime/nop_impl.cc
@@ -45,7 +45,6 @@ namespace gr {
{
set_a(a);
set_b(b);
- setup_rpc();
}
nop_impl::~nop_impl()