diff options
author | Steven Koo <steven.koo@ni.com> | 2021-01-20 11:20:30 -0600 |
---|---|---|
committer | Aaron Rossetto <aaron.rossetto@ni.com> | 2021-01-21 15:21:24 -0600 |
commit | e9176649d1cfbbf114127bdc73a49e36406fccd8 (patch) | |
tree | 4cb242554e05c26b956a5c29aa34e255538539ec | |
parent | 16b38ff6c64f807d23982f59544e416fc9d3e13e (diff) | |
download | uhd-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.hpp | 3 | ||||
-rw-r--r-- | host/lib/rfnoc/graph.cpp | 18 |
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) { |