summaryrefslogtreecommitdiff
path: root/gnuradio-core/src/lib/runtime
diff options
context:
space:
mode:
authorJohnathan Corgan2009-08-04 10:22:15 -0700
committerEric Blossom2009-08-13 21:40:08 -0700
commit3d47afffbf216f5ab0fa036de2b70cdc7a1981da (patch)
tree15ff3dc7843c1edf0657cad7f1cf34ee3adbed63 /gnuradio-core/src/lib/runtime
parentf67c4ff12f19490d2aeab7ff0fbe0484195037f0 (diff)
downloadgnuradio-3d47afffbf216f5ab0fa036de2b70cdc7a1981da.tar.gz
gnuradio-3d47afffbf216f5ab0fa036de2b70cdc7a1981da.tar.bz2
gnuradio-3d47afffbf216f5ab0fa036de2b70cdc7a1981da.zip
Notify derived class when post()ed
Diffstat (limited to 'gnuradio-core/src/lib/runtime')
-rw-r--r--gnuradio-core/src/lib/runtime/gr_msg_accepter.cc14
-rw-r--r--gnuradio-core/src/lib/runtime/gr_tpb_detail.h14
2 files changed, 24 insertions, 4 deletions
diff --git a/gnuradio-core/src/lib/runtime/gr_msg_accepter.cc b/gnuradio-core/src/lib/runtime/gr_msg_accepter.cc
index b07f447c9..ebe11870a 100644
--- a/gnuradio-core/src/lib/runtime/gr_msg_accepter.cc
+++ b/gnuradio-core/src/lib/runtime/gr_msg_accepter.cc
@@ -24,6 +24,8 @@
#endif
#include <gr_msg_accepter.h>
+#include <gr_block.h>
+#include <gr_block_detail.h>
using namespace pmt;
@@ -40,5 +42,15 @@ gr_msg_accepter::~gr_msg_accepter()
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");
+ }
}
diff --git a/gnuradio-core/src/lib/runtime/gr_tpb_detail.h b/gnuradio-core/src/lib/runtime/gr_tpb_detail.h
index ab955240b..29101d730 100644
--- a/gnuradio-core/src/lib/runtime/gr_tpb_detail.h
+++ b/gnuradio-core/src/lib/runtime/gr_tpb_detail.h
@@ -35,10 +35,10 @@ struct gr_tpb_detail {
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);
@@ -57,6 +57,15 @@ struct gr_tpb_detail {
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
@@ -74,7 +83,6 @@ private:
output_changed = true;
output_cond.notify_one();
}
-
};
#endif /* INCLUDED_GR_TPB_DETAIL_H */