23 #ifndef INCLUDED_GR_BASIC_BLOCK_H
24 #define INCLUDED_GR_BASIC_BLOCK_H
32 #include <boost/enable_shared_from_this.hpp>
33 #include <boost/function.hpp>
34 #include <boost/foreach.hpp>
35 #include <boost/thread/condition_variable.hpp>
59 public boost::enable_shared_from_this<basic_block>
61 typedef boost::function<void(pmt::pmt_t)> msg_handler_t;
65 typedef std::map<pmt::pmt_t , msg_handler_t, pmt::comparator> d_msg_handlers_t;
66 d_msg_handlers_t d_msg_handlers;
68 typedef std::deque<pmt::pmt_t> msg_queue_t;
69 typedef std::map<pmt::pmt_t, msg_queue_t, pmt::comparator> msg_queue_map_t;
70 typedef std::map<pmt::pmt_t, msg_queue_t, pmt::comparator>::iterator msg_queue_map_itr;
71 std::map<pmt::pmt_t, boost::shared_ptr<boost::condition_variable>,
pmt::comparator> msg_queue_ready;
77 friend class flat_flowgraph;
78 friend class tpb_thread_body;
104 d_input_signature = iosig;
109 d_output_signature = iosig;
122 return (d_msg_handlers.find(which_port) != d_msg_handlers.end());
134 if(has_msg_handler(which_port)) {
135 d_msg_handlers[which_port](msg);
149 std::string
name()
const {
return d_name; }
170 std::string
alias(){
return alias_set()?d_symbol_alias:symbol_name(); }
182 void set_block_alias(std::string name);
185 void message_port_register_in(
pmt::pmt_t port_id);
186 void message_port_register_out(
pmt::pmt_t port_id);
219 throw std::runtime_error(
"port does not exist!");
224 BOOST_FOREACH(msg_queue_map_t::value_type &i,
msg_queue) {
232 return (empty_p(which_port) || !has_msg_handler(which_port));
236 BOOST_FOREACH(msg_queue_map_t::value_type &i,
msg_queue) {
237 rv &= empty_handled_p(i.first);
245 throw std::runtime_error(
"port does not exist!");
298 d_rpc_vars.push_back(s);
373 throw std::runtime_error(
"attempt to set_msg_handler() on bad input message port!");
375 d_msg_handlers[which_port] = msg_handler_t(msg_handler);
378 virtual void set_processor_affinity(
const std::vector<int> &mask)
379 {
throw std::runtime_error(
"set_processor_affinity not overloaded in child class."); }
381 virtual void unset_processor_affinity()
382 {
throw std::runtime_error(
"unset_processor_affinity not overloaded in child class."); }
384 virtual std::vector<int> processor_affinity()
385 {
throw std::runtime_error(
"processor_affinity not overloaded in child class."); }
390 return lhs->unique_id() < rhs->unique_id();
400 os << basic_block->name() <<
"(" << basic_block->unique_id() <<
")";