From 662169b1d9dfae2a257506ebca51e5ca39440d89 Mon Sep 17 00:00:00 2001 From: Thomas Jahns <jahns@dkrz.de> Date: Tue, 6 Mar 2018 01:52:56 +0100 Subject: [PATCH] Only perform computation and reallocation when actually needed. --- src/pio_server.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/pio_server.c b/src/pio_server.c index 13170d3b4..1998e7720 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) { -- GitLab