#endif
#include <gr_msg_accepter.h>
+#include <gr_block.h>
+#include <gr_block_detail.h>
using namespace pmt;
void
gr_msg_accepter::post(pmt_t msg)
{
- d_msg_queue->insert_tail(msg);
+ // Let parent class do whatever it would have
+ gruel::msg_accepter_msgq::post(msg);
+
+ // Notify this block's scheduler a message is pending
+ gr_block *p = dynamic_cast<gr_block *>(this);
+ if (p)
+ p->detail()->d_tpb.notify_msg();
+ else {
+ // got here somehow with a non-gr_block
+ throw std::runtime_error("gr_msg_accepter::post() - invalid derived class");
+ }
}
gruel::condition_variable input_cond;
bool output_changed;
gruel::condition_variable output_cond;
+ bool msg_pending;
gr_tpb_detail()
- : input_changed(false), output_changed(false) {}
-
+ : input_changed(false), output_changed(false), msg_pending(false) { }
//! Called by us to tell all our upstream blocks that their output may have changed.
void notify_upstream(gr_block_detail *d);
output_changed = false;
}
+ //! Called to notify us that a message is pending in the queue
+ void notify_msg()
+ {
+ gruel::scoped_lock guard(mutex);
+ msg_pending = true;
+ input_cond.notify_one();
+ output_cond.notify_one();
+ }
+
private:
//! Used by notify_downstream
output_changed = true;
output_cond.notify_one();
}
-
};
#endif /* INCLUDED_GR_TPB_DETAIL_H */