aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Koo <steven.koo@ni.com>2021-01-20 11:20:30 -0600
committerAaron Rossetto <aaron.rossetto@ni.com>2021-01-21 15:21:24 -0600
commite9176649d1cfbbf114127bdc73a49e36406fccd8 (patch)
tree4cb242554e05c26b956a5c29aa34e255538539ec
parent16b38ff6c64f807d23982f59544e416fc9d3e13e (diff)
downloaduhd-e9176649d1cfbbf114127bdc73a49e36406fccd8.tar.gz
uhd-e9176649d1cfbbf114127bdc73a49e36406fccd8.tar.bz2
uhd-e9176649d1cfbbf114127bdc73a49e36406fccd8.zip
uhd: lambda capture the node instead of vert desc
This commit adds another resolve_all_properties method to use the node instead of the vertex descriptor. The vertex descriptor could be removed. This could cause the lambda capture to have an outdated vertex descriptor, which would result in a hang when looking for it. This resolves the issue by capturing the node and looking for the vertex descriptor. Signed-off-by: Steven Koo <steven.koo@ni.com>
-rw-r--r--host/lib/include/uhdlib/rfnoc/graph.hpp3
-rw-r--r--host/lib/rfnoc/graph.cpp18
2 files changed, 17 insertions, 4 deletions
diff --git a/host/lib/include/uhdlib/rfnoc/graph.hpp b/host/lib/include/uhdlib/rfnoc/graph.hpp
index 288de63ce..73f983d41 100644
--- a/host/lib/include/uhdlib/rfnoc/graph.hpp
+++ b/host/lib/include/uhdlib/rfnoc/graph.hpp
@@ -171,6 +171,9 @@ private:
void resolve_all_properties(uhd::rfnoc::resolve_context context,
rfnoc_graph_t::vertex_descriptor initial_node);
+ void resolve_all_properties(uhd::rfnoc::resolve_context context,
+ node_ref_t initial_node);
+
/**************************************************************************
* Action API
*************************************************************************/
diff --git a/host/lib/rfnoc/graph.cpp b/host/lib/rfnoc/graph.cpp
index 1fc60cf6e..4041ece5a 100644
--- a/host/lib/rfnoc/graph.cpp
+++ b/host/lib/rfnoc/graph.cpp
@@ -89,11 +89,11 @@ void graph_t::connect(node_ref_t src_node, node_ref_t dst_node, graph_edge_t edg
auto dst_vertex_desc = _node_map.at(dst_node);
// Set resolver callbacks:
- node_accessor.set_resolve_all_callback(src_node, [this, src_vertex_desc]() {
- this->resolve_all_properties(resolve_context::NODE_PROP, src_vertex_desc);
+ node_accessor.set_resolve_all_callback(src_node, [this, src_node]() {
+ this->resolve_all_properties(resolve_context::NODE_PROP, src_node);
});
- node_accessor.set_resolve_all_callback(dst_node, [this, dst_vertex_desc]() {
- this->resolve_all_properties(resolve_context::NODE_PROP, dst_vertex_desc);
+ node_accessor.set_resolve_all_callback(dst_node, [this, dst_node]() {
+ this->resolve_all_properties(resolve_context::NODE_PROP, dst_node);
});
// Set post action callbacks:
node_accessor.set_post_action_callback(
@@ -324,6 +324,9 @@ void graph_t::resolve_all_properties(
auto begin_it = topo_sorted_nodes.begin();
auto end_it = topo_sorted_nodes.end();
while (*node_it != initial_node) {
+ if (node_it == end_it) {
+ throw uhd::rfnoc_error("Cannot find node in graph!");
+ }
// We know *node_it must be == initial_node at some point, because
// otherwise, initial_dirty_nodes would have been empty
node_it++;
@@ -439,6 +442,13 @@ void graph_t::resolve_all_properties(
}
}
+void graph_t::resolve_all_properties(
+ resolve_context context, node_ref_t initial_node)
+{
+ auto initial_node_vertex_desc = _node_map.at(initial_node);
+ resolve_all_properties(context, initial_node_vertex_desc);
+}
+
void graph_t::enqueue_action(
node_ref_t src_node, res_source_info src_edge, action_info::sptr action)
{