diff options
author | unknown <kegilbert@kgilbert.ni.corp.natinst.com> | 2016-11-15 19:18:54 -0600 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2016-11-18 11:34:49 -0800 |
commit | f743c922d6412c3e3362f289bd6196f3754c5616 (patch) | |
tree | 7fb9f98de565b437ceab10ba3d469b00a87058d4 | |
parent | 581672f31d57b11517e1c88948d8ad672c9975f3 (diff) | |
download | uhd-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.cpp | 32 |
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: |