diff --git a/src/pio_server.c b/src/pio_server.c index 13170d3b44fc83e52e76f7bbfd1dfca9edb11194..1998e772074fab7014caa195d594fcebb92f7c0e 100644 --- a/src/pio_server.c +++ b/src/pio_server.c @@ -1375,15 +1375,11 @@ writeGribStream(size_t streamIdx, : false; struct cacheRedist *restrict retained = rxWin[streamIdx].retained; struct passDict *varsInPass = NULL; - size_t varsInPassSize = 0; + size_t varsInPassSize = 0, maxNumVarsAlloc = 0; MPI_Aint *displ = NULL; const struct winHeaderEntry *winDict = (wHECast)clientBuf[0].mem; for (size_t pass = 0; pass < numPasses; ++pass) { - size_t numVarsInPass - = buildPassVarDict(collSize, passes[pass], writtenRecords, - &varsInPassSize, &varsInPass); - varRedists = Realloc(varRedists, numVarsInPass * sizeof (*varRedists)); size_t myRecordStart = passes[pass][collRank].recordAggStart, myRecordEnd = passes[pass][collRank].recordAggEnd; size_t myAggSize = 0; @@ -1396,9 +1392,19 @@ writeGribStream(size_t streamIdx, } else { + size_t numVarsInPass + = buildPassVarDict(collSize, passes[pass], writtenRecords, + &varsInPassSize, &varsInPass); int myVarStart = passes[pass][collRank].varStart, myVarEnd = passes[pass][collRank].varEnd; - displ = Realloc(displ, sizeof (*displ) * (numVarsInPass * 2 + 1)); + if (numVarsInPass > maxNumVarsAlloc) + { + maxNumVarsAlloc = numVarsInPass; + varRedists + = Realloc(varRedists, numVarsInPass * sizeof (*varRedists)); + displ + = Realloc(displ, (numVarsInPass * 2 + 1) * sizeof (*displ)); + } memset(displ, 0, sizeof (*displ) * (numVarsInPass + 1)); for (size_t varIdx = 0; varIdx < numVarsInPass; ++varIdx) {