@@ -45,7 +45,7 @@ static t_linked_rt_edge* rt_edge_free_list = nullptr;
4545
4646static t_rt_node* alloc_rt_node ();
4747
48- static void free_rt_node (t_rt_node* rt_node);
48+ static void free_rt_node (t_rt_node** rt_node);
4949
5050static t_linked_rt_edge* alloc_linked_rt_edge ();
5151
@@ -144,11 +144,15 @@ alloc_rt_node() {
144144 return (rt_node);
145145}
146146
147- static void free_rt_node (t_rt_node* rt_node) {
147+ /* After putting the rt_node to the free list, rt_node pointer would be set to
148+ * nullptr to make sure that it does not get double frees if a caller tries to
149+ * free the routing tree twice */
150+ static void free_rt_node (t_rt_node** rt_node) {
148151 /* Adds rt_node to the proper free list. */
149152
150- rt_node->u .next = rt_node_free_list;
151- rt_node_free_list = rt_node;
153+ (*rt_node)->u .next = rt_node_free_list;
154+ rt_node_free_list = (*rt_node);
155+ (*rt_node) = nullptr ;
152156}
153157
154158static t_linked_rt_edge*
@@ -658,9 +662,9 @@ bool verify_route_tree_recurr(t_rt_node* node, std::set<int>& seen_nodes) {
658662}
659663
660664void free_route_tree (t_rt_node* rt_node) {
661- /* Puts the rt_nodes and edges in the tree rooted at rt_node back on the
662- * free lists. Recursive, depth-first post-order traversal. */
663-
665+ if ( rt_node == nullptr ) {
666+ return ;
667+ }
664668 t_linked_rt_edge *rt_edge, *next_edge;
665669
666670 rt_edge = rt_node->u .child_list ;
@@ -677,7 +681,7 @@ void free_route_tree(t_rt_node* rt_node) {
677681 rr_node_to_rt_node.at (rt_node->inode ) = nullptr ;
678682 }
679683
680- free_rt_node (rt_node);
684+ free_rt_node (& rt_node);
681685}
682686
683687void print_route_tree (const t_rt_node* rt_node) {
@@ -1056,7 +1060,7 @@ static t_rt_node* prune_route_tree_recurr(t_rt_node* node, CBRR& connections_inf
10561060 // Record as not reached
10571061 connections_inf.toreach_rr_sink (node->net_pin_index );
10581062
1059- free_rt_node (node);
1063+ free_rt_node (& node);
10601064 return nullptr ; // Pruned
10611065 }
10621066 } else if (all_children_pruned) {
@@ -1102,7 +1106,7 @@ static t_rt_node* prune_route_tree_recurr(t_rt_node* node, CBRR& connections_inf
11021106 if (reached_non_configurably && !force_prune) {
11031107 return node; // Not pruned
11041108 } else {
1105- free_rt_node (node);
1109+ free_rt_node (& node);
11061110 return nullptr ; // Pruned
11071111 }
11081112
0 commit comments