aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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: