[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