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>
This commit is contained in:
Steven Koo 2021-01-20 11:20:30 -06:00 committed by Aaron Rossetto
parent 16b38ff6c6
commit e9176649d1
2 changed files with 17 additions and 4 deletions

View File

@ -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
*************************************************************************/

View File

@ -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)
{