aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorunknown <kegilbert@kgilbert.ni.corp.natinst.com>2016-11-15 19:18:54 -0600
committerMartin Braun <martin.braun@ettus.com>2016-11-18 11:34:49 -0800
commitf743c922d6412c3e3362f289bd6196f3754c5616 (patch)
tree7fb9f98de565b437ceab10ba3d469b00a87058d4
parent581672f31d57b11517e1c88948d8ad672c9975f3 (diff)
downloaduhd-f743c922d6412c3e3362f289bd6196f3754c5616.tar.gz
uhd-f743c922d6412c3e3362f289bd6196f3754c5616.tar.bz2
uhd-f743c922d6412c3e3362f289bd6196f3754c5616.zip
Remove and recreate properties with member function callbacks in
legacy_compat_impl dtor to prevent future sessions from calling into the destroyed bound functions
-rw-r--r--host/lib/rfnoc/legacy_compat.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/host/lib/rfnoc/legacy_compat.cpp b/host/lib/rfnoc/legacy_compat.cpp
index e1eff757e..b660a21c7 100644
--- a/host/lib/rfnoc/legacy_compat.cpp
+++ b/host/lib/rfnoc/legacy_compat.cpp
@@ -103,6 +103,15 @@ uhd::meta_range_t lambda_const_meta_range(const double start, const double stop,
{
return uhd::meta_range_t(start, stop, step);
}
+
+/*! Recreate passed property without bound subscribers. Maintains current property value.
+*/
+template <typename T>
+static void recreate_property(const uhd::fs_path &path, uhd::property_tree::sptr &tree) {
+ T temp = tree->access<T>(path).get();
+ tree->remove(path);
+ tree->create<T>(path).set(temp);
+}
/************************************************************************
* Class Definition
***********************************************************************/
@@ -169,6 +178,11 @@ public:
}
}
+ ~legacy_compat_impl()
+ {
+ remove_prop_subscribers();
+ }
+
/************************************************************************
* API Calls
***********************************************************************/
@@ -590,6 +604,24 @@ private: // methods
}
}
+
+ /*! Remove properties with bound functions in property tree and recreate
+ */
+ void remove_prop_subscribers()
+ {
+ for (size_t mboard_idx = 0; mboard_idx < _num_mboards; mboard_idx++) {
+ uhd::fs_path root = mb_root(mboard_idx);
+ // Subdev specs
+ if (_tree->exists(root / "tx_subdev_spec")) {
+ recreate_property<subdev_spec_t>(root / "tx_subdev_spec", _tree);
+ }
+
+ if (_tree->exists(root / "rx_subdev_spec")) {
+ recreate_property<subdev_spec_t>(root / "rx_subdev_spec", _tree);
+ }
+ }
+ }
+
/*! Default block connections.
*
* Tx connections: