summaryrefslogtreecommitdiffstats
path: root/hl/test/ld_extend.c
diff options
context:
space:
mode:
authorVailin Choi <vchoi@hdfgroup.org>2011-03-07 16:37:49 (GMT)
committerVailin Choi <vchoi@hdfgroup.org>2011-03-07 16:37:49 (GMT)
commit79757db4c2ba2181ab88ba23f392790782802645 (patch)
tree93075de94c95b19ee2ccc2fda9814273dd2a7791 /hl/test/ld_extend.c
parent727b687ae6c80c9854cb53814fa1c12f27c2994c (diff)
downloadhdf5-79757db4c2ba2181ab88ba23f392790782802645.zip
hdf5-79757db4c2ba2181ab88ba23f392790782802645.tar.gz
hdf5-79757db4c2ba2181ab88ba23f392790782802645.tar.bz2
[svn-r20196] This checkin consists of the following:
A) - Changes to add the new tool "h5watch" to High Level - Changes to add three new High Level public routines for retrieving elements appended to a dataset B) A patch from Mike M. to fix the H5Dflush/refresh problem: src/H5Dpkg.h src/H5Dint.c src/H5D.c C) Fix for an assertion failure in H5FS_sect_link_size() in H5FSsection.c src/H5Dbtree2.c h5committested; tested also on linew, duty, fred.
Diffstat (limited to 'hl/test/ld_extend.c')
-rw-r--r--hl/test/ld_extend.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/hl/test/ld_extend.c b/hl/test/ld_extend.c
new file mode 100644
index 0000000..3ddd883
--- /dev/null
+++ b/hl/test/ld_extend.c
@@ -0,0 +1,151 @@
+#include "H5HLprivate2.h"
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+/* Size of data buffer */
+#define TEST_BUF_SIZE 100
+
+/*
+ * Test variations (incremental) for one-dimensional dataset:
+ * Varies from 10->13->12->12->1->3
+ */
+#define ONE_NTESTS 5
+int one_tests[ONE_NTESTS] = {3, -1, 0, -11, 2};
+
+/*
+ * Test variations (incremental) for two-dimensional dataset:
+ * Varies from {4,10}->{6,12}->{8,1}->{10,1}->
+ * {3,3}->{2,2}->{1,2}->
+ * {1,4}->{1,3}->{1,3}
+ */
+#define TWO_NTESTS 9
+int two_tests[TWO_NTESTS][2] = { {2, 2}, {2, -11}, {2, 0},
+ {-7, 2}, {-1, -1}, {-1, 0},
+ {0, 2}, {0, -1}, {0, 0}
+ };
+
+static int extend_dset(const char *file, char *dname);
+
+/*
+ * Extend the specified dataset in the file with ld_monitor.c monitoring
+ * the dataset on the other end:
+ *
+ * 1) Extend the dataset according to the variations: ONE_NTESTS, TWO_NTESTS
+ * 2) Write to the dataset (currently, only for integer dataset)
+ * 3) Flush the dataset
+ */
+static int
+extend_dset(const char *file, char *dname)
+{
+ hid_t fid; /* file id */
+ hid_t did; /* dataset id */
+ hid_t dtype; /* dataset's datatype */
+ hid_t sid; /* dataspace id */
+ int i, j, k; /* local index variable */
+ int ndims; /* number of dimensions */
+ int buf[TEST_BUF_SIZE]; /* buffer for data */
+ hsize_t cur_dims[2]; /* current dimension sizes */
+ hsize_t ext_dims[2]; /* new dimension sizes after extension */
+
+ /* Open the file */
+ if((fid = H5Fopen(file, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
+ goto done;
+
+ /* Open the dataset */
+ if((did = H5Dopen2(fid, dname, H5P_DEFAULT)) < 0)
+ goto done;
+
+ /* Get the dataset's data space */
+ if((sid = H5Dget_space(did)) < 0)
+ goto done;
+
+ /* Get the # of dimensions for the dataset */
+ if((ndims = H5Sget_simple_extent_ndims(sid)) < 0)
+ goto done;
+
+ /* Initialize data written to the dataset */
+ HDmemset(buf, 0, sizeof(buf));
+ for(k = 0; k < TEST_BUF_SIZE; k++)
+ buf[k] = k;
+
+ /* Loop through different variations of extending the dataset */
+ for(i = 0; i < (ndims == 1 ? ONE_NTESTS: TWO_NTESTS); i++) {
+
+ sleep(2);
+
+ /* Get the dataset's current dimension sizes */
+ if(H5LDget_dset_dims(did, cur_dims) < 0)
+ goto done;
+
+ /* Set up the new extended dimension sizes */
+ for(j = 0; j < ndims; j++)
+ ext_dims[j] = cur_dims[j] + (ndims == 1 ? (hsize_t)one_tests[i] : (hsize_t)two_tests[i][j]);
+
+ /* Extend the dataset */
+ if(H5Dset_extent(did, ext_dims) < 0)
+ goto done;
+
+ /* Get the dataset's data type */
+ if((dtype = H5Tget_native_type(H5Dget_type(did), H5T_DIR_DEFAULT)) < 0)
+ goto done;
+
+ /* Write to the whole dataset after extension */
+ if(H5Dwrite(did, dtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+ goto done;
+
+ /* Flush the data */
+ if(H5Dflush(did) < 0)
+ goto done;
+
+ } /* end for ONE_NTESTS or TWO_NTESTS */
+
+ /* Closing */
+ if(H5Tclose(dtype) < 0) goto done;
+ if(H5Sclose(sid) < 0) goto done;
+ if(H5Dclose(did) < 0) goto done;
+ if(H5Fclose(fid) < 0) goto done;
+
+ return(0);
+
+done:
+ H5E_BEGIN_TRY
+ H5Tclose(dtype);
+ H5Sclose(sid);
+ H5Dclose(did);
+ H5Fclose(fid);
+ H5E_END_TRY
+
+ return(-1);
+} /* extend_dset() */
+
+
+/* Usage: extend_dset xx.h5 dname */
+int
+main(int argc, const char *argv[])
+{
+ char *dname = NULL; /* dataset name */
+ char *fname = NULL; /* file name */
+
+ if(argc != 3) {
+ fprintf(stderr, "Should have file name and dataset name to be extended...\n");
+ goto done;
+ }
+
+ /* Get the file and dataset names to be extended */
+ fname = HDstrdup(argv[1]);
+ dname = HDstrdup(argv[2]);
+
+ /* Extend the specified dataset in the file */
+ if(extend_dset(fname, dname) < 0)
+ goto done;
+
+ exit(EXIT_SUCCESS);
+
+done:
+ if(dname) HDfree(dname);
+ if(fname) HDfree(fname);
+ exit(EXIT_FAILURE);
+} /* main() */