From e9176649d1cfbbf114127bdc73a49e36406fccd8 Mon Sep 17 00:00:00 2001 From: Steven Koo Date: Wed, 20 Jan 2021 11:20:30 -0600 Subject: 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 --- host/lib/rfnoc/graph.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'host/lib/rfnoc/graph.cpp') 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) { -- cgit v1.2.3