summaryrefslogtreecommitdiffstats
path: root/test/accum_swmr_reader.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/accum_swmr_reader.c')
-rw-r--r--test/accum_swmr_reader.c120
1 files changed, 120 insertions, 0 deletions
diff --git a/test/accum_swmr_reader.c b/test/accum_swmr_reader.c
new file mode 100644
index 0000000..957ab14
--- /dev/null
+++ b/test/accum_swmr_reader.c
@@ -0,0 +1,120 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group. *
+ * All rights reserved. *
+ * *
+ * 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://www.hdfgroup.org/licenses. *
+ * If you do not have access to either file, you may request a copy from *
+ * help@hdfgroup.org. *
+ * help@hdfgroup.org. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#include "h5test.h"
+
+#define H5F_FRIEND /*suppress error about including H5Fpkg */
+#define H5FD_FRIEND /*suppress error about including H5FDpkg */
+#define H5FD_TESTING
+
+#include "H5Fpkg.h"
+#include "H5FDpkg.h"
+
+#include "H5CXprivate.h" /* API Contexts */
+#include "H5Iprivate.h"
+#include "H5VLprivate.h" /* Virtual Object Layer */
+
+/* Filename: this is the same as the define in accum.c used by test_swmr_write_big() */
+const char *FILENAME[] = {"accum", "accum_swmr_big", NULL};
+
+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ * Purpose: This is the reader forked/execved by "test_swmr_write_big()"
+ * test in accum.c. The reader reads at address 1024 from the file
+ * and verifies that the metadata in the accumulator at address
+ * 1024 does get written to disk.
+ *
+ * Return: Success: EXIT_SUCCESS
+ * Failure: EXIT_FAILURE
+ *
+ * Programmer: Vailin Choi; June 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(void)
+{
+ hid_t fid = -1; /* File ID */
+ hid_t fapl = -1; /* file access property list ID */
+ H5F_t *f = NULL; /* File pointer */
+ char filename[1024];
+ unsigned u; /* Local index variable */
+ uint8_t rbuf[1024]; /* Buffer for reading */
+ uint8_t buf[1024]; /* Buffer for holding the expected data */
+ char *driver = NULL; /* VFD string (from env variable) */
+ hbool_t api_ctx_pushed = FALSE; /* Whether API context pushed */
+
+ /* Skip this test if SWMR I/O is not supported for the VFD specified
+ * by the environment variable.
+ */
+ driver = HDgetenv(HDF5_DRIVER);
+ if (!H5FD__supports_swmr_test(driver))
+ return EXIT_SUCCESS;
+
+ /* Initialize buffers */
+ for (u = 0; u < 1024; u++) {
+ rbuf[u] = 0; /* The buffer for reading */
+ buf[u] = 1; /* The expected data should be all 1s */
+ }
+
+ if ((fapl = h5_fileaccess()) < 0)
+ FAIL_STACK_ERROR;
+ h5_fixname(FILENAME[1], fapl, filename, sizeof filename);
+
+ /* Open the file with SWMR_READ */
+ if ((fid = H5Fopen(filename, H5F_ACC_RDONLY | H5F_ACC_SWMR_READ, fapl)) < 0)
+ FAIL_STACK_ERROR;
+
+ /* Push API context */
+ if (H5CX_push() < 0)
+ FAIL_STACK_ERROR;
+ api_ctx_pushed = TRUE;
+
+ /* Get H5F_t * to internal file structure */
+ if (NULL == (f = (H5F_t *)H5VL_object(fid)))
+ FAIL_STACK_ERROR;
+
+ /* Should read in [1024, 2024] with buf data */
+ if (H5F_block_read(f, H5FD_MEM_DEFAULT, (haddr_t)1024, (size_t)1024, rbuf) < 0)
+ FAIL_STACK_ERROR;
+
+ /* Verify the data read is correct */
+ if (HDmemcmp(buf, rbuf, (size_t)1024) != 0)
+ TEST_ERROR;
+
+ /* CLose the file */
+ if (H5Pclose(fapl) < 0)
+ FAIL_STACK_ERROR;
+ if (H5Fclose(fid) < 0)
+ FAIL_STACK_ERROR;
+
+ /* Pop API context */
+ if (api_ctx_pushed && H5CX_pop(FALSE) < 0)
+ FAIL_STACK_ERROR;
+ api_ctx_pushed = FALSE;
+
+ return EXIT_SUCCESS;
+
+error:
+ H5E_BEGIN_TRY
+ {
+ H5Pclose(fapl);
+ H5Fclose(fid);
+ }
+ H5E_END_TRY;
+
+ if (api_ctx_pushed)
+ H5CX_pop(FALSE);
+
+ return EXIT_FAILURE;
+} /* end main() */