From 95efa8296b60bd6405d1098f950b269decbddd17 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Thu, 12 Sep 2019 12:22:42 +0200 Subject: Allocate patches separately. Avoids accessing stale pointers after realloc. --- src/qms.c | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/qms.c b/src/qms.c index d782d0c..c22cc97 100644 --- a/src/qms.c +++ b/src/qms.c @@ -84,7 +84,7 @@ typedef struct QMSMGContext { int solve_level; int boundary_offset; - CoordPatch *patches; + CoordPatch **patches; int nb_patches; /* timings */ @@ -226,6 +226,15 @@ static void get_extents(size_t **pextents, int *level_size, cGH *gh) } static CoordPatch *get_coord_patch(QMSMGContext *ms, int level) +{ + for (int i = 0; i < ms->nb_patches; i++) + if (ms->patches[i]->level == level) + return ms->patches[i]; + + return NULL; +} + +static int alloc_coord_patch(QMSMGContext *ms, int level) { cGH *gh = ms->gh; @@ -252,16 +261,12 @@ static CoordPatch *get_coord_patch(QMSMGContext *ms, int level) MG2DContext *solver; int i, ret; - for (int i = 0; i < ms->nb_patches; i++) { - cp = &ms->patches[i]; - - if (cp->level == level) - return cp; - } + cp = calloc(1, sizeof(*cp)); + if (!cp) + CCTK_WARN(0, "Error allocating patch"); - /* create a new patch */ ms->patches = realloc(ms->patches, sizeof(*ms->patches) * (ms->nb_patches + 1)); - cp = &ms->patches[ms->nb_patches]; + ms->patches[ms->nb_patches] = cp; memset(cp, 0, sizeof(*cp)); @@ -403,15 +408,23 @@ finish: free(extents); ms->nb_patches++; - return cp; + return 0; } -static void coord_patch_free(CoordPatch *cp) +static void coord_patch_free(CoordPatch **pcp) { + CoordPatch *cp = *pcp; + + if (!cp) + return; + mg2d_solver_free(&cp->solver); if (cp->solver_comm != MPI_COMM_NULL) MPI_Comm_free(&cp->solver_comm); + + free(cp); + *pcp = NULL; } static void print_stats(QMSMGContext *ms) @@ -1593,6 +1606,8 @@ void qms_mg_init(CCTK_ARGUMENTS) if (ret < 0) CCTK_WARN(0, "Error initializing the solver context"); } + + alloc_coord_patch(qms_context, reflevel); } void qms_mg_inithist(CCTK_ARGUMENTS) -- cgit v1.2.3