summaryrefslogtreecommitdiffstats
path: root/src/H5HFint.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5HFint.c')
-rw-r--r--src/H5HFint.c35
1 files changed, 25 insertions, 10 deletions
diff --git a/src/H5HFint.c b/src/H5HFint.c
index 627f6e6..4464bb1 100644
--- a/src/H5HFint.c
+++ b/src/H5HFint.c
@@ -975,6 +975,7 @@ HDfprintf(stderr, "%s: shared->man_dtable.next_dir_block = %Hu\n", FUNC, shared-
HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to locate indirect block with space for direct block")
#ifdef QAK
HDfprintf(stderr, "%s: dblock_entry = %Zu\n", FUNC, dblock_entry);
+HDfprintf(stderr, "%s: dblock_size = %Zu\n", FUNC, dblock_size);
#endif /* QAK */
/* Create new direct block at corrent location*/
@@ -1469,13 +1470,15 @@ HGOTO_ERROR(H5E_HEAP, H5E_UNSUPPORTED, NULL, "skipping direct block sizes not su
/* Check for special case of second row, which has blocks the same size as first row */
if(iblock->next_dir_row == 1)
- iblock->next_dir_size = shared->man_dtable.table_addr;
+ iblock->next_dir_size = shared->man_dtable.cparam.start_block_size;
/* Compute new # of rows in indirect block */
new_nrows = 2 * iblock->ndir_rows;
if(new_nrows > iblock->max_direct_rows)
new_nrows = iblock->max_direct_rows;
+#ifdef QAK
HDfprintf(stderr, "%s: new_nrows = %u\n", FUNC, new_nrows);
+#endif /* QAK */
/* Currently, the old chunk data is "thrown away" after the space is reallocated,
* so avoid data copy in H5MF_realloc() call by just free'ing the space and
@@ -1495,17 +1498,10 @@ HDfprintf(stderr, "%s: new_nrows = %u\n", FUNC, new_nrows);
iblock->ndir_rows = new_nrows;
iblock->size = H5HF_MAN_INDIRECT_SIZE(shared, iblock);
- /* Mark indirect block as dirty */
- iblock->dirty = TRUE;
-
/* Allocate space for the new indirect block on disk */
if(HADDR_UNDEF == (shared->man_dtable.table_addr = H5MF_alloc(shared->f, H5FD_MEM_FHEAP_IBLOCK, dxpl_id, (hsize_t)iblock->size)))
HGOTO_ERROR(H5E_STORAGE, H5E_NOSPACE, NULL, "file allocation failed for fractal heap indirect block")
- /* Move object in cache */
- if(H5AC_rename(shared->f, H5AC_FHEAP_IBLOCK, shared->man_dtable.table_addr, old_addr) < 0)
- HGOTO_ERROR(H5E_HEAP, H5E_CANTSPLIT, NULL, "unable to move fractal heap root indirect block")
-
/* Re-allocate direct block entry table */
if(NULL == (iblock->dblock_ents = H5FL_SEQ_REALLOC(H5HF_indirect_dblock_ent_t, iblock->dblock_ents, (iblock->ndir_rows * shared->man_dtable.cparam.width))))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for direct entries")
@@ -1518,11 +1514,30 @@ HDfprintf(stderr, "%s: new_nrows = %u\n", FUNC, new_nrows);
iblock->dblock_ents[u].free_space = 0;
} /* end for */
+ /* Mark indirect block as dirty */
+ iblock->dirty = TRUE;
+
+ /* Release the indirect block (marked as dirty) */
+ if(H5AC_unprotect(shared->f, dxpl_id, H5AC_FHEAP_IBLOCK, old_addr, iblock, H5AC__DIRTIED_FLAG) < 0)
+ HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, NULL, "unable to release fractal heap indirect block")
+
+ /* Move object in cache */
+ if(H5AC_rename(shared->f, H5AC_FHEAP_IBLOCK, old_addr, shared->man_dtable.table_addr) < 0)
+ HGOTO_ERROR(H5E_HEAP, H5E_CANTSPLIT, NULL, "unable to move fractal heap root indirect block")
+
+ /* Update other shared header info */
+ shared->man_dtable.curr_root_rows = new_nrows;
+
/* Mark heap header as modified */
shared->dirty = TRUE;
-HDfprintf(stderr, "%s: Adding direct block of different size to heap not supported\n", FUNC);
-HGOTO_ERROR(H5E_HEAP, H5E_UNSUPPORTED, NULL, "allocating objects from non root block not supported yet")
+ /* Lock root indirect block (again) */
+ par_shared.shared = fh_shared;
+ par_shared.parent = NULL;
+ par_shared.parent_entry = 0;
+ par_shared.parent_free_space = shared->total_man_free;
+ if(NULL == (iblock = H5AC_protect(shared->f, dxpl_id, H5AC_FHEAP_IBLOCK, shared->man_dtable.table_addr, &shared->man_dtable.curr_root_rows, &par_shared, H5AC_WRITE)))
+ HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to protect fractal heap indirect block")
} /* end if */
/* Set address of indirect block */