diff options
Diffstat (limited to 'test/use_append_mchunks.c')
-rw-r--r-- | test/use_append_mchunks.c | 166 |
1 files changed, 92 insertions, 74 deletions
diff --git a/test/use_append_mchunks.c b/test/use_append_mchunks.c index 53feed8..47c9f92 100644 --- a/test/use_append_mchunks.c +++ b/test/use_append_mchunks.c @@ -5,7 +5,7 @@ * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * * the COPYING file, which can be found at the root of the source code * - * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. * + * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ @@ -53,53 +53,48 @@ #include "h5test.h" /* This test uses many POSIX things that are not available on - * Windows. We're using a check for fork(2) here as a proxy for - * all POSIX/Unix/Linux things until this test can be made - * more platform-independent. + * Windows. */ -#ifdef H5_HAVE_FORK +#ifdef H5_HAVE_UNISTD_H #include "use.h" -/* Global Variable definitions */ -options_t UC_opts; /* Use Case Options */ -const char *progname_g = "use_append_mchunks"; /* program name */ +#define USE_APPEND_MCHUNKS_PROGNAME "use_append_mchunks" + +static options_t UC_opts; /* Use Case Options */ /* Setup parameters for the use case. * Return: 0 succeed; -1 fail. */ int -setup_parameters(int argc, char *const argv[]) +setup_parameters(int argc, char *const argv[], options_t *opts) { /* use case defaults */ - HDmemset(&UC_opts, 0, sizeof(options_t)); - UC_opts.chunksize = Chunksize_DFT; - UC_opts.use_swmr = 1; /* use swmr open */ - UC_opts.iterations = 1; - UC_opts.chunkplanes = 1; - - /* parse options */ - if (parse_option(argc, argv) < 0) { + HDmemset(opts, 0, sizeof(options_t)); + opts->chunksize = Chunksize_DFT; + opts->use_swmr = 1; /* use swmr open */ + opts->iterations = 1; + opts->chunkplanes = 1; + opts->progname = USE_APPEND_MCHUNKS_PROGNAME; + opts->fapl_id = H5I_INVALID_HID; + + if (parse_option(argc, argv, opts) < 0) { return (-1); } - /* set chunk dims */ - UC_opts.chunkdims[0] = (hsize_t)UC_opts.chunkplanes; - UC_opts.chunkdims[1] = UC_opts.chunkdims[2] = (hsize_t)UC_opts.chunksize; - - /* set dataset initial and max dims */ - UC_opts.dims[0] = 0; - UC_opts.max_dims[0] = H5S_UNLIMITED; - UC_opts.dims[1] = UC_opts.dims[2] = UC_opts.max_dims[1] = UC_opts.max_dims[2] = - 2 * (hsize_t)UC_opts.chunksize; - - /* set nplanes */ - if (UC_opts.nplanes == 0) - UC_opts.nplanes = 2 * (hsize_t)UC_opts.chunksize; - - /* show parameters and return */ - show_parameters(); + + opts->chunkdims[0] = (hsize_t)opts->chunkplanes; + opts->chunkdims[1] = opts->chunkdims[2] = (hsize_t)opts->chunksize; + + opts->dims[0] = 0; + opts->max_dims[0] = H5S_UNLIMITED; + opts->dims[1] = opts->dims[2] = opts->max_dims[1] = opts->max_dims[2] = 2 * (hsize_t)opts->chunksize; + + if (opts->nplanes == 0) + opts->nplanes = 2 * (hsize_t)opts->chunksize; + + show_parameters(opts); return (0); -} +} /* end setup_parameters() */ /* Overall Algorithm: * Parse options from user; @@ -120,10 +115,8 @@ main(int argc, char *argv[]) hbool_t send_wait = 0; hid_t fapl = -1; /* File access property list */ hid_t fid = -1; /* File ID */ - char * name; /* Test file name */ - /* initialization */ - if (setup_parameters(argc, argv) < 0) { + if (setup_parameters(argc, argv, &UC_opts) < 0) { Hgoto_error(1); } @@ -138,27 +131,44 @@ main(int argc, char *argv[]) /* UC_WRITER: create datafile, skip reader, launch writer. */ /* UC_READER: skip create, launch reader, exit. */ /* ==============================================================*/ - /* ============*/ + /* =========== */ /* Create file */ - /* ============*/ + /* =========== */ if (UC_opts.launch != UC_READER) { HDprintf("Creating skeleton data file for test...\n"); - if (create_uc_file() < 0) { + if ((UC_opts.fapl_id = h5_fileaccess()) < 0) { + HDfprintf(stderr, "can't create creation FAPL\n"); + Hgoto_error(1); + } + if (H5Pset_libver_bounds(UC_opts.fapl_id, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0) { + HDfprintf(stderr, "can't set creation FAPL libver bounds\n"); + Hgoto_error(1); + } + if (create_uc_file(&UC_opts) < 0) { HDfprintf(stderr, "***encounter error\n"); Hgoto_error(1); } - else + else { HDprintf("File created.\n"); + } + /* Close FAPL to prevent issues with forking later */ + if (H5Pclose(UC_opts.fapl_id) < 0) { + HDfprintf(stderr, "can't close creation FAPL\n"); + Hgoto_error(1); + } + UC_opts.fapl_id = H5I_INVALID_HID; } + /* ============ */ + /* Fork process */ + /* ============ */ if (UC_opts.launch == UC_READWRITE) { - /* fork process */ - if ((childpid = fork()) < 0) { - perror("fork"); + if ((childpid = HDfork()) < 0) { + HDperror("fork"); Hgoto_error(1); - }; - }; - mypid = getpid(); + } + } + mypid = HDgetpid(); /* ============= */ /* launch reader */ @@ -167,10 +177,18 @@ main(int argc, char *argv[]) /* child process launch the reader */ if (0 == childpid) { HDprintf("%d: launch reader process\n", mypid); - if (read_uc_file(send_wait) < 0) { + if ((UC_opts.fapl_id = h5_fileaccess()) < 0) { + HDfprintf(stderr, "can't create read FAPL\n"); + HDexit(EXIT_FAILURE); + } + if (read_uc_file(send_wait, &UC_opts) < 0) { HDfprintf(stderr, "read_uc_file encountered error\n"); HDexit(EXIT_FAILURE); } + if (H5Pclose(UC_opts.fapl_id) < 0) { + HDfprintf(stderr, "can't close read FAPL\n"); + HDexit(EXIT_FAILURE); + } HDexit(EXIT_SUCCESS); } } @@ -181,45 +199,46 @@ main(int argc, char *argv[]) /* this process continues to launch the writer */ HDprintf("%d: continue as the writer process\n", mypid); - name = UC_opts.filename; - /* Set the file access property list */ - if ((fapl = h5_fileaccess()) < 0) + if ((fapl = h5_fileaccess()) < 0) { + HDfprintf(stderr, "can't get write FAPL\n"); Hgoto_error(1); + } - if (UC_opts.use_swmr) - if (H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0) + if (UC_opts.use_swmr) { + if (H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0) { + HDfprintf(stderr, "can't set write FAPL libver bounds\n"); Hgoto_error(1); + } + } - /* Open the file */ - if ((fid = H5Fopen(name, H5F_ACC_RDWR | (UC_opts.use_swmr ? H5F_ACC_SWMR_WRITE : 0), fapl)) < 0) { + if ((fid = H5Fopen(UC_opts.filename, H5F_ACC_RDWR | (UC_opts.use_swmr ? H5F_ACC_SWMR_WRITE : 0), fapl)) < + 0) { HDfprintf(stderr, "H5Fopen failed\n"); Hgoto_error(1); } - if (write_uc_file(send_wait, fid) < 0) { + if (write_uc_file(send_wait, fid, &UC_opts) < 0) { HDfprintf(stderr, "write_uc_file encountered error\n"); Hgoto_error(1); } + if (H5Fclose(fid) < 0) { + HDfprintf(stderr, "Failed to close file id\n"); + Hgoto_error(1); + } + + if (H5Pclose(fapl) < 0) { + HDfprintf(stderr, "can't close write FAPL\n"); + Hgoto_error(1); + } + /* ================================================ */ /* If readwrite, collect exit code of child process */ /* ================================================ */ if (UC_opts.launch == UC_READWRITE) { - if ((tmppid = waitpid(childpid, &child_status, child_wait_option)) < 0) { - perror("waitpid"); - Hgoto_error(1); - } - - /* Close the file */ - if (H5Fclose(fid) < 0) { - HDfprintf(stderr, "Failed to close file id\n"); - Hgoto_error(1); - } - - /* Close the property list */ - if (H5Pclose(fapl) < 0) { - HDfprintf(stderr, "Failed to close the property list\n"); + if ((tmppid = HDwaitpid(childpid, &child_status, child_wait_option)) < 0) { + HDperror("waitpid"); Hgoto_error(1); } @@ -236,7 +255,6 @@ main(int argc, char *argv[]) } done: - /* Print result and exit */ if (ret_value != 0) { HDprintf("Error(s) encountered\n"); } @@ -245,9 +263,9 @@ done: } return (ret_value); -} +} /* end main() */ -#else /* H5_HAVE_FORK */ +#else /* H5_HAVE_UNISTD_H */ int main(void) @@ -256,4 +274,4 @@ main(void) return EXIT_SUCCESS; } /* end main() */ -#endif /* H5_HAVE_FORK */ +#endif /* H5_HAVE_UNISTD_H */ |