diff options
Diffstat (limited to 'src/H5HFiblock.c')
-rw-r--r-- | src/H5HFiblock.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/H5HFiblock.c b/src/H5HFiblock.c index c989bfc..4473803 100644 --- a/src/H5HFiblock.c +++ b/src/H5HFiblock.c @@ -438,7 +438,20 @@ H5HF_man_iblock_root_create(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t min_dblock_si /* Attach direct block to new root indirect block */ dblock->parent = iblock; + dblock->fd_parent = iblock; dblock->par_entry = 0; + + /* destroy flush dependency between direct block and header */ + if(H5AC_destroy_flush_dependency(dblock->hdr, dblock) < 0) + HGOTO_ERROR(H5E_HEAP, H5E_CANTUNDEPEND, FAIL, \ + "unable to destroy flush dependency") + + /* create flush dependency between direct block and new root indirect block */ + if(H5AC_create_flush_dependency(dblock->parent, dblock) < 0) + HGOTO_ERROR(H5E_HEAP, H5E_CANTDEPEND, FAIL, \ + "unable to create flush dependency") + + if(H5HF_man_iblock_attach(iblock, 0, hdr->man_dtable.table_addr) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTATTACH, FAIL, "can't attach root direct block to parent indirect block") @@ -884,6 +897,19 @@ H5HF_man_iblock_root_revert(H5HF_indirect_t *root_iblock, hid_t dxpl_id) dblock->parent = NULL; dblock->par_entry = 0; + /* destroy flush dependency between old root iblock and new root direct block*/ + if(H5AC_destroy_flush_dependency(dblock->fd_parent, dblock) < 0) + HGOTO_ERROR(H5E_HEAP, H5E_CANTUNDEPEND, FAIL, \ + "unable to destroy flush dependency") + + + /* create flush dependency between header and new root direct block */ + if(H5AC_create_flush_dependency(dblock->hdr, dblock) < 0) + HGOTO_ERROR(H5E_HEAP, H5E_CANTDEPEND, FAIL, \ + "unable to create flush dependency") + + dblock->fd_parent = NULL; + /* Point root at direct block */ hdr->man_dtable.curr_root_rows = 0; hdr->man_dtable.table_addr = dblock_addr; @@ -1078,6 +1104,12 @@ H5HF_man_iblock_create(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_indirect_t *par_iblo /* Attach to parent indirect block, if there is one */ iblock->parent = par_iblock; + iblock->fd_parent = par_iblock; /* this copy of the parent pointer is */ + /* needed by the notify callback so */ + /* that it can take down flush */ + /* dependencies on eviction even if */ + /* the parent pointer has been nulled */ + /* out. JRM -- 5/18/14 */ iblock->par_entry = par_entry; if(iblock->parent) { /* Attach new block to parent */ |