<html lang='en'>
<head>
<meta content='text/html; charset=utf-8' http-equiv='Content-Type'>
<title>
GitLab
</title>
</meta>
</head>
<style>
  img {
    max-width: 100%;
    height: auto;
  }
  p.details {
    font-style:italic;
    color:#777
  }
  .footer p {
    font-size:small;
    color:#777
  }
  pre.commit-message {
    white-space: pre-wrap;
  }
  .file-stats a {
    text-decoration: none;
  }
  .file-stats .new-file {
    color: #090;
  }
  .file-stats .deleted-file {
    color: #B00;
  }
</style>
<body>
<div class='content'>
<h3>Shane Snyder pushed to branch mmap-dev at <a href="https://xgitlab.cels.anl.gov/darshan/darshan">darshan / darshan</a></h3>
<h4>
Commits:
</h4>
<ul>
<li>
<strong><a href="https://xgitlab.cels.anl.gov/darshan/darshan/commit/f57f753c8cdabf70c0401b43ad2c724b1b45b71d">f57f753c</a></strong>
<div>
<span>by Shane Snyder</span>
<i>at 2016-01-20T16:03:28Z</i>
</div>
<pre class='commit-message'>bug fixes from merge of mmap-dev to dev-modular</pre>
</li>
<li>
<strong><a href="https://xgitlab.cels.anl.gov/darshan/darshan/commit/10c3b1075cd91b99c4f54075f860b9dbe176c529">10c3b107</a></strong>
<div>
<span>by Shane Snyder</span>
<i>at 2016-01-20T22:21:28Z</i>
</div>
<pre class='commit-message'>bug fix in log aggregation tool</pre>
</li>
<li>
<strong><a href="https://xgitlab.cels.anl.gov/darshan/darshan/commit/d3ebeb50a7b5adbadd02ef6da5a70bb5360da3ac">d3ebeb50</a></strong>
<div>
<span>by Shane Snyder</span>
<i>at 2016-01-20T22:21:43Z</i>
</div>
<pre class='commit-message'>add aggregation capability to i/o modules</pre>
</li>
</ul>
<h4>11 changed files:</h4>
<ul>
<li class='file-stats'>
<a href='#diff-0'>
darshan-runtime/darshan.h
</a>
</li>
<li class='file-stats'>
<a href='#diff-1'>
darshan-runtime/lib/darshan-core.c
</a>
</li>
<li class='file-stats'>
<a href='#diff-2'>
darshan-runtime/lib/darshan-hdf5.c
</a>
</li>
<li class='file-stats'>
<a href='#diff-3'>
darshan-runtime/lib/darshan-mpiio.c
</a>
</li>
<li class='file-stats'>
<a href='#diff-4'>
darshan-runtime/lib/darshan-null.c
</a>
</li>
<li class='file-stats'>
<a href='#diff-5'>
darshan-runtime/lib/darshan-pnetcdf.c
</a>
</li>
<li class='file-stats'>
<a href='#diff-6'>
darshan-runtime/lib/darshan-posix.c
</a>
</li>
<li class='file-stats'>
<a href='#diff-7'>
darshan-util/darshan-hdf5-logutils.c
</a>
</li>
<li class='file-stats'>
<a href='#diff-8'>
darshan-util/darshan-mpiio-logutils.c
</a>
</li>
<li class='file-stats'>
<a href='#diff-9'>
darshan-util/darshan-pnetcdf-logutils.c
</a>
</li>
<li class='file-stats'>
<a href='#diff-10'>
darshan-util/darshan-stitch-logs.c
</a>
</li>
</ul>
<h4>Changes:</h4>
<li id='diff-0'>
<a href='https://xgitlab.cels.anl.gov/darshan/darshan/compare/96801d4a5894134dd47159b4f5cf9c31e797d4b5...d3ebeb50a7b5adbadd02ef6da5a70bb5360da3ac#diff-0'>
<strong>
darshan-runtime/darshan.h
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/darshan-runtime/darshan.h
</span><span style="color: #000000;background-color: #ddffdd">+++ b/darshan-runtime/darshan.h
</span><span style="color: #aaaaaa">@@ -144,17 +144,6 @@ int darshan_core_register_record(
</span>     int rec_size,
     int *file_alignment);
 
-/* darshan_core_unregister_record()
<span style="color: #000000;background-color: #ffdddd">- *
- * Unregister record identifier 'rec_id' in the darshan-core runtime.
- * This unregister is only in the context of module identifier 'mod_id',
- * meaning that if the file record has other module's associated with
- * it, then the record won't be completely removed.
- */
</span>-void darshan_core_unregister_record(
<span style="color: #000000;background-color: #ffdddd">-    darshan_record_id rec_id,
-    darshan_module_id mod_id);
</span>-
 /* darshan_core_wtime()
  *
  * Returns the elapsed time relative to (roughly) the start of
</code></pre>

<br>
</li>
<li id='diff-1'>
<a href='https://xgitlab.cels.anl.gov/darshan/darshan/compare/96801d4a5894134dd47159b4f5cf9c31e797d4b5...d3ebeb50a7b5adbadd02ef6da5a70bb5360da3ac#diff-1'>
<strong>
darshan-runtime/lib/darshan-core.c
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/darshan-runtime/lib/darshan-core.c
</span><span style="color: #000000;background-color: #ddffdd">+++ b/darshan-runtime/lib/darshan-core.c
</span><span style="color: #aaaaaa">@@ -1551,7 +1551,6 @@ static void darshan_core_cleanup(struct darshan_core_runtime* core)
</span>     HASH_ITER(hlink, core->rec_hash, ref, tmp)
     {
         HASH_DELETE(hlink, core->rec_hash, ref);
<span style="color: #000000;background-color: #ffdddd">-        /* XXX MMAP:  free(ref->rec.name); */
</span>         free(ref);
     }
 
<span style="color: #aaaaaa">@@ -1599,6 +1598,14 @@ void darshan_core_register_module(
</span>         return;
     }
 
<span style="color: #000000;background-color: #ddffdd">+    mod = malloc(sizeof(*mod));
+    if(!mod)
+    {
+        DARSHAN_CORE_UNLOCK();
+        return;
+    }
+    memset(mod, 0, sizeof(*mod));
+
</span>     /* assign a buffer from Darshan's contiguous module memory range for
      * this module to use for storing record data
      */
<span style="color: #aaaaaa">@@ -1607,25 +1614,18 @@ void darshan_core_register_module(
</span>         *inout_mod_size = mod_mem_req;
     else
         *inout_mod_size = mod_mem_avail;
-
     *mod_buf = darshan_core->log_mod_p + darshan_core->mod_mem_used;
<span style="color: #000000;background-color: #ffdddd">-    darshan_core->mod_mem_used += *inout_mod_size;
-    darshan_core->log_hdr_p->mod_map[mod_id].off =
-        ((char *)*mod_buf - (char *)darshan_core->log_hdr_p);
</span> 
<span style="color: #000000;background-color: #ffdddd">-    mod = malloc(sizeof(*mod));
-    if(!mod)
-    {
-        DARSHAN_CORE_UNLOCK();
-        return;
-    }
-    memset(mod, 0, sizeof(*mod));
</span><span style="color: #000000;background-color: #ddffdd">+    /* register module with darshan */
</span>     mod->mod_funcs = *funcs;
     mod->mem_avail = *inout_mod_size;
-
<span style="color: #000000;background-color: #ffdddd">-    /* register module with darshan */
</span>     darshan_core->mod_array[mod_id] = mod;
<span style="color: #000000;background-color: #ddffdd">+
+    /* update darshan header and internal structures */
</span>     darshan_core->log_hdr_p->mod_ver[mod_id] = darshan_module_versions[mod_id];
<span style="color: #000000;background-color: #ddffdd">+    darshan_core->log_hdr_p->mod_map[mod_id].off =
+        ((char *)*mod_buf - (char *)darshan_core->log_hdr_p);
+    darshan_core->mod_mem_used += *inout_mod_size;
</span>     DARSHAN_CORE_UNLOCK();
 
     /* set the memory alignment and calling process's rank, if desired */
<span style="color: #aaaaaa">@@ -1637,7 +1637,6 @@ void darshan_core_register_module(
</span>     return;
 }
 
-/* TODO: test */
 void darshan_core_unregister_module(
     darshan_module_id mod_id)
 {
<span style="color: #aaaaaa">@@ -1651,11 +1650,20 @@ void darshan_core_unregister_module(
</span>     /* iterate all records and disassociate this module from them */
     HASH_ITER(hlink, darshan_core->rec_hash, ref, tmp)
     {
<span style="color: #000000;background-color: #ffdddd">-        darshan_core_unregister_record(ref->id, mod_id);
</span><span style="color: #000000;background-color: #ddffdd">+        /* disassociate this module from the given record id */
+        DARSHAN_MOD_FLAG_UNSET(ref->mod_flags, mod_id);
+        if(!(ref->mod_flags))
+        {
+            /* if no other modules are associated with this rec, delete it */
+            HASH_DELETE(hlink, darshan_core->rec_hash, ref);
+        }
</span>     }
 
<span style="color: #000000;background-color: #ddffdd">+    /* update darshan internal structures and header */
</span>     free(darshan_core->mod_array[mod_id]);
     darshan_core->mod_array[mod_id] = NULL;
<span style="color: #000000;background-color: #ddffdd">+    darshan_core->log_hdr_p->mod_map[mod_id].off =
+        darshan_core->log_hdr_p->mod_map[mod_id].len = 0;
</span> 
     DARSHAN_CORE_UNLOCK();
 
<span style="color: #aaaaaa">@@ -1741,25 +1749,6 @@ void darshan_core_unregister_record(
</span>     darshan_record_id rec_id,
     darshan_module_id mod_id)
 {
<span style="color: #000000;background-color: #ffdddd">-    struct darshan_core_record_ref *ref;
</span>-
<span style="color: #000000;background-color: #ffdddd">-    if(!darshan_core)
-        return;
</span>-
<span style="color: #000000;background-color: #ffdddd">-    DARSHAN_CORE_LOCK();
-    HASH_FIND(hlink, darshan_core->rec_hash, &rec_id, sizeof(darshan_record_id), ref);
-    assert(ref); 
</span>-
<span style="color: #000000;background-color: #ffdddd">-    /* disassociate this module from the given record id */
-    DARSHAN_MOD_FLAG_UNSET(ref->mod_flags, mod_id);
-    if(!(ref->mod_flags))
-    {
-        /* if no other modules are associated with this rec, delete it */
-        HASH_DELETE(hlink, darshan_core->rec_hash, ref);
-    }
-    DARSHAN_CORE_UNLOCK();
</span>-
<span style="color: #000000;background-color: #ffdddd">-    return;
</span> }
 
 double darshan_core_wtime()
</code></pre>

<br>
</li>
<li id='diff-2'>
<a href='https://xgitlab.cels.anl.gov/darshan/darshan/compare/96801d4a5894134dd47159b4f5cf9c31e797d4b5...d3ebeb50a7b5adbadd02ef6da5a70bb5360da3ac#diff-2'>
<strong>
darshan-runtime/lib/darshan-hdf5.c
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/darshan-runtime/lib/darshan-hdf5.c
</span><span style="color: #000000;background-color: #ddffdd">+++ b/darshan-runtime/lib/darshan-hdf5.c
</span><span style="color: #aaaaaa">@@ -209,6 +209,9 @@ static void hdf5_runtime_initialize()
</span>     if(hdf5_runtime || instrumentation_disabled)
         return;
 
<span style="color: #000000;background-color: #ddffdd">+    /* try and store the default number of records for this module */
+    hdf5_buf_size = DARSHAN_DEF_MOD_REC_COUNT * sizeof(struct darshan_hdf5_file);
+
</span>     /* register hdf5 module with darshan-core */
     darshan_core_register_module(
         DARSHAN_HDF5_MOD,
<span style="color: #aaaaaa">@@ -220,11 +223,17 @@ static void hdf5_runtime_initialize()
</span> 
     /* return if darshan-core does not provide enough module memory */
     if(hdf5_buf_size < sizeof(struct darshan_hdf5_file))
<span style="color: #000000;background-color: #ddffdd">+    {
+        darshan_core_unregister_module(DARSHAN_HDF5_MOD);
</span>         return;
<span style="color: #000000;background-color: #ddffdd">+    }
</span> 
     hdf5_runtime = malloc(sizeof(*hdf5_runtime));
     if(!hdf5_runtime)
<span style="color: #000000;background-color: #ddffdd">+    {
+        darshan_core_unregister_module(DARSHAN_HDF5_MOD);
</span>         return;
<span style="color: #000000;background-color: #ddffdd">+    }
</span>     memset(hdf5_runtime, 0, sizeof(*hdf5_runtime));
 
     /* set number of trackable files for the HDF5 module according to the
<span style="color: #aaaaaa">@@ -567,7 +576,6 @@ static void hdf5_shutdown()
</span>     HASH_CLEAR(hlink, hdf5_runtime->file_hash); /* these entries are freed all at once below */
 
     free(hdf5_runtime->file_runtime_array);
<span style="color: #000000;background-color: #ffdddd">-    free(hdf5_runtime->file_record_array);
</span>     free(hdf5_runtime);
     hdf5_runtime = NULL;
 
</code></pre>

<br>
</li>
<li id='diff-3'>
<a href='https://xgitlab.cels.anl.gov/darshan/darshan/compare/96801d4a5894134dd47159b4f5cf9c31e797d4b5...d3ebeb50a7b5adbadd02ef6da5a70bb5360da3ac#diff-3'>
<strong>
darshan-runtime/lib/darshan-mpiio.c
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/darshan-runtime/lib/darshan-mpiio.c
</span><span style="color: #000000;background-color: #ddffdd">+++ b/darshan-runtime/lib/darshan-mpiio.c
</span><span style="color: #aaaaaa">@@ -846,11 +846,17 @@ static void mpiio_runtime_initialize()
</span> 
     /* return if darshan-core does not provide enough module memory */
     if(mpiio_buf_size < sizeof(struct darshan_mpiio_file))
<span style="color: #000000;background-color: #ddffdd">+    {
+        darshan_core_unregister_module(DARSHAN_MPIIO_MOD);
</span>         return;
<span style="color: #000000;background-color: #ddffdd">+    }
</span> 
     mpiio_runtime = malloc(sizeof(*mpiio_runtime));
     if(!mpiio_runtime)
<span style="color: #000000;background-color: #ddffdd">+    {
+        darshan_core_unregister_module(DARSHAN_MPIIO_MOD);
</span>         return;
<span style="color: #000000;background-color: #ddffdd">+    }
</span>     memset(mpiio_runtime, 0, sizeof(*mpiio_runtime));
 
     /* set number of trackable files for the MPIIO module according to the
</code></pre>

<br>
</li>
<li id='diff-4'>
<a href='https://xgitlab.cels.anl.gov/darshan/darshan/compare/96801d4a5894134dd47159b4f5cf9c31e797d4b5...d3ebeb50a7b5adbadd02ef6da5a70bb5360da3ac#diff-4'>
<strong>
darshan-runtime/lib/darshan-null.c
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/darshan-runtime/lib/darshan-null.c
</span><span style="color: #000000;background-color: #ddffdd">+++ b/darshan-runtime/lib/darshan-null.c
</span><span style="color: #aaaaaa">@@ -388,7 +388,6 @@ static void null_shutdown()
</span>     HASH_CLEAR(hlink, null_runtime->record_hash); /* these hash entries are freed all at once below */
 
     free(null_runtime->runtime_record_array);
<span style="color: #000000;background-color: #ffdddd">-    free(null_runtime->record_array);
</span>     free(null_runtime);
     null_runtime = NULL;
 
</code></pre>

<br>
</li>
<li id='diff-5'>
<a href='https://xgitlab.cels.anl.gov/darshan/darshan/compare/96801d4a5894134dd47159b4f5cf9c31e797d4b5...d3ebeb50a7b5adbadd02ef6da5a70bb5360da3ac#diff-5'>
<strong>
darshan-runtime/lib/darshan-pnetcdf.c
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/darshan-runtime/lib/darshan-pnetcdf.c
</span><span style="color: #000000;background-color: #ddffdd">+++ b/darshan-runtime/lib/darshan-pnetcdf.c
</span><span style="color: #aaaaaa">@@ -235,11 +235,17 @@ static void pnetcdf_runtime_initialize()
</span> 
     /* return if darshan-core does not provide enough module memory */
     if(pnetcdf_buf_size < sizeof(struct darshan_pnetcdf_file))
<span style="color: #000000;background-color: #ddffdd">+    {
+        darshan_core_unregister_module(DARSHAN_PNETCDF_MOD);
</span>         return;
<span style="color: #000000;background-color: #ddffdd">+    }
</span> 
     pnetcdf_runtime = malloc(sizeof(*pnetcdf_runtime));
     if(!pnetcdf_runtime)
<span style="color: #000000;background-color: #ddffdd">+    {
+        darshan_core_unregister_module(DARSHAN_PNETCDF_MOD);
</span>         return;
<span style="color: #000000;background-color: #ddffdd">+    }
</span>     memset(pnetcdf_runtime, 0, sizeof(*pnetcdf_runtime));
 
     /* set number of trackable files for the PNETCDF module according to the
<span style="color: #aaaaaa">@@ -582,7 +588,6 @@ static void pnetcdf_shutdown()
</span>     HASH_CLEAR(hlink, pnetcdf_runtime->file_hash); /* these entries are freed all at once below */
 
     free(pnetcdf_runtime->file_runtime_array);
<span style="color: #000000;background-color: #ffdddd">-    free(pnetcdf_runtime->file_record_array);
</span>     free(pnetcdf_runtime);
     pnetcdf_runtime = NULL;
 
</code></pre>

<br>
</li>
<li id='diff-6'>
<a href='https://xgitlab.cels.anl.gov/darshan/darshan/compare/96801d4a5894134dd47159b4f5cf9c31e797d4b5...d3ebeb50a7b5adbadd02ef6da5a70bb5360da3ac#diff-6'>
<strong>
darshan-runtime/lib/darshan-posix.c
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/darshan-runtime/lib/darshan-posix.c
</span><span style="color: #000000;background-color: #ddffdd">+++ b/darshan-runtime/lib/darshan-posix.c
</span><span style="color: #aaaaaa">@@ -1641,11 +1641,17 @@ static void posix_runtime_initialize()
</span> 
     /* return if darshan-core does not provide enough module memory */
     if(psx_buf_size < sizeof(struct darshan_posix_file))
<span style="color: #000000;background-color: #ddffdd">+    {
+        darshan_core_unregister_module(DARSHAN_POSIX_MOD);
</span>         return;
<span style="color: #000000;background-color: #ddffdd">+    }
</span> 
     posix_runtime = malloc(sizeof(*posix_runtime));
     if(!posix_runtime)
<span style="color: #000000;background-color: #ddffdd">+    {
+        darshan_core_unregister_module(DARSHAN_POSIX_MOD);
</span>         return;
<span style="color: #000000;background-color: #ddffdd">+    }
</span>     memset(posix_runtime, 0, sizeof(*posix_runtime));
 
     /* set number of trackable files for the POSIX module according to the
</code></pre>

<br>
</li>
<li id='diff-7'>
<a href='https://xgitlab.cels.anl.gov/darshan/darshan/compare/96801d4a5894134dd47159b4f5cf9c31e797d4b5...d3ebeb50a7b5adbadd02ef6da5a70bb5360da3ac#diff-7'>
<strong>
darshan-util/darshan-hdf5-logutils.c
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/darshan-util/darshan-hdf5-logutils.c
</span><span style="color: #000000;background-color: #ddffdd">+++ b/darshan-util/darshan-hdf5-logutils.c
</span><span style="color: #aaaaaa">@@ -204,6 +204,50 @@ static void darshan_log_print_hdf5_file_diff(void *file_rec1, char *file_name1,
</span> 
 static void darshan_log_agg_hdf5_files(void *rec, void *agg_rec, int init_flag)
 {
<span style="color: #000000;background-color: #ddffdd">+    struct darshan_hdf5_file *hdf5_rec = (struct darshan_hdf5_file *)rec;
+    struct darshan_hdf5_file *agg_hdf5_rec = (struct darshan_hdf5_file *)agg_rec;
+    int i;
+
+    for(i = 0; i < HDF5_NUM_INDICES; i++)
+    {
+        switch(i)
+        {
+            case HDF5_OPENS:
+                /* sum */
+                agg_hdf5_rec->counters[i] += hdf5_rec->counters[i];
+                break;
+            default:
+                agg_hdf5_rec->counters[i] = -1;
+                break;
+        }
+    }
+
+    for(i = 0; i < HDF5_F_NUM_INDICES; i++)
+    {
+        switch(i)
+        {
+            case HDF5_F_OPEN_TIMESTAMP:
+                /* minimum non-zero */
+                if((hdf5_rec->fcounters[i] > 0)  &&
+                    ((agg_hdf5_rec->fcounters[i] == 0) ||
+                    (hdf5_rec->fcounters[i] < agg_hdf5_rec->fcounters[i])))
+                {
+                    agg_hdf5_rec->fcounters[i] = hdf5_rec->fcounters[i];
+                }
+                break;
+            case HDF5_F_CLOSE_TIMESTAMP:
+                /* maximum */
+                if(hdf5_rec->fcounters[i] > agg_hdf5_rec->fcounters[i])
+                {
+                    agg_hdf5_rec->fcounters[i] = hdf5_rec->fcounters[i];
+                }
+                break;
+            default:
+                agg_hdf5_rec->fcounters[i] = -1;
+                break;
+        }
+    }
+
</span>     return;
 }
 
</code></pre>

<br>
</li>
<li id='diff-8'>
<a href='https://xgitlab.cels.anl.gov/darshan/darshan/compare/96801d4a5894134dd47159b4f5cf9c31e797d4b5...d3ebeb50a7b5adbadd02ef6da5a70bb5360da3ac#diff-8'>
<strong>
darshan-util/darshan-mpiio-logutils.c
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/darshan-util/darshan-mpiio-logutils.c
</span><span style="color: #000000;background-color: #ddffdd">+++ b/darshan-util/darshan-mpiio-logutils.c
</span><span style="color: #aaaaaa">@@ -226,6 +226,170 @@ static void darshan_log_print_mpiio_file_diff(void *file_rec1, char *file_name1,
</span> 
 static void darshan_log_agg_mpiio_files(void *rec, void *agg_rec, int init_flag)
 {
<span style="color: #000000;background-color: #ddffdd">+    struct darshan_mpiio_file *mpi_rec = (struct darshan_mpiio_file *)rec;
+    struct darshan_mpiio_file *agg_mpi_rec = (struct darshan_mpiio_file *)agg_rec;
+    int i;
+    double mpi_time = mpi_rec->fcounters[MPIIO_F_READ_TIME] +
+        mpi_rec->fcounters[MPIIO_F_WRITE_TIME] +
+        mpi_rec->fcounters[MPIIO_F_META_TIME];
+
+    /* special case initialization of shared record for
+     * first call of this function
+     */
+    if(init_flag)
+    {
+        /* set fastest/slowest rank counters according to root rank.
+         * these counters will be determined as the aggregation progresses.
+         */
+        agg_mpi_rec->counters[MPIIO_FASTEST_RANK] = mpi_rec->base_rec.rank;
+        agg_mpi_rec->counters[MPIIO_FASTEST_RANK_BYTES] =
+            mpi_rec->counters[MPIIO_BYTES_READ] +
+            mpi_rec->counters[MPIIO_BYTES_WRITTEN];
+        agg_mpi_rec->fcounters[MPIIO_F_FASTEST_RANK_TIME] = mpi_time;
+
+        agg_mpi_rec->counters[MPIIO_SLOWEST_RANK] =
+            agg_mpi_rec->counters[MPIIO_FASTEST_RANK];
+        agg_mpi_rec->counters[MPIIO_SLOWEST_RANK_BYTES] =
+            agg_mpi_rec->counters[MPIIO_FASTEST_RANK_BYTES];
+        agg_mpi_rec->fcounters[MPIIO_F_SLOWEST_RANK_TIME] =
+            agg_mpi_rec->fcounters[MPIIO_F_FASTEST_RANK_TIME];
+    }
+
+    for(i = 0; i < MPIIO_NUM_INDICES; i++)
+    {
+        switch(i)
+        {
+            case MPIIO_INDEP_OPENS:
+            case MPIIO_COLL_OPENS:
+            case MPIIO_INDEP_READS:
+            case MPIIO_INDEP_WRITES:
+            case MPIIO_COLL_READS:
+            case MPIIO_COLL_WRITES:
+            case MPIIO_SPLIT_READS:
+            case MPIIO_SPLIT_WRITES:
+            case MPIIO_NB_READS:
+            case MPIIO_NB_WRITES:
+            case MPIIO_SYNCS:
+            case MPIIO_HINTS:
+            case MPIIO_VIEWS:
+            case MPIIO_BYTES_READ:
+            case MPIIO_BYTES_WRITTEN:
+            case MPIIO_RW_SWITCHES:
+            case MPIIO_SIZE_READ_AGG_0_100:
+            case MPIIO_SIZE_READ_AGG_100_1K:
+            case MPIIO_SIZE_READ_AGG_1K_10K:
+            case MPIIO_SIZE_READ_AGG_10K_100K:
+            case MPIIO_SIZE_READ_AGG_100K_1M:
+            case MPIIO_SIZE_READ_AGG_1M_4M:
+            case MPIIO_SIZE_READ_AGG_4M_10M:
+            case MPIIO_SIZE_READ_AGG_10M_100M:
+            case MPIIO_SIZE_READ_AGG_100M_1G:
+            case MPIIO_SIZE_READ_AGG_1G_PLUS:
+            case MPIIO_SIZE_WRITE_AGG_0_100:
+            case MPIIO_SIZE_WRITE_AGG_100_1K:
+            case MPIIO_SIZE_WRITE_AGG_1K_10K:
+            case MPIIO_SIZE_WRITE_AGG_10K_100K:
+            case MPIIO_SIZE_WRITE_AGG_100K_1M:
+            case MPIIO_SIZE_WRITE_AGG_1M_4M:
+            case MPIIO_SIZE_WRITE_AGG_4M_10M:
+            case MPIIO_SIZE_WRITE_AGG_10M_100M:
+            case MPIIO_SIZE_WRITE_AGG_100M_1G:
+            case MPIIO_SIZE_WRITE_AGG_1G_PLUS:
+                /* sum */
+                agg_mpi_rec->counters[i] += mpi_rec->counters[i];
+                break;
+            case MPIIO_MODE:
+                /* just set to the input value */
+                agg_mpi_rec->counters[i] = mpi_rec->counters[i];
+                break;
+            case MPIIO_MAX_READ_TIME_SIZE:
+            case MPIIO_MAX_WRITE_TIME_SIZE:
+            case MPIIO_FASTEST_RANK:
+            case MPIIO_FASTEST_RANK_BYTES:
+            case MPIIO_SLOWEST_RANK:
+            case MPIIO_SLOWEST_RANK_BYTES:
+                /* these are set with the FP counters */
+                break;
+            default:
+                /* TODO: common access sizes */
+                agg_mpi_rec->counters[i] = -1;
+                break;
+        }
+    }
+
+    for(i = 0; i < MPIIO_F_NUM_INDICES; i++)
+    {
+        switch(i)
+        {
+            case MPIIO_F_READ_TIME:
+            case MPIIO_F_WRITE_TIME:
+            case MPIIO_F_META_TIME:
+                /* sum */
+                agg_mpi_rec->fcounters[i] += mpi_rec->fcounters[i];
+                break;
+            case MPIIO_F_OPEN_TIMESTAMP:
+            case MPIIO_F_READ_START_TIMESTAMP:
+            case MPIIO_F_WRITE_START_TIMESTAMP:
+                /* minimum non-zero */
+                if((mpi_rec->fcounters[i] > 0)  &&
+                    ((agg_mpi_rec->fcounters[i] == 0) ||
+                    (mpi_rec->fcounters[i] < agg_mpi_rec->fcounters[i])))
+                {
+                    agg_mpi_rec->fcounters[i] = mpi_rec->fcounters[i];
+                }
+                break;
+            case MPIIO_F_READ_END_TIMESTAMP:
+            case MPIIO_F_WRITE_END_TIMESTAMP:
+            case MPIIO_F_CLOSE_TIMESTAMP:
+                /* maximum */
+                if(mpi_rec->fcounters[i] > agg_mpi_rec->fcounters[i])
+                {
+                    agg_mpi_rec->fcounters[i] = mpi_rec->fcounters[i];
+                }
+                break;
+            case MPIIO_F_MAX_READ_TIME:
+                if(mpi_rec->fcounters[i] > agg_mpi_rec->fcounters[i])
+                {
+                    agg_mpi_rec->fcounters[i] = mpi_rec->fcounters[i];
+                    agg_mpi_rec->counters[MPIIO_MAX_READ_TIME_SIZE] =
+                        mpi_rec->counters[MPIIO_MAX_READ_TIME_SIZE];
+                }
+                break;
+            case MPIIO_F_MAX_WRITE_TIME:
+                if(mpi_rec->fcounters[i] > agg_mpi_rec->fcounters[i])
+                {
+                    agg_mpi_rec->fcounters[i] = mpi_rec->fcounters[i];
+                    agg_mpi_rec->counters[MPIIO_MAX_WRITE_TIME_SIZE] =
+                        mpi_rec->counters[MPIIO_MAX_WRITE_TIME_SIZE];
+                }
+                break;
+            case MPIIO_F_FASTEST_RANK_TIME:
+                if(mpi_time < agg_mpi_rec->fcounters[MPIIO_F_FASTEST_RANK_TIME])
+                {
+                    agg_mpi_rec->counters[MPIIO_FASTEST_RANK] = mpi_rec->base_rec.rank;
+                    agg_mpi_rec->counters[MPIIO_FASTEST_RANK_BYTES] =
+                        mpi_rec->counters[MPIIO_BYTES_READ] +
+                        mpi_rec->counters[MPIIO_BYTES_WRITTEN];
+                    agg_mpi_rec->fcounters[MPIIO_F_FASTEST_RANK_TIME] = mpi_time;
+                }
+                break;
+            case MPIIO_F_SLOWEST_RANK_TIME:
+                if(mpi_time > agg_mpi_rec->fcounters[MPIIO_F_SLOWEST_RANK_TIME])
+                {
+                    agg_mpi_rec->counters[MPIIO_SLOWEST_RANK] = mpi_rec->base_rec.rank;
+                    agg_mpi_rec->counters[MPIIO_SLOWEST_RANK_BYTES] =
+                        mpi_rec->counters[MPIIO_BYTES_READ] +
+                        mpi_rec->counters[MPIIO_BYTES_WRITTEN];
+                    agg_mpi_rec->fcounters[MPIIO_F_SLOWEST_RANK_TIME] = mpi_time;
+                }
+                break;
+            default:
+                /* TODO: variance */
+                agg_mpi_rec->fcounters[i] = -1;
+                break;
+        }
+    }
+
</span>     return;
 }
 
</code></pre>

<br>
</li>
<li id='diff-9'>
<a href='https://xgitlab.cels.anl.gov/darshan/darshan/compare/96801d4a5894134dd47159b4f5cf9c31e797d4b5...d3ebeb50a7b5adbadd02ef6da5a70bb5360da3ac#diff-9'>
<strong>
darshan-util/darshan-pnetcdf-logutils.c
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/darshan-util/darshan-pnetcdf-logutils.c
</span><span style="color: #000000;background-color: #ddffdd">+++ b/darshan-util/darshan-pnetcdf-logutils.c
</span><span style="color: #aaaaaa">@@ -205,6 +205,51 @@ static void darshan_log_print_pnetcdf_file_diff(void *file_rec1, char *file_name
</span> 
 static void darshan_log_agg_pnetcdf_files(void *rec, void *agg_rec, int init_flag)
 {
<span style="color: #000000;background-color: #ddffdd">+    struct darshan_pnetcdf_file *pnc_rec = (struct darshan_pnetcdf_file *)rec;
+    struct darshan_pnetcdf_file *agg_pnc_rec = (struct darshan_pnetcdf_file *)agg_rec;
+    int i;
+
+    for(i = 0; i < PNETCDF_NUM_INDICES; i++)
+    {
+        switch(i)
+        {
+            case PNETCDF_INDEP_OPENS:
+            case PNETCDF_COLL_OPENS:
+                /* sum */
+                agg_pnc_rec->counters[i] += pnc_rec->counters[i];
+                break;
+            default:
+                agg_pnc_rec->counters[i] = -1;
+                break;
+        }
+    }
+
+    for(i = 0; i < PNETCDF_F_NUM_INDICES; i++)
+    {
+        switch(i)
+        {
+            case PNETCDF_F_OPEN_TIMESTAMP:
+                /* minimum non-zero */
+                if((pnc_rec->fcounters[i] > 0)  &&
+                    ((agg_pnc_rec->fcounters[i] == 0) ||
+                    (pnc_rec->fcounters[i] < agg_pnc_rec->fcounters[i])))
+                {
+                    agg_pnc_rec->fcounters[i] = pnc_rec->fcounters[i];
+                }
+                break;
+            case PNETCDF_F_CLOSE_TIMESTAMP:
+                /* maximum */
+                if(pnc_rec->fcounters[i] > agg_pnc_rec->fcounters[i])
+                {
+                    agg_pnc_rec->fcounters[i] = pnc_rec->fcounters[i];
+                }
+                break;
+            default:
+                agg_pnc_rec->fcounters[i] = -1;
+                break;
+        }
+    }
+
</span>     return;
 }
 
</code></pre>

<br>
</li>
<li id='diff-10'>
<a href='https://xgitlab.cels.anl.gov/darshan/darshan/compare/96801d4a5894134dd47159b4f5cf9c31e797d4b5...d3ebeb50a7b5adbadd02ef6da5a70bb5360da3ac#diff-10'>
<strong>
darshan-util/darshan-stitch-logs.c
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/darshan-util/darshan-stitch-logs.c
</span><span style="color: #000000;background-color: #ddffdd">+++ b/darshan-util/darshan-stitch-logs.c
</span><span style="color: #aaaaaa">@@ -137,6 +137,7 @@ int build_mod_shared_rec_hash(glob_t *globbuf, darshan_module_id mod_id,
</span>                     darshan_log_close(in_fd);
                     return(-1);
                 }
<span style="color: #000000;background-color: #ddffdd">+                memset(ref, 0, sizeof(*ref));
</span> 
                 /* initialize the aggregate record with this rank's record */
                 agg_base = (struct darshan_base_record *)ref->agg_rec;
</code></pre>

<br>
</li>

</div>
<div class='footer' style='margin-top: 10px;'>
<p>

<br>
<a href="https://xgitlab.cels.anl.gov/darshan/darshan/compare/96801d4a5894134dd47159b4f5cf9c31e797d4b5...d3ebeb50a7b5adbadd02ef6da5a70bb5360da3ac">View it on GitLab</a>
<script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","action":{"@type":"ViewAction","name":["merge_requests","issues","commit"],"url":"https://xgitlab.cels.anl.gov/darshan/darshan/compare/96801d4a5894134dd47159b4f5cf9c31e797d4b5...d3ebeb50a7b5adbadd02ef6da5a70bb5360da3ac"}}</script>
</p>
</div>
</body>
</html>