summaryrefslogtreecommitdiffstats
path: root/src/H5FDvfd_swmr.c
diff options
context:
space:
mode:
authorDavid Young <dyoung@hdfgroup.org>2020-07-10 21:00:09 (GMT)
committerDavid Young <dyoung@hdfgroup.org>2020-07-10 21:00:09 (GMT)
commit3553c7617dc80428da8dcf77120820a3b11f5033 (patch)
tree9ccd820f0fe0d72224adf47b1e2a9361a5962881 /src/H5FDvfd_swmr.c
parent03cdbe93763ef40bc9ed4b05f44e917f0c84c777 (diff)
downloadhdf5-3553c7617dc80428da8dcf77120820a3b11f5033.zip
hdf5-3553c7617dc80428da8dcf77120820a3b11f5033.tar.gz
hdf5-3553c7617dc80428da8dcf77120820a3b11f5033.tar.bz2
Make a VFD SWMR writer use the SWMR VFD, to facilitate avoiding conflicting
multiple opens of the same file with VFD SWMR---i.e., twice for writing, or for reading and for writing. In the long run, this will help me encapsulate more of the SWMR functionality in the VFD, too.
Diffstat (limited to 'src/H5FDvfd_swmr.c')
-rw-r--r--src/H5FDvfd_swmr.c53
1 files changed, 23 insertions, 30 deletions
diff --git a/src/H5FDvfd_swmr.c b/src/H5FDvfd_swmr.c
index ab80a82..2acdca4 100644
--- a/src/H5FDvfd_swmr.c
+++ b/src/H5FDvfd_swmr.c
@@ -58,6 +58,7 @@ typedef struct H5FD_vfd_swmr_t {
/* when the page buffer is */
/* and to FALSE otherwise. */
/* Used for sanity checking. */
+ bool writer; /* True iff configured to write. */
} H5FD_vfd_swmr_t;
#define MAXADDR (((haddr_t)1<<(8*sizeof(HDoff_t)-1))-1)
@@ -293,9 +294,6 @@ H5FD_vfd_swmr_open(const char *name, unsigned flags, hid_t fapl_id,
"can't get VFD SWMR config info");
}
- /* Ensure that this is the reader */
- HDassert(!vfd_swmr_config->writer);
-
/* Create the new driver struct */
if(NULL == (file = H5FL_CALLOC(H5FD_vfd_swmr_t))) {
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL,
@@ -314,6 +312,12 @@ H5FD_vfd_swmr_open(const char *name, unsigned flags, hid_t fapl_id,
sizeof(file->md_file_path));
file->md_file_path[sizeof(file->md_file_path) - 1] = '\0';
+ file->writer = vfd_swmr_config->writer;
+
+ /* Ensure that this is the reader */
+ if (vfd_swmr_config->writer)
+ goto finish;
+
file->api_elapsed_nslots = vfd_swmr_config->max_lag + 1;
file->api_elapsed_ticks =
@@ -346,6 +350,8 @@ H5FD_vfd_swmr_open(const char *name, unsigned flags, hid_t fapl_id,
HGOTO_ERROR(H5E_VFL, H5E_CANTGET, NULL,
"unable to load/decode the md file header/index");
+finish:
+
/* Hard-wired to open the underlying HDF5 file with SEC2 */
if((file->hdf5_file_lf = H5FD_open(name, flags, H5P_FILE_ACCESS_DEFAULT,
maxaddr)) == NULL)
@@ -419,6 +425,9 @@ H5FD_vfd_swmr_close(H5FD_t *_file)
"unable to close the HDF5 file")
}
+ if (!file->writer)
+ goto finish;
+
vfd_swmr_reader_did_increase_tick_to(0);
if (file->api_elapsed_ticks != NULL) {
@@ -442,6 +451,8 @@ H5FD_vfd_swmr_close(H5FD_t *_file)
file->md_index.entries = H5FL_SEQ_FREE(H5FD_vfd_swmr_idx_entry_t,
file->md_index.entries);
+finish:
+
/* Release the driver info */
file = H5FL_FREE(H5FD_vfd_swmr_t, file);
@@ -702,6 +713,9 @@ H5FD_vfd_swmr_read(H5FD_t *_file, H5FD_mem_t type,
herr_t ret_value = SUCCEED;
char *p = buf;
+ if (file->writer)
+ return H5FD_read(file->hdf5_file_lf, type, addr, size, buf);
+
FUNC_ENTER_NOAPI_NOINIT
HDassert(file && file->pub.cls);
@@ -823,23 +837,11 @@ H5FD_vfd_swmr_write(H5FD_t *_file, H5FD_mem_t type,
hid_t H5_ATTR_UNUSED dxpl_id, haddr_t addr, size_t size, const void *buf)
{
H5FD_vfd_swmr_t *file = (H5FD_vfd_swmr_t *)_file;
- herr_t ret_value = SUCCEED;
-
- FUNC_ENTER_NOAPI_NOINIT
-
- HDassert(file && file->pub.cls);
- HDassert(buf);
- /* This function should always fail. For now assert FALSE */
- HDassert(FALSE);
+ HDassert(file->writer);
- /* SHOULDN'T come here ?? */
- if(H5FD_write(file->hdf5_file_lf, type, addr, size, buf) < 0)
- HGOTO_ERROR(H5E_VFL, H5E_WRITEERROR, FAIL, "file write request failed")
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_vfd_swmr_write() */
+ return H5FD_write(file->hdf5_file_lf, type, addr, size, buf);
+}
/*-------------------------------------------------------------------------
@@ -857,9 +859,6 @@ H5FD_vfd_swmr_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id,
hbool_t closing)
{
H5FD_vfd_swmr_t *file = (H5FD_vfd_swmr_t *)_file; /* VFD SWMR file struct */
- herr_t ret_value = SUCCEED; /* Return value */
-
- FUNC_ENTER_NOAPI_NOINIT
/* The VFD SWMR vfd should only be used by the VFD SWMR reader,
* and thus this file should only be opened R/O.
@@ -868,16 +867,10 @@ H5FD_vfd_swmr_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id,
*
* For now, just assert FALSE.
*/
- HDassert(FALSE);
+ HDassert(file->writer);
- HDassert(file);
-
- if(H5FD_truncate(file->hdf5_file_lf, closing) < 0)
- HGOTO_ERROR(H5E_IO, H5E_BADVALUE, FAIL, "unable to truncate the HDF5 file")
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_vfd_swmr_truncate() */
+ return H5FD_truncate(file->hdf5_file_lf, closing);
+}
/*-------------------------------------------------------------------------