summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnuradio-core/src/lib/runtime/gr_block.h8
-rw-r--r--gr-analog/lib/noise_source_X_impl.cc.t16
-rw-r--r--gr-analog/lib/noise_source_X_impl.h.t4
-rw-r--r--gr-filter/lib/fir_filter_XXX_impl.cc.t3
4 files changed, 28 insertions, 3 deletions
diff --git a/gnuradio-core/src/lib/runtime/gr_block.h b/gnuradio-core/src/lib/runtime/gr_block.h
index 6e21d5b97..0783e8684 100644
--- a/gnuradio-core/src/lib/runtime/gr_block.h
+++ b/gnuradio-core/src/lib/runtime/gr_block.h
@@ -484,9 +484,9 @@ class GR_CORE_API gr_block : public gr_basic_block {
gr_block_detail_sptr d_detail; // implementation details
unsigned d_history;
bool d_fixed_rate;
- int d_min_noutput_items;
bool d_max_noutput_items_set; // if d_max_noutput_items is valid
int d_max_noutput_items; // value of max_noutput_items for this block
+ int d_min_noutput_items;
tag_propagation_policy_t d_tag_propagation_policy; // policy for moving tags downstream
std::vector<unsigned int> d_affinity; // thread affinity proc. mask
@@ -609,6 +609,12 @@ class GR_CORE_API gr_block : public gr_basic_block {
std::vector<long> d_max_output_buffer;
std::vector<long> d_min_output_buffer;
+ /*! Used by block's setters and work functions to make
+ * setting/resetting of parameters thread-safe.
+ *
+ * Used by calling gruel::scoped_lock l(d_setlock);
+ */
+ gruel::mutex d_setlock;
// These are really only for internal use, but leaving them public avoids
// having to work up an ever-varying list of friend GR_CORE_APIs
diff --git a/gr-analog/lib/noise_source_X_impl.cc.t b/gr-analog/lib/noise_source_X_impl.cc.t
index 35dda9c5d..40e2517d2 100644
--- a/gr-analog/lib/noise_source_X_impl.cc.t
+++ b/gr-analog/lib/noise_source_X_impl.cc.t
@@ -54,11 +54,27 @@ namespace gr {
{
}
+ void
+ @IMPL_NAME@::set_type(noise_type_t type)
+ {
+ gruel::scoped_lock l(d_setlock);
+ d_type = type;
+ }
+
+ void
+ @IMPL_NAME@::set_amplitude(float ampl)
+ {
+ gruel::scoped_lock l(d_setlock);
+ d_ampl = ampl;
+ }
+
int
@IMPL_NAME@::work(int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
+ gruel::scoped_lock l(d_setlock);
+
@TYPE@ *out = (@TYPE@*)output_items[0];
switch(d_type) {
diff --git a/gr-analog/lib/noise_source_X_impl.h.t b/gr-analog/lib/noise_source_X_impl.h.t
index 8bcc1dfde..3a0e8d6d7 100644
--- a/gr-analog/lib/noise_source_X_impl.h.t
+++ b/gr-analog/lib/noise_source_X_impl.h.t
@@ -41,8 +41,8 @@ namespace gr {
@IMPL_NAME@(noise_type_t type, float ampl, long seed = 0);
~@IMPL_NAME@();
- void set_type(noise_type_t type) { d_type = type; }
- void set_amplitude(float ampl) { d_ampl = ampl; }
+ void set_type(noise_type_t type);
+ void set_amplitude(float ampl);
noise_type_t type() const { return d_type; }
float amplitude() const { return d_ampl; }
diff --git a/gr-filter/lib/fir_filter_XXX_impl.cc.t b/gr-filter/lib/fir_filter_XXX_impl.cc.t
index 529c51e2b..319c26727 100644
--- a/gr-filter/lib/fir_filter_XXX_impl.cc.t
+++ b/gr-filter/lib/fir_filter_XXX_impl.cc.t
@@ -64,6 +64,7 @@ namespace gr {
void
@IMPL_NAME@::set_taps(const std::vector<@TAP_TYPE@> &taps)
{
+ gruel::scoped_lock l(d_setlock);
d_fir->set_taps(taps);
d_updated = true;
}
@@ -79,6 +80,8 @@ namespace gr {
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
+ gruel::scoped_lock l(d_setlock);
+
const @I_TYPE@ *in = (const @I_TYPE@*)input_items[0];
@O_TYPE@ *out = (@O_TYPE@*)output_items[0];