@@ -45,7 +45,7 @@ static t_linked_rt_edge* rt_edge_free_list = nullptr;
45
45
46
46
static t_rt_node* alloc_rt_node ();
47
47
48
- static void free_rt_node (t_rt_node* rt_node);
48
+ static void free_rt_node (t_rt_node** rt_node);
49
49
50
50
static t_linked_rt_edge* alloc_linked_rt_edge ();
51
51
@@ -144,11 +144,15 @@ alloc_rt_node() {
144
144
return (rt_node);
145
145
}
146
146
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) {
148
151
/* Adds rt_node to the proper free list. */
149
152
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 ;
152
156
}
153
157
154
158
static t_linked_rt_edge*
@@ -658,9 +662,9 @@ bool verify_route_tree_recurr(t_rt_node* node, std::set<int>& seen_nodes) {
658
662
}
659
663
660
664
void 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
+ }
664
668
t_linked_rt_edge *rt_edge, *next_edge;
665
669
666
670
rt_edge = rt_node->u .child_list ;
@@ -677,7 +681,7 @@ void free_route_tree(t_rt_node* rt_node) {
677
681
rr_node_to_rt_node.at (rt_node->inode ) = nullptr ;
678
682
}
679
683
680
- free_rt_node (rt_node);
684
+ free_rt_node (& rt_node);
681
685
}
682
686
683
687
void 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
1056
1060
// Record as not reached
1057
1061
connections_inf.toreach_rr_sink (node->net_pin_index );
1058
1062
1059
- free_rt_node (node);
1063
+ free_rt_node (& node);
1060
1064
return nullptr ; // Pruned
1061
1065
}
1062
1066
} else if (all_children_pruned) {
@@ -1102,7 +1106,7 @@ static t_rt_node* prune_route_tree_recurr(t_rt_node* node, CBRR& connections_inf
1102
1106
if (reached_non_configurably && !force_prune) {
1103
1107
return node; // Not pruned
1104
1108
} else {
1105
- free_rt_node (node);
1109
+ free_rt_node (& node);
1106
1110
return nullptr ; // Pruned
1107
1111
}
1108
1112
0 commit comments