23 #ifndef INCLUDED_GR_BASIC_BLOCK_H
24 #define INCLUDED_GR_BASIC_BLOCK_H
29 #include <boost/enable_shared_from_this.hpp>
30 #include <boost/function.hpp>
37 #include <boost/foreach.hpp>
38 #include <boost/thread/condition_variable.hpp>
54 typedef boost::function<void(pmt::pmt_t)> msg_handler_t;
59 typedef std::map<pmt::pmt_t , msg_handler_t, pmt::pmt_comperator> d_msg_handlers_t;
60 d_msg_handlers_t d_msg_handlers;
62 typedef std::deque<pmt::pmt_t> msg_queue_t;
63 typedef std::map<pmt::pmt_t, msg_queue_t, pmt::pmt_comperator> msg_queue_map_t;
64 typedef std::map<pmt::pmt_t, msg_queue_t, pmt::pmt_comperator>::iterator msg_queue_map_itr;
65 std::map<pmt::pmt_t, boost::shared_ptr<boost::condition_variable>,
pmt::pmt_comperator> msg_queue_ready;
95 d_input_signature = iosig;
100 d_output_signature = iosig;
118 if (d_msg_handlers.find(which_port) != d_msg_handlers.end())
119 d_msg_handlers[which_port](msg);
129 std::string
name()
const {
return d_name; }
135 std::string
alias(){
return alias_set()?d_symbol_alias:symbol_name(); }
137 void set_block_alias(std::string name);
140 void message_port_register_in(
pmt::pmt_t port_id);
141 void message_port_register_out(
pmt::pmt_t port_id);
174 if(msg_queue.find(which_port) == msg_queue.end())
175 throw std::runtime_error(
"port does not exist!");
176 return msg_queue[which_port].empty();
180 BOOST_FOREACH(msg_queue_map_t::value_type &i, msg_queue){ rv &= msg_queue[i.first].empty(); }
197 return msg_queue[which_port].begin();
201 msg_queue[which_port].erase(it);
205 if(msg_queue.find(which_port) != msg_queue.end()){
260 if(msg_queue.find(which_port) == msg_queue.end()){
261 throw std::runtime_error(
"attempt to set_msg_handler() on bad input message port!"); }
262 d_msg_handlers[which_port] = msg_handler_t(msg_handler);
268 return lhs->unique_id() < rhs->unique_id();
278 os << basic_block->name() <<
"(" << basic_block->unique_id() <<
")";