[Darshan-commits] [Git][darshan/darshan][mmap-dev] 3 commits: bug fixes from merge of mmap-dev to dev-modular

Shane Snyder xgitlab at cels.anl.gov
Wed Jan 20 22:22:38 CST 2016


Shane Snyder pushed to branch mmap-dev at darshan / darshan


Commits:
f57f753c by Shane Snyder at 2016-01-20T16:03:28Z
bug fixes from merge of mmap-dev to dev-modular

- - - - -
10c3b107 by Shane Snyder at 2016-01-20T22:21:28Z
bug fix in log aggregation tool

- - - - -
d3ebeb50 by Shane Snyder at 2016-01-20T22:21:43Z
add aggregation capability to i/o modules

- - - - -


11 changed files:

- darshan-runtime/darshan.h
- darshan-runtime/lib/darshan-core.c
- darshan-runtime/lib/darshan-hdf5.c
- darshan-runtime/lib/darshan-mpiio.c
- darshan-runtime/lib/darshan-null.c
- darshan-runtime/lib/darshan-pnetcdf.c
- darshan-runtime/lib/darshan-posix.c
- darshan-util/darshan-hdf5-logutils.c
- darshan-util/darshan-mpiio-logutils.c
- darshan-util/darshan-pnetcdf-logutils.c
- darshan-util/darshan-stitch-logs.c


Changes:

=====================================
darshan-runtime/darshan.h
=====================================
--- a/darshan-runtime/darshan.h
+++ b/darshan-runtime/darshan.h
@@ -144,17 +144,6 @@ int darshan_core_register_record(
     int rec_size,
     int *file_alignment);
 
-/* darshan_core_unregister_record()
- *
- * 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.
- */
-void darshan_core_unregister_record(
-    darshan_record_id rec_id,
-    darshan_module_id mod_id);
-
 /* darshan_core_wtime()
  *
  * Returns the elapsed time relative to (roughly) the start of


=====================================
darshan-runtime/lib/darshan-core.c
=====================================
--- a/darshan-runtime/lib/darshan-core.c
+++ b/darshan-runtime/lib/darshan-core.c
@@ -1551,7 +1551,6 @@ static void darshan_core_cleanup(struct darshan_core_runtime* core)
     HASH_ITER(hlink, core->rec_hash, ref, tmp)
     {
         HASH_DELETE(hlink, core->rec_hash, ref);
-        /* XXX MMAP:  free(ref->rec.name); */
         free(ref);
     }
 
@@ -1599,6 +1598,14 @@ void darshan_core_register_module(
         return;
     }
 
+    mod = malloc(sizeof(*mod));
+    if(!mod)
+    {
+        DARSHAN_CORE_UNLOCK();
+        return;
+    }
+    memset(mod, 0, sizeof(*mod));
+
     /* assign a buffer from Darshan's contiguous module memory range for
      * this module to use for storing record data
      */
@@ -1607,25 +1614,18 @@ void darshan_core_register_module(
         *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;
-    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);
 
-    mod = malloc(sizeof(*mod));
-    if(!mod)
-    {
-        DARSHAN_CORE_UNLOCK();
-        return;
-    }
-    memset(mod, 0, sizeof(*mod));
+    /* register module with darshan */
     mod->mod_funcs = *funcs;
     mod->mem_avail = *inout_mod_size;
-
-    /* register module with darshan */
     darshan_core->mod_array[mod_id] = mod;
+
+    /* update darshan header and internal structures */
     darshan_core->log_hdr_p->mod_ver[mod_id] = darshan_module_versions[mod_id];
+    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;
     DARSHAN_CORE_UNLOCK();
 
     /* set the memory alignment and calling process's rank, if desired */
@@ -1637,7 +1637,6 @@ void darshan_core_register_module(
     return;
 }
 
-/* TODO: test */
 void darshan_core_unregister_module(
     darshan_module_id mod_id)
 {
@@ -1651,11 +1650,20 @@ void darshan_core_unregister_module(
     /* iterate all records and disassociate this module from them */
     HASH_ITER(hlink, darshan_core->rec_hash, ref, tmp)
     {
-        darshan_core_unregister_record(ref->id, mod_id);
+        /* 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);
+        }
     }
 
+    /* update darshan internal structures and header */
     free(darshan_core->mod_array[mod_id]);
     darshan_core->mod_array[mod_id] = NULL;
+    darshan_core->log_hdr_p->mod_map[mod_id].off =
+        darshan_core->log_hdr_p->mod_map[mod_id].len = 0;
 
     DARSHAN_CORE_UNLOCK();
 
@@ -1741,25 +1749,6 @@ void darshan_core_unregister_record(
     darshan_record_id rec_id,
     darshan_module_id mod_id)
 {
-    struct darshan_core_record_ref *ref;
-
-    if(!darshan_core)
-        return;
-
-    DARSHAN_CORE_LOCK();
-    HASH_FIND(hlink, darshan_core->rec_hash, &rec_id, sizeof(darshan_record_id), ref);
-    assert(ref); 
-
-    /* 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();
-
-    return;
 }
 
 double darshan_core_wtime()


=====================================
darshan-runtime/lib/darshan-hdf5.c
=====================================
--- a/darshan-runtime/lib/darshan-hdf5.c
+++ b/darshan-runtime/lib/darshan-hdf5.c
@@ -209,6 +209,9 @@ static void hdf5_runtime_initialize()
     if(hdf5_runtime || instrumentation_disabled)
         return;
 
+    /* try and store the default number of records for this module */
+    hdf5_buf_size = DARSHAN_DEF_MOD_REC_COUNT * sizeof(struct darshan_hdf5_file);
+
     /* register hdf5 module with darshan-core */
     darshan_core_register_module(
         DARSHAN_HDF5_MOD,
@@ -220,11 +223,17 @@ static void hdf5_runtime_initialize()
 
     /* return if darshan-core does not provide enough module memory */
     if(hdf5_buf_size < sizeof(struct darshan_hdf5_file))
+    {
+        darshan_core_unregister_module(DARSHAN_HDF5_MOD);
         return;
+    }
 
     hdf5_runtime = malloc(sizeof(*hdf5_runtime));
     if(!hdf5_runtime)
+    {
+        darshan_core_unregister_module(DARSHAN_HDF5_MOD);
         return;
+    }
     memset(hdf5_runtime, 0, sizeof(*hdf5_runtime));
 
     /* set number of trackable files for the HDF5 module according to the
@@ -567,7 +576,6 @@ static void hdf5_shutdown()
     HASH_CLEAR(hlink, hdf5_runtime->file_hash); /* these entries are freed all at once below */
 
     free(hdf5_runtime->file_runtime_array);
-    free(hdf5_runtime->file_record_array);
     free(hdf5_runtime);
     hdf5_runtime = NULL;
 


=====================================
darshan-runtime/lib/darshan-mpiio.c
=====================================
--- a/darshan-runtime/lib/darshan-mpiio.c
+++ b/darshan-runtime/lib/darshan-mpiio.c
@@ -846,11 +846,17 @@ static void mpiio_runtime_initialize()
 
     /* return if darshan-core does not provide enough module memory */
     if(mpiio_buf_size < sizeof(struct darshan_mpiio_file))
+    {
+        darshan_core_unregister_module(DARSHAN_MPIIO_MOD);
         return;
+    }
 
     mpiio_runtime = malloc(sizeof(*mpiio_runtime));
     if(!mpiio_runtime)
+    {
+        darshan_core_unregister_module(DARSHAN_MPIIO_MOD);
         return;
+    }
     memset(mpiio_runtime, 0, sizeof(*mpiio_runtime));
 
     /* set number of trackable files for the MPIIO module according to the


=====================================
darshan-runtime/lib/darshan-null.c
=====================================
--- a/darshan-runtime/lib/darshan-null.c
+++ b/darshan-runtime/lib/darshan-null.c
@@ -388,7 +388,6 @@ static void null_shutdown()
     HASH_CLEAR(hlink, null_runtime->record_hash); /* these hash entries are freed all at once below */
 
     free(null_runtime->runtime_record_array);
-    free(null_runtime->record_array);
     free(null_runtime);
     null_runtime = NULL;
 


=====================================
darshan-runtime/lib/darshan-pnetcdf.c
=====================================
--- a/darshan-runtime/lib/darshan-pnetcdf.c
+++ b/darshan-runtime/lib/darshan-pnetcdf.c
@@ -235,11 +235,17 @@ static void pnetcdf_runtime_initialize()
 
     /* return if darshan-core does not provide enough module memory */
     if(pnetcdf_buf_size < sizeof(struct darshan_pnetcdf_file))
+    {
+        darshan_core_unregister_module(DARSHAN_PNETCDF_MOD);
         return;
+    }
 
     pnetcdf_runtime = malloc(sizeof(*pnetcdf_runtime));
     if(!pnetcdf_runtime)
+    {
+        darshan_core_unregister_module(DARSHAN_PNETCDF_MOD);
         return;
+    }
     memset(pnetcdf_runtime, 0, sizeof(*pnetcdf_runtime));
 
     /* set number of trackable files for the PNETCDF module according to the
@@ -582,7 +588,6 @@ static void pnetcdf_shutdown()
     HASH_CLEAR(hlink, pnetcdf_runtime->file_hash); /* these entries are freed all at once below */
 
     free(pnetcdf_runtime->file_runtime_array);
-    free(pnetcdf_runtime->file_record_array);
     free(pnetcdf_runtime);
     pnetcdf_runtime = NULL;
 


=====================================
darshan-runtime/lib/darshan-posix.c
=====================================
--- a/darshan-runtime/lib/darshan-posix.c
+++ b/darshan-runtime/lib/darshan-posix.c
@@ -1641,11 +1641,17 @@ static void posix_runtime_initialize()
 
     /* return if darshan-core does not provide enough module memory */
     if(psx_buf_size < sizeof(struct darshan_posix_file))
+    {
+        darshan_core_unregister_module(DARSHAN_POSIX_MOD);
         return;
+    }
 
     posix_runtime = malloc(sizeof(*posix_runtime));
     if(!posix_runtime)
+    {
+        darshan_core_unregister_module(DARSHAN_POSIX_MOD);
         return;
+    }
     memset(posix_runtime, 0, sizeof(*posix_runtime));
 
     /* set number of trackable files for the POSIX module according to the


=====================================
darshan-util/darshan-hdf5-logutils.c
=====================================
--- a/darshan-util/darshan-hdf5-logutils.c
+++ b/darshan-util/darshan-hdf5-logutils.c
@@ -204,6 +204,50 @@ static void darshan_log_print_hdf5_file_diff(void *file_rec1, char *file_name1,
 
 static void darshan_log_agg_hdf5_files(void *rec, void *agg_rec, int init_flag)
 {
+    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;
+        }
+    }
+
     return;
 }
 


=====================================
darshan-util/darshan-mpiio-logutils.c
=====================================
--- a/darshan-util/darshan-mpiio-logutils.c
+++ b/darshan-util/darshan-mpiio-logutils.c
@@ -226,6 +226,170 @@ static void darshan_log_print_mpiio_file_diff(void *file_rec1, char *file_name1,
 
 static void darshan_log_agg_mpiio_files(void *rec, void *agg_rec, int init_flag)
 {
+    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;
+        }
+    }
+
     return;
 }
 


=====================================
darshan-util/darshan-pnetcdf-logutils.c
=====================================
--- a/darshan-util/darshan-pnetcdf-logutils.c
+++ b/darshan-util/darshan-pnetcdf-logutils.c
@@ -205,6 +205,51 @@ static void darshan_log_print_pnetcdf_file_diff(void *file_rec1, char *file_name
 
 static void darshan_log_agg_pnetcdf_files(void *rec, void *agg_rec, int init_flag)
 {
+    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;
+        }
+    }
+
     return;
 }
 


=====================================
darshan-util/darshan-stitch-logs.c
=====================================
--- a/darshan-util/darshan-stitch-logs.c
+++ b/darshan-util/darshan-stitch-logs.c
@@ -137,6 +137,7 @@ int build_mod_shared_rec_hash(glob_t *globbuf, darshan_module_id mod_id,
                     darshan_log_close(in_fd);
                     return(-1);
                 }
+                memset(ref, 0, sizeof(*ref));
 
                 /* initialize the aggregate record with this rank's record */
                 agg_base = (struct darshan_base_record *)ref->agg_rec;



View it on GitLab: https://xgitlab.cels.anl.gov/darshan/darshan/compare/96801d4a5894134dd47159b4f5cf9c31e797d4b5...d3ebeb50a7b5adbadd02ef6da5a70bb5360da3ac
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/darshan-commits/attachments/20160120/099a6fcd/attachment-0001.html>


More information about the Darshan-commits mailing list