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