summaryrefslogtreecommitdiffstats
path: root/src/H5MV.c
diff options
context:
space:
mode:
authorDavid Young <dyoung@hdfgroup.org>2020-08-03 16:11:23 (GMT)
committerDavid Young <dyoung@hdfgroup.org>2020-08-03 16:11:23 (GMT)
commit20a6b825972ef359c33fcd2e79177b812696f14c (patch)
tree362038b8f8d428e18cd2b3103ae9f9125b5b74de /src/H5MV.c
parentb9888cceff95787373555b1ecc6c2b7e114abcba (diff)
downloadhdf5-20a6b825972ef359c33fcd2e79177b812696f14c.zip
hdf5-20a6b825972ef359c33fcd2e79177b812696f14c.tar.gz
hdf5-20a6b825972ef359c33fcd2e79177b812696f14c.tar.bz2
In VFD SWMR, use `H5F_shared_t` instead of `H5F_t` wherever that is possible.
Diffstat (limited to 'src/H5MV.c')
-rw-r--r--src/H5MV.c82
1 files changed, 40 insertions, 42 deletions
diff --git a/src/H5MV.c b/src/H5MV.c
index ffa33ba..5b73b9a 100644
--- a/src/H5MV.c
+++ b/src/H5MV.c
@@ -113,6 +113,7 @@ HLOG_OUTLET_SHORT_DEFN(h5mv, all);
herr_t
H5MV__create(H5F_t *f)
{
+ H5F_shared_t *shared = f->shared;
/* Free space section classes implemented for file */
const H5FS_section_class_t *classes[] = { H5MV_FSPACE_SECT_CLS_SIMPLE };
H5FS_create_t fs_create; /* Free space creation parameters */
@@ -123,22 +124,21 @@ H5MV__create(H5F_t *f)
/*
* Check arguments.
*/
- HDassert(f->shared);
- HDassert(f->shared->fs_state_md == H5F_FS_STATE_CLOSED);
+ HDassert(shared->fs_state_md == H5F_FS_STATE_CLOSED);
/* Set the free space creation parameters */
fs_create.client = H5FS_CLIENT_MD_VFD_ID;
fs_create.shrink_percent = H5MV_FSPACE_SHRINK;
fs_create.expand_percent = H5MV_FSPACE_EXPAND;
- fs_create.max_sect_addr = 1 + H5VM_log2_gen((uint64_t)f->shared->maxaddr);
- fs_create.max_sect_size = f->shared->maxaddr;
+ fs_create.max_sect_addr = 1 + H5VM_log2_gen((uint64_t)shared->maxaddr);
+ fs_create.max_sect_size = shared->maxaddr;
- if(NULL == (f->shared->fs_man_md = H5FS_create(f, NULL, &fs_create, NELMTS(classes), classes, f, f->shared->fs_page_size, f->shared->fs_page_size)))
+ if(NULL == (shared->fs_man_md = H5FS_create(f, NULL, &fs_create, NELMTS(classes), classes, f, shared->fs_page_size, shared->fs_page_size)))
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize free space info")
/* Set the state for the free space manager to "open", if it is now */
- if(f->shared->fs_man_md)
- f->shared->fs_state_md = H5F_FS_STATE_OPEN;
+ if(shared->fs_man_md)
+ shared->fs_state_md = H5F_FS_STATE_OPEN;
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -158,6 +158,7 @@ done:
herr_t
H5MV_close(H5F_t *f)
{
+ H5F_shared_t *shared = f->shared;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
@@ -165,25 +166,24 @@ H5MV_close(H5F_t *f)
/*
* Check arguments.
*/
- HDassert(f);
- HDassert(f->shared);
+ HDassert(shared);
#ifdef H5MV_VFD_SWMR_DEBUG
HDfprintf(stderr, "%s: Trying to close free space manager\n", FUNC);
#endif
/* Close an existing free space structure for the file */
- if(f->shared->fs_man_md) {
+ if(shared->fs_man_md) {
#ifdef H5MV_VFD_SWMR_DEBUG
HDfprintf(stderr, "%s: Going to close free space manager\n", FUNC);
#endif
- HDassert(f->shared->fs_state_md != H5F_FS_STATE_CLOSED);
+ HDassert(shared->fs_state_md != H5F_FS_STATE_CLOSED);
- if(H5FS_close(f, f->shared->fs_man_md) < 0)
+ if(H5FS_close(f, shared->fs_man_md) < 0)
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't release free space info")
}
- f->shared->fs_man_md = NULL;
- f->shared->fs_state_md = H5F_FS_STATE_CLOSED;
+ shared->fs_man_md = NULL;
+ shared->fs_state_md = H5F_FS_STATE_CLOSED;
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -275,6 +275,7 @@ done:
haddr_t
H5MV_alloc(H5F_t *f, hsize_t size)
{
+ H5F_shared_t *shared = f->shared;
haddr_t eoa; /* EOA for the file */
hsize_t frag_size = 0; /* Fragment size */
hsize_t misalign_size = 0; /* Mis-aligned size */
@@ -285,14 +286,12 @@ H5MV_alloc(H5F_t *f, hsize_t size)
hlog_fast(h5mv, "%s: enter size %" PRIuHSIZE, __func__, size);
/* check arguments */
- HDassert(f);
- HDassert(f->shared);
- HDassert(f->shared->vfd_swmr_md_fd >= 0);
+ HDassert(shared->vfd_swmr_md_fd >= 0);
HDassert(size > 0);
/* Search for large enough space in the free space manager */
- if(f->shared->fs_man_md != NULL) {
- if(H5MV__find_sect(f, size, f->shared->fs_man_md, &ret_value) < 0)
+ if(shared->fs_man_md != NULL) {
+ if(H5MV__find_sect(f, size, shared->fs_man_md, &ret_value) < 0)
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "error locating a node")
}
@@ -300,32 +299,32 @@ H5MV_alloc(H5F_t *f, hsize_t size)
if(!H5F_addr_defined(ret_value)) {
/* Get the EOA for the metadata file */
- if(HADDR_UNDEF == (eoa = H5MV_get_vfd_swmr_md_eoa(f)))
+ if(HADDR_UNDEF == (eoa = H5MV_get_vfd_swmr_md_eoa(shared)))
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, HADDR_UNDEF, "Unable to get eoa for VFD SWMR metadata file")
/* If EOA is mis-aligned, calculate the fragment size */
- if(H5F_addr_gt(eoa, 0) && (misalign_size = eoa % f->shared->fs_page_size))
- frag_size = f->shared->fs_page_size - misalign_size;
+ if(H5F_addr_gt(eoa, 0) && (misalign_size = eoa % shared->fs_page_size))
+ frag_size = shared->fs_page_size - misalign_size;
/* Allocate from end of file */
- if(HADDR_UNDEF == (ret_value = H5MV__alloc_md(f->shared, size + frag_size)))
+ if(HADDR_UNDEF == (ret_value = H5MV__alloc_md(shared, size + frag_size)))
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, HADDR_UNDEF, "allocation failed")
/* If there is a mis-aligned fragment at EOA */
if(frag_size) {
/* Start up the free-space manager if not so */
- if(f->shared->fs_man_md == NULL) {
+ if(shared->fs_man_md == NULL) {
if(H5MV__create(f) < 0)
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, HADDR_UNDEF, "can't initialize free space manager")
}
- HDassert(f->shared->fs_man_md);
+ HDassert(shared->fs_man_md);
/* Create the free-space section for the fragment */
if(NULL == (node = H5MV__sect_new(eoa, frag_size)))
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, HADDR_UNDEF, "can't initialize free space section")
/* Add the section */
- if(H5FS_sect_add(f, f->shared->fs_man_md, &node->sect_info, H5FS_ADD_RETURNED_SPACE, f) < 0)
+ if(H5FS_sect_add(f, shared->fs_man_md, &node->sect_info, H5FS_ADD_RETURNED_SPACE, f) < 0)
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINSERT, HADDR_UNDEF, "can't re-add section to file free space")
node = NULL;
@@ -358,6 +357,7 @@ done:
herr_t
H5MV_free(H5F_t *f, haddr_t addr, hsize_t size)
{
+ H5F_shared_t *shared = f->shared;
H5MV_free_section_t *node = NULL; /* Free space section pointer */
herr_t ret_value = SUCCEED; /* Return value */
@@ -374,7 +374,7 @@ H5MV_free(H5F_t *f, haddr_t addr, hsize_t size)
/* Check if the free space manager for the file has been initialized */
- if(f->shared->fs_man_md == NULL) {
+ if(shared->fs_man_md == NULL) {
/* If there's no free space manager for objects of this type,
* see if we can avoid creating one by checking if the freed
* space is at the end of the file
@@ -393,7 +393,7 @@ H5MV_free(H5F_t *f, haddr_t addr, hsize_t size)
/* If we are deleting the free space manager, leave now, to avoid
* [re-]starting it: dropping free space section on the floor.
*/
- if(f->shared->fs_state_md == H5F_FS_STATE_DELETING) {
+ if(shared->fs_state_md == H5F_FS_STATE_DELETING) {
hlog_fast(h5mv, "%s: dropping addr %" PRIuHADDR
" size %" PRIuHSIZE " on the floor!", __func__, addr, size);
HGOTO_DONE(SUCCEED)
@@ -411,13 +411,13 @@ H5MV_free(H5F_t *f, haddr_t addr, hsize_t size)
if(NULL == (node = H5MV__sect_new(addr, size)))
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize free space section")
- HDassert(f->shared->fs_man_md);
+ HDassert(shared->fs_man_md);
hlog_fast(h5mv, "%s: before H5FS_sect_add, addr %" PRIuHADDR
" size %" PRIuHSIZE, __func__, addr, size);
/* Add the section */
- if(H5FS_sect_add(f, f->shared->fs_man_md, &node->sect_info, H5FS_ADD_RETURNED_SPACE, f) < 0)
+ if(H5FS_sect_add(f, shared->fs_man_md, &node->sect_info, H5FS_ADD_RETURNED_SPACE, f) < 0)
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINSERT, FAIL, "can't re-add section to file free space")
node = NULL;
@@ -450,6 +450,7 @@ done:
htri_t
H5MV_try_extend(H5F_t *f, haddr_t addr, hsize_t size, hsize_t extra_requested)
{
+ H5F_shared_t *shared = f->shared;
haddr_t end; /* End of block to extend */
htri_t ret_value = FALSE; /* Return value */
@@ -460,13 +461,13 @@ HDfprintf(stderr, "%s: Entering: addr = %a, size = %Hu, extra_requested = %Hu\n"
/* Sanity check */
HDassert(f);
- HDassert(H5F_INTENT(f) & H5F_ACC_RDWR);
+ HDassert(H5F_SHARED_INTENT(shared) & H5F_ACC_RDWR);
/* Compute end of block to extend */
end = addr + size;
/* Try extending the block at EOA */
- if((ret_value = H5MV__try_extend_md(f->shared, end, extra_requested)) < 0)
+ if((ret_value = H5MV__try_extend_md(shared, end, extra_requested)) < 0)
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTEXTEND, FAIL, "error extending file")
#ifdef H5MV_VFD_SWMR_DEBUG
HDfprintf(stderr, "%s: extended = %t\n", FUNC, ret_value);
@@ -476,8 +477,8 @@ HDfprintf(stderr, "%s: extended = %t\n", FUNC, ret_value);
if(ret_value == FALSE) {
/* Try to extend the block into a free-space section */
- if(f->shared->fs_man_md) {
- if((ret_value = H5FS_sect_try_extend(f, f->shared->fs_man_md, addr, size, extra_requested, H5FS_ADD_RETURNED_SPACE, NULL)) < 0)
+ if(shared->fs_man_md) {
+ if((ret_value = H5FS_sect_try_extend(f, shared->fs_man_md, addr, size, extra_requested, H5FS_ADD_RETURNED_SPACE, NULL)) < 0)
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTEXTEND, FAIL, "error extending block in free space manager")
#ifdef H5MV_VFD_SWMR_DEBUG
HDfprintf(stderr, "%s: Try to H5FS_sect_try_extend = %t\n", FUNC, ret_value);
@@ -507,6 +508,7 @@ HDfprintf(stderr, "%s: Leaving: ret_value = %t\n", FUNC, ret_value);
htri_t
H5MV_try_shrink(H5F_t *f, haddr_t addr, hsize_t size)
{
+ H5F_shared_t *shared = f->shared;
H5MV_free_section_t *node = NULL; /* Free space section pointer */
htri_t ret_value = FALSE; /* Return value */
@@ -516,9 +518,7 @@ HDfprintf(stderr, "%s: Entering - addr = %a, size = %Hu\n", FUNC, addr, size);
#endif
/* check arguments */
- HDassert(f);
- HDassert(f->shared);
- HDassert(f->shared->lf);
+ HDassert(shared->lf);
HDassert(H5F_addr_defined(addr));
HDassert(size > 0);
@@ -710,14 +710,12 @@ done:
*-------------------------------------------------------------------------
*/
haddr_t
-H5MV_get_vfd_swmr_md_eoa(const H5F_t *f)
+H5MV_get_vfd_swmr_md_eoa(const H5F_shared_t *shared)
{
/* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
FUNC_ENTER_NOAPI_NOINIT_NOERR
- HDassert(f);
- HDassert(f->shared);
- HDassert(f->shared->vfd_swmr);
+ HDassert(shared->vfd_swmr);
- FUNC_LEAVE_NOAPI(f->shared->vfd_swmr_md_eoa)
+ FUNC_LEAVE_NOAPI(shared->vfd_swmr_md_eoa)
}