Skip to content

Commit 5699493

Browse files
authored
fix memory leak in geom_fix_object_list via init_prism (#73)
* fix memory leak in geom_fix_object_list via init_prism * whoops * make sure geom_fix_object_ptr is tested
1 parent 88e4254 commit 5699493

2 files changed

Lines changed: 24 additions & 1 deletion

File tree

utils/geom.c

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ static double get_prism_volume(prism *prsm);
8181
static void get_prism_bounding_box(prism *prsm, geom_box *box);
8282
static void display_prism_info(int indentby, geometric_object *o);
8383
static void init_prism(geometric_object *o);
84+
static void reinit_prism(geometric_object *o);
8485
/**************************************************************************/
8586

8687
/* Allows writing to Python's stdout when running from Meep's Python interface */
@@ -157,7 +158,7 @@ void geom_fix_object_ptr(geometric_object *o) {
157158
break;
158159
}
159160
case GEOM PRISM: {
160-
init_prism(o);
161+
reinit_prism(o);
161162
break;
162163
}
163164
case GEOM COMPOUND_GEOMETRIC_OBJECT: {
@@ -2797,6 +2798,8 @@ void init_prism(geometric_object *o) {
27972798
prsm->vertices_top_p.items[nv].x = px;
27982799
prsm->vertices_top_p.items[nv].y = py;
27992800
}
2801+
2802+
free(top_polygon_edges);
28002803
}
28012804

28022805
prsm->top_polygon_diff_vectors_p.num_items = num_vertices;
@@ -2826,6 +2829,20 @@ void init_prism(geometric_object *o) {
28262829
prsm->workspace.items = (double *)malloc((num_vertices + 2) * sizeof(double));
28272830
}
28282831

2832+
/* like init_prism, but works with an already-initialied prism */
2833+
void reinit_prism(geometric_object *o) {
2834+
// these arrays are re-allocated by init_prism
2835+
prism *prsm = o->subclass.prism_data;
2836+
free(prsm->vertices_p.items);
2837+
free(prsm->vertices_top_p.items);
2838+
free(prsm->top_polygon_diff_vectors_p.items);
2839+
free(prsm->top_polygon_diff_vectors_scaled_p.items);
2840+
free(prsm->vertices_top.items);
2841+
free(prsm->workspace.items);
2842+
2843+
init_prism(o);
2844+
}
2845+
28292846
/***************************************************************/
28302847
/* routines called from C++ or python codes to create prisms */
28312848
/***************************************************************/

utils/test-prism.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,7 @@ int test_square_base_sidewall_prisms_to_gnuplot() {
480480

481481
double normal_sidewall = 0;
482482
geometric_object square_normal_sidewall_geom_object = make_prism(m, nodes_square, num_nodes_square, height_square, zhat);
483+
geom_fix_object_ptr(&square_normal_sidewall_geom_object);
483484
prism *square_normal_sidewall_prism = square_normal_sidewall_geom_object.subclass.prism_data;
484485

485486
double one_degree_sidewall = 1.0 * 2 * K_PI / 360.0;
@@ -524,6 +525,7 @@ int test_octagon_c_base_sidewall_prisms_to_gnuplot() {
524525

525526
double normal_sidewall = 0;
526527
geometric_object octagon_c_normal_sidewall_geom_object = make_prism(m, nodes_octagon_c, num_nodes_octagon_c, height_octagon_c, zhat);
528+
geom_fix_object_ptr(&octagon_c_normal_sidewall_geom_object);
527529
prism *octagon_c_normal_sidewall_prism = octagon_c_normal_sidewall_geom_object.subclass.prism_data;
528530

529531
double two_half_degree_sidewall = 2.5 * 2 * K_PI / 360.0;
@@ -575,6 +577,7 @@ int test_helper_functions_on_octagonal_c_prism() {
575577

576578
double normal_sidewall = 0;
577579
geometric_object octagon_c_normal_sidewall_geom_object = make_prism(m, nodes_octagon_c, num_nodes_octagon_c, height_octagon_c, zhat);
580+
geom_fix_object_ptr(&octagon_c_normal_sidewall_geom_object);
578581
prism *octagon_c_normal_sidewall_prism = octagon_c_normal_sidewall_geom_object.subclass.prism_data;
579582

580583
double two_half_degree_sidewall = 2.5 * 2 * K_PI / 360.0;
@@ -1121,6 +1124,8 @@ int run_unit_tests() {
11211124

11221125
geometric_object the_block = make_block(m, c, xhat, yhat, zhat, size);
11231126
geometric_object the_prism = make_prism(m, v, 4, LZ, zhat);
1127+
geom_fix_object_ptr(&the_block);
1128+
geom_fix_object_ptr(&the_prism);
11241129

11251130
/***************************************************************/
11261131
/* with probability P_SHIFT, shift the centers of both block */
@@ -1265,6 +1270,7 @@ int main(int argc, char *argv[]) {
12651270
fclose(f);
12661271

12671272
geometric_object the_prism = make_prism(NULL, vertices, num_vertices, height, axis);
1273+
geom_fix_object_ptr(&the_prism);
12681274
prism *prsm = the_prism.subclass.prism_data;
12691275
prism2gmsh(prsm, "test-prism.pp");
12701276
prism2gnuplot(prsm, "test-prism.gp");

0 commit comments

Comments
 (0)