summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2019-09-12 12:22:42 +0200
committerAnton Khirnov <anton@khirnov.net>2019-09-12 12:22:42 +0200
commit95efa8296b60bd6405d1098f950b269decbddd17 (patch)
treef397ab1aa50a11ca6eb364a3d694cb44fcdc2795
parentbc7d230e517e25303680c4cbe367a15769d16e7c (diff)
Allocate patches separately.
Avoids accessing stale pointers after realloc.
-rw-r--r--src/qms.c37
1 files 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 */
@@ -227,6 +227,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;
const char *omp_threads = getenv("OMP_NUM_THREADS");
@@ -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)