From 0f2cc511c9f30e4e27936106acbf053669a708be Mon Sep 17 00:00:00 2001 From: amin1377 Date: Tue, 12 Jul 2022 17:10:10 -0400 Subject: [PATCH 1/3] assign nullptr to a node when it is freed --- vpr/src/route/route_tree_timing.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/vpr/src/route/route_tree_timing.cpp b/vpr/src/route/route_tree_timing.cpp index d7abeacf765..bb94f6a3ab3 100644 --- a/vpr/src/route/route_tree_timing.cpp +++ b/vpr/src/route/route_tree_timing.cpp @@ -45,7 +45,7 @@ static t_linked_rt_edge* rt_edge_free_list = nullptr; static t_rt_node* alloc_rt_node(); -static void free_rt_node(t_rt_node* rt_node); +static void free_rt_node(t_rt_node** rt_node); static t_linked_rt_edge* alloc_linked_rt_edge(); @@ -144,11 +144,12 @@ alloc_rt_node() { return (rt_node); } -static void free_rt_node(t_rt_node* rt_node) { +static void free_rt_node(t_rt_node** rt_node) { /* Adds rt_node to the proper free list. */ - rt_node->u.next = rt_node_free_list; - rt_node_free_list = rt_node; + (*rt_node)->u.next = rt_node_free_list; + rt_node_free_list = (*rt_node); + (*rt_node) = nullptr; } static t_linked_rt_edge* @@ -660,7 +661,9 @@ bool verify_route_tree_recurr(t_rt_node* node, std::set& seen_nodes) { void free_route_tree(t_rt_node* rt_node) { /* Puts the rt_nodes and edges in the tree rooted at rt_node back on the * free lists. Recursive, depth-first post-order traversal. */ - + if(rt_node == nullptr) { + return; + } t_linked_rt_edge *rt_edge, *next_edge; rt_edge = rt_node->u.child_list; @@ -677,7 +680,7 @@ void free_route_tree(t_rt_node* rt_node) { rr_node_to_rt_node.at(rt_node->inode) = nullptr; } - free_rt_node(rt_node); + free_rt_node(&rt_node); } void print_route_tree(const t_rt_node* rt_node) { @@ -1056,7 +1059,7 @@ static t_rt_node* prune_route_tree_recurr(t_rt_node* node, CBRR& connections_inf //Record as not reached connections_inf.toreach_rr_sink(node->net_pin_index); - free_rt_node(node); + free_rt_node(&node); return nullptr; //Pruned } } else if (all_children_pruned) { @@ -1102,7 +1105,7 @@ static t_rt_node* prune_route_tree_recurr(t_rt_node* node, CBRR& connections_inf if (reached_non_configurably && !force_prune) { return node; //Not pruned } else { - free_rt_node(node); + free_rt_node(&node); return nullptr; //Pruned } From 27b470db27e1709cf9842b4703e480e545045416 Mon Sep 17 00:00:00 2001 From: amin1377 Date: Sun, 17 Jul 2022 17:23:42 -0400 Subject: [PATCH 2/3] Add comment on why rt_node needs to be set to nullptr --- vpr/src/route/route_tree_timing.cpp | 5 +++-- vpr/src/route/route_tree_timing.h | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/vpr/src/route/route_tree_timing.cpp b/vpr/src/route/route_tree_timing.cpp index bb94f6a3ab3..892e69ae983 100644 --- a/vpr/src/route/route_tree_timing.cpp +++ b/vpr/src/route/route_tree_timing.cpp @@ -144,6 +144,9 @@ alloc_rt_node() { return (rt_node); } +/* After putting the rt_node to the free list, rt_node pointer would be set to + * nullptr to make sure that it does not get double frees if a caller tries to + * free the routing tree twice */ static void free_rt_node(t_rt_node** rt_node) { /* Adds rt_node to the proper free list. */ @@ -659,8 +662,6 @@ bool verify_route_tree_recurr(t_rt_node* node, std::set& seen_nodes) { } void free_route_tree(t_rt_node* rt_node) { - /* Puts the rt_nodes and edges in the tree rooted at rt_node back on the - * free lists. Recursive, depth-first post-order traversal. */ if(rt_node == nullptr) { return; } diff --git a/vpr/src/route/route_tree_timing.h b/vpr/src/route/route_tree_timing.h index b6ca587d86b..f333d058277 100644 --- a/vpr/src/route/route_tree_timing.h +++ b/vpr/src/route/route_tree_timing.h @@ -15,6 +15,10 @@ void free_route_tree_timing_structs(); t_rt_node* init_route_tree_to_source(ClusterNetId inet); +/* +* Puts the rt_nodes and edges in the tree rooted at rt_node back on the +* free lists. Recursive, depth-first post-order traversal. +*/ void free_route_tree(t_rt_node* rt_node); void print_route_tree(const t_rt_node* rt_node); void print_route_tree(const t_rt_node* rt_node, int depth); From e7363038b7f9164085be854f1c05d9b5099d5253 Mon Sep 17 00:00:00 2001 From: amin1377 Date: Tue, 19 Jul 2022 21:44:13 -0400 Subject: [PATCH 3/3] run make format --- vpr/src/route/route_tree_timing.cpp | 2 +- vpr/src/route/route_tree_timing.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/vpr/src/route/route_tree_timing.cpp b/vpr/src/route/route_tree_timing.cpp index 892e69ae983..73504b50fee 100644 --- a/vpr/src/route/route_tree_timing.cpp +++ b/vpr/src/route/route_tree_timing.cpp @@ -662,7 +662,7 @@ bool verify_route_tree_recurr(t_rt_node* node, std::set& seen_nodes) { } void free_route_tree(t_rt_node* rt_node) { - if(rt_node == nullptr) { + if (rt_node == nullptr) { return; } t_linked_rt_edge *rt_edge, *next_edge; diff --git a/vpr/src/route/route_tree_timing.h b/vpr/src/route/route_tree_timing.h index f333d058277..585dd9bfaed 100644 --- a/vpr/src/route/route_tree_timing.h +++ b/vpr/src/route/route_tree_timing.h @@ -16,9 +16,9 @@ void free_route_tree_timing_structs(); t_rt_node* init_route_tree_to_source(ClusterNetId inet); /* -* Puts the rt_nodes and edges in the tree rooted at rt_node back on the -* free lists. Recursive, depth-first post-order traversal. -*/ + * Puts the rt_nodes and edges in the tree rooted at rt_node back on the + * free lists. Recursive, depth-first post-order traversal. + */ void free_route_tree(t_rt_node* rt_node); void print_route_tree(const t_rt_node* rt_node); void print_route_tree(const t_rt_node* rt_node, int depth);