From f743c922d6412c3e3362f289bd6196f3754c5616 Mon Sep 17 00:00:00 2001
From: unknown <kegilbert@kgilbert.ni.corp.natinst.com>
Date: Tue, 15 Nov 2016 19:18:54 -0600
Subject: Remove and recreate properties with member function callbacks in
 legacy_compat_impl dtor to prevent future sessions from calling into the
 destroyed bound functions

---
 host/lib/rfnoc/legacy_compat.cpp | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

(limited to 'host/lib')

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:
-- 
cgit v1.2.3