diff options
Diffstat (limited to 'examples/h5dsm_tvlen.c')
-rw-r--r-- | examples/h5dsm_tvlen.c | 342 |
1 files changed, 342 insertions, 0 deletions
diff --git a/examples/h5dsm_tvlen.c b/examples/h5dsm_tvlen.c new file mode 100644 index 0000000..ffe4933 --- /dev/null +++ b/examples/h5dsm_tvlen.c @@ -0,0 +1,342 @@ +#include "h5dsm_example.h" +#include <time.h> + +#define FILE_NAME "tvlen.h5" +#define NITER 10 + +hbool_t verbose_g = 1; + +static void print_vla(const hvl_t *vla) { + int i, j, k; + + for(i = 0; i < 4; i++) { + for(j = 0; j < 2; j++) { + if(j > 0) + printf(", "); + printf("{"); + for(k = 0; k < (int)vla[2 * i + j].len; k++) { + if(k > 0) + printf(", "); + printf("%d", ((int *)vla[2 * i + j].p)[k]); + } /* end for */ + printf("}"); + } /* end for */ + printf("\n"); + } /* end for */ + + return; +} /* end print_vla() */ + +static int check_vla(const hvl_t *vla1, const hvl_t *vla2) { + int i, j, k; + + for(i = 0; i < 4; i++) + for(j = 0; j < 2; j++) { + if(vla1[2 * i + j].len != vla2[2 * i + j].len) + PRINTF_ERROR("vlen array length at location %d, %d does not match", i, j); + for(k = 0; k < (int)vla1[2 * i + j].len; k++) + if(((int *)vla1[2 * i + j].p)[k] != ((int *)vla2[2 * i + j].p)[k]) + PRINTF_ERROR("vlen array data at location %d, %d, %d does not match", i, j, k); + } /* end for */ + + return 0; + +error: + return -1; +} /* end check_vla() */ + +static void print_vls(char **vls) { + int i, j; + + for(i = 0; i < 4; i++) { + for(j = 0; j < 2; j++) { + if(j > 0) + printf(", "); + if(vls[2 * i + j]) + printf("\"%s\"", vls[2 * i + j]); + else + printf("NULL"); + } /* end for */ + printf("\n"); + } /* end for */ + + return; +} /* end print_vls() */ + +static int check_vls(char **vls1, char **vls2) { + int i, j; + + for(i = 0; i < 4; i++) + for(j = 0; j < 2; j++) { + if((vls1[2 * i + j] == NULL) != (vls2[2 * i + j] == NULL)) + PRINTF_ERROR("one vlen string at location %d, %d is NULL and the other is not", i, j); + if(vls1[2 * i + j] && strcmp(vls1[2 * i + j], vls2[2 * i + j])) + PRINTF_ERROR("vlen strings at location %d, %d do not match", i, j); + } /* end for */ + + return 0; + +error: + return -1; +} /* end check_vls() */ + +int main(int argc, char *argv[]) { + uuid_t pool_uuid; + char *pool_grp = NULL; + hid_t file = -1, dset_vla = -1, dset_vls = -1, attr_vla = -1, attr_vls = -1, space = -1, fapl = -1; + hid_t type_vla = -1, type_vls = -1; + hsize_t dims[2] = {4, 2}; + int static_buf_vla[4][2][8]; + char static_buf_vls[4][2][8]; + hvl_t rbuf_vla[4][2]; + char *rbuf_vls[4][2]; + hvl_t wbuf_vla[4][2]; + char *wbuf_vls[4][2]; + int bogus_int = -1; + char bogus_str[3] = {'-', '1', '\0'}; + const hvl_t rbuf_vla_init[4][2] = {{{1, &bogus_int}, {1, &bogus_int}}, + {{1, &bogus_int}, {1, &bogus_int}}, + {{1, &bogus_int}, {1, &bogus_int}}, + {{1, &bogus_int}, {1, &bogus_int}}}; + char * const rbuf_vls_init[4][2] = {{bogus_str, bogus_str}, + {bogus_str, bogus_str}, + {bogus_str, bogus_str}, + {bogus_str, bogus_str}}; + const hvl_t wbuf_vla_init[4][2] = {{{0, &static_buf_vla[0][0][0]}, {0, &static_buf_vla[0][1][0]}}, + {{0, &static_buf_vla[1][0][0]}, {0, &static_buf_vla[1][1][0]}}, + {{0, &static_buf_vla[2][0][0]}, {0, &static_buf_vla[2][1][0]}}, + {{0, &static_buf_vla[3][0][0]}, {1, &static_buf_vla[3][1][0]}}}; + char * const wbuf_vls_init[4][2] = {{&static_buf_vls[0][0][0], &static_buf_vls[0][1][0]}, + {&static_buf_vls[1][0][0], &static_buf_vls[1][1][0]}, + {&static_buf_vls[2][0][0], &static_buf_vls[2][1][0]}, + {&static_buf_vls[3][0][0], &static_buf_vls[3][1][0]}}; + int i, j, k, l; + + (void)MPI_Init(&argc, &argv); + + /* Seed random number generator */ + srand(time(NULL)); + + if((argc != 2) && (argc != 3)) + PRINTF_ERROR("argc must be 2 or 3\n"); + + if(argc == 3) + verbose_g = 0; + + /* Parse UUID */ + if(0 != uuid_parse(argv[1], pool_uuid)) + ERROR; + + /* Initialize VOL */ + if(H5VLdaosm_init(MPI_COMM_WORLD, pool_uuid, pool_grp) < 0) + ERROR; + + /* Set up FAPL */ + if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) + ERROR; + if(H5Pset_fapl_daosm(fapl, MPI_COMM_WORLD, MPI_INFO_NULL) < 0) + ERROR; + if(H5Pset_all_coll_metadata_ops(fapl, true) < 0) + ERROR; + + /* Create file */ + if((file = H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + ERROR; + + /* Set up dataspace */ + if((space = H5Screate_simple(2, dims, NULL)) < 0) + ERROR; + + /* + * Set up types + */ + /* Create variable length array */ + /* Set up file "all" type */ + if((type_vla = H5Tvlen_create(H5T_NATIVE_INT)) < 0) + ERROR; + + /* Set up variable length string type */ + if((type_vls = H5Tcopy(H5T_C_S1)) < 0) + ERROR; + if(H5Tset_size(type_vls, H5T_VARIABLE) < 0) + ERROR; + + /* + * Create objects + */ + /* Create vla dataset */ + if((dset_vla = H5Dcreate2(file, "vla_dset", type_vla, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) + ERROR; + + /* Create vls dataset */ + if((dset_vls = H5Dcreate2(file, "vls_dset", type_vls, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) + ERROR; + + /* Create vla attribute */ + if((attr_vla = H5Acreate2(dset_vla, "vla_attr", type_vla, space, H5P_DEFAULT, H5P_DEFAULT)) < 0) + ERROR; + + /* Create vls attribute */ + if((attr_vls = H5Acreate2(dset_vla, "vls_attr", type_vls, space, H5P_DEFAULT, H5P_DEFAULT)) < 0) + ERROR; + + /* + * Test attribute + */ + /* Loop over iterations */ + for(i = 0; i < NITER; i++) { + /* + * Variable length array attribute test + */ + /* Fill write data buffer */ + for(j = 0; j < dims[0]; j++) + for(k = 0; k < dims[1]; k++) + for(l = 0; l < (sizeof(static_buf_vla[0][0]) / sizeof(static_buf_vla[0][0][0])); l++) + static_buf_vla[j][k][l] = rand() % 100; + + /* Fill write buffer */ + memcpy(wbuf_vla, wbuf_vla_init, sizeof(wbuf_vla)); + for(j = 0; j < dims[0]; j++) + for(k = 0; k < dims[1]; k++) { + /* 10% chance of having a NULL sequence */ + if(rand() % 10) + wbuf_vla[j][k].len = rand() % 9; + else { + wbuf_vla[j][k].len = 0; + wbuf_vla[j][k].p = NULL; + } /* end if */ + } /* end for */ + + /* Print message */ + if(verbose_g) { + printf("Writing attribute with variable length arrays. buf =\n"); + print_vla(wbuf_vla[0]); + } /* end if */ + + /* Write data */ + if(H5Awrite(attr_vla, type_vla, wbuf_vla) < 0) + ERROR; + + /* Read data */ + memcpy(rbuf_vla, rbuf_vla_init, sizeof(rbuf_vla)); + if(H5Aread(attr_vla, type_vla, rbuf_vla) < 0) + ERROR; + + /* Print message */ + if(verbose_g) { + printf("Read attribute with variable length arrays. buf =\n"); + print_vla(rbuf_vla[0]); + } /* end if */ + + /* Check buffer */ + if(check_vla(wbuf_vla[0], rbuf_vla[0]) < 0) { + (void)H5Dvlen_reclaim(type_vla, space, H5P_DEFAULT, rbuf_vla); + ERROR; + } /* end if */ + + /* Reclaim read buffer */ + if(H5Dvlen_reclaim(type_vla, space, H5P_DEFAULT, rbuf_vla) < 0) + ERROR; + + if(verbose_g) + printf("\n"); + + /* + * Variable length string attribute test + */ + /* Fill write data buffer */ + for(j = 0; j < dims[0]; j++) + for(k = 0; k < dims[1]; k++) + for(l = 0; l < (sizeof(static_buf_vls[0][0]) / sizeof(static_buf_vls[0][0][0])); l++) + static_buf_vls[j][k][l] = 'a' + rand() % 26; + + /* Fill write buffer */ + memcpy(wbuf_vls, wbuf_vls_init, sizeof(wbuf_vls)); + for(j = 0; j < dims[0]; j++) + for(k = 0; k < dims[1]; k++) { + /* 10% chance of having a NULL sequence */ + if(rand() % 10) + static_buf_vls[j][k][rand() % 8] = '\0'; + else + wbuf_vls[j][k] = NULL; + } /* end for */ + + /* Print message */ + if(verbose_g) { + printf("Writing attribute with variable length strings. buf =\n"); + print_vls(wbuf_vls[0]); + } /* end if */ + + /* Write data */ + if(H5Awrite(attr_vls, type_vls, wbuf_vls) < 0) + ERROR; + + /* Read data */ + memcpy(rbuf_vls, rbuf_vls_init, sizeof(rbuf_vls)); + if(H5Aread(attr_vls, type_vls, rbuf_vls) < 0) + ERROR; + + /* Print message */ + if(verbose_g) { + printf("Read attribute with variable length strings. buf =\n"); + print_vls(rbuf_vls[0]); + } /* end if */ + + /* Check buffer */ + if(check_vls(wbuf_vls[0], rbuf_vls[0]) < 0) { + (void)H5Dvlen_reclaim(type_vls, space, H5P_DEFAULT, rbuf_vls); + ERROR; + } /* end if */ + + /* Reclaim read buffer */ + if(H5Dvlen_reclaim(type_vls, space, H5P_DEFAULT, rbuf_vls) < 0) + ERROR; + + if(verbose_g) + printf("\n"); + } /* end for */ + + /* + * Close + */ + if(H5Aclose(attr_vla) < 0) + ERROR; + if(H5Aclose(attr_vls) < 0) + ERROR; + if(H5Dclose(dset_vla) < 0) + ERROR; + if(H5Dclose(dset_vls) < 0) + ERROR; + if(H5Fclose(file) < 0) + ERROR; + if(H5Tclose(type_vla) < 0) + ERROR; + if(H5Tclose(type_vls) < 0) + ERROR; + if(H5Sclose(space) < 0) + ERROR; + if(H5Pclose(fapl) < 0) + ERROR; + + printf("Success\n"); + + (void)MPI_Finalize(); + return 0; + +error: + H5E_BEGIN_TRY { + H5Aclose(attr_vla); + H5Aclose(attr_vls); + H5Dclose(dset_vla); + H5Dclose(dset_vls); + H5Fclose(file); + H5Tclose(type_vla); + H5Tclose(type_vls); + H5Sclose(space); + H5Pclose(fapl); + } H5E_END_TRY; + + (void)MPI_Finalize(); + return 1; +} + |