From 952c60946cc4a91f30b456519568184bed6ce75b Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Tue, 22 Aug 2006 12:52:14 -0500 Subject: [svn-r12613] Description: Reorder metadata cache callbacks to be more sensible. Tested on: None - just eyeballed, very simple change --- src/H5B2cache.c | 436 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 218 insertions(+), 218 deletions(-) diff --git a/src/H5B2cache.c b/src/H5B2cache.c index 684ea7b..1a531ce 100644 --- a/src/H5B2cache.c +++ b/src/H5B2cache.c @@ -65,14 +65,14 @@ static H5B2_t *H5B2_cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const static herr_t H5B2_cache_hdr_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B2_t *b); static herr_t H5B2_cache_hdr_clear(H5F_t *f, H5B2_t *b, hbool_t destroy); static herr_t H5B2_cache_hdr_size(const H5F_t *f, const H5B2_t *bt, size_t *size_ptr); -static H5B2_leaf_t *H5B2_cache_leaf_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_nrec, void *_shared); -static herr_t H5B2_cache_leaf_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B2_leaf_t *l); -static herr_t H5B2_cache_leaf_clear(H5F_t *f, H5B2_leaf_t *l, hbool_t destroy); -static herr_t H5B2_cache_leaf_size(const H5F_t *f, const H5B2_leaf_t *l, size_t *size_ptr); static H5B2_internal_t *H5B2_cache_internal_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_nrec, void *_shared); static herr_t H5B2_cache_internal_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B2_internal_t *i); static herr_t H5B2_cache_internal_clear(H5F_t *f, H5B2_internal_t *i, hbool_t destroy); static herr_t H5B2_cache_internal_size(const H5F_t *f, const H5B2_internal_t *i, size_t *size_ptr); +static H5B2_leaf_t *H5B2_cache_leaf_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_nrec, void *_shared); +static herr_t H5B2_cache_leaf_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B2_leaf_t *l); +static herr_t H5B2_cache_leaf_clear(H5F_t *f, H5B2_leaf_t *l, hbool_t destroy); +static herr_t H5B2_cache_leaf_size(const H5F_t *f, const H5B2_leaf_t *l, size_t *size_ptr); /*********************/ /* Package Variables */ @@ -89,16 +89,6 @@ const H5AC_class_t H5AC_BT2_HDR[1] = {{ }}; /* H5B2 inherits cache-like properties from H5AC */ -const H5AC_class_t H5AC_BT2_LEAF[1] = {{ - H5AC_BT2_LEAF_ID, - (H5AC_load_func_t)H5B2_cache_leaf_load, - (H5AC_flush_func_t)H5B2_cache_leaf_flush, - (H5AC_dest_func_t)H5B2_cache_leaf_dest, - (H5AC_clear_func_t)H5B2_cache_leaf_clear, - (H5AC_size_func_t)H5B2_cache_leaf_size, -}}; - -/* H5B2 inherits cache-like properties from H5AC */ const H5AC_class_t H5AC_BT2_INT[1] = {{ H5AC_BT2_INT_ID, (H5AC_load_func_t)H5B2_cache_internal_load, @@ -108,6 +98,16 @@ const H5AC_class_t H5AC_BT2_INT[1] = {{ (H5AC_size_func_t)H5B2_cache_internal_size, }}; +/* H5B2 inherits cache-like properties from H5AC */ +const H5AC_class_t H5AC_BT2_LEAF[1] = {{ + H5AC_BT2_LEAF_ID, + (H5AC_load_func_t)H5B2_cache_leaf_load, + (H5AC_flush_func_t)H5B2_cache_leaf_flush, + (H5AC_dest_func_t)H5B2_cache_leaf_dest, + (H5AC_clear_func_t)H5B2_cache_leaf_clear, + (H5AC_size_func_t)H5B2_cache_leaf_size, +}}; + /*****************************/ /* Library Private Variables */ /*****************************/ @@ -420,11 +420,11 @@ H5B2_cache_hdr_size(const H5F_t *f, const H5B2_t UNUSED *bt2, size_t *size_ptr) /*------------------------------------------------------------------------- - * Function: H5B2_cache_leaf_load + * Function: H5B2_cache_internal_load * - * Purpose: Loads a B-tree leaf from the disk. + * Purpose: Loads a B-tree internal node from the disk. * - * Return: Success: Pointer to a new B-tree leaf node. + * Return: Success: Pointer to a new B-tree internal node. * * Failure: NULL * @@ -434,68 +434,73 @@ H5B2_cache_hdr_size(const H5F_t *f, const H5B2_t UNUSED *bt2, size_t *size_ptr) * *------------------------------------------------------------------------- */ -static H5B2_leaf_t * -H5B2_cache_leaf_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_nrec, void *_bt2_shared) +static H5B2_internal_t * +H5B2_cache_internal_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_nrec, void *_bt2_shared) { const unsigned *nrec = (const unsigned *)_nrec; - H5RC_t *bt2_shared = (H5RC_t *)_bt2_shared; /* Shared B-tree information */ + H5RC_t *bt2_shared = (H5RC_t *)_bt2_shared; /* Ref counter for shared B-tree info */ H5B2_shared_t *shared; /* Shared B-tree information */ - H5B2_leaf_t *leaf = NULL; /* Pointer to lead node loaded */ + H5B2_internal_t *internal = NULL; /* Internal node read */ uint8_t *p; /* Pointer into raw data buffer */ - uint8_t *native; /* Pointer to native keys */ + uint8_t *native; /* Pointer to native record info */ + H5B2_node_ptr_t *int_node_ptr; /* Pointer to node pointer info */ unsigned u; /* Local index variable */ - H5B2_leaf_t *ret_value; /* Return value */ + H5B2_internal_t *ret_value; /* Return value */ - FUNC_ENTER_NOAPI(H5B2_cache_leaf_load, NULL) + FUNC_ENTER_NOAPI(H5B2_cache_internal_load, NULL) /* Check arguments */ HDassert(f); HDassert(H5F_addr_defined(addr)); HDassert(bt2_shared); - if(NULL == (leaf = H5FL_MALLOC(H5B2_leaf_t))) + if(NULL == (internal = H5FL_MALLOC(H5B2_internal_t))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") - HDmemset(&leaf->cache_info, 0, sizeof(H5AC_info_t)); + HDmemset(&internal->cache_info, 0, sizeof(H5AC_info_t)); /* Share common B-tree information */ - leaf->shared = bt2_shared; - H5RC_INC(leaf->shared); + internal->shared = bt2_shared; + H5RC_INC(internal->shared); /* Get the pointer to the shared B-tree info */ - shared = H5RC_GET_OBJ(leaf->shared); + shared=H5RC_GET_OBJ(internal->shared); HDassert(shared); /* Read header from disk */ - if(H5F_block_read(f, H5FD_MEM_BTREE, addr, shared->node_size, dxpl_id, shared->page) < 0) - HGOTO_ERROR(H5E_BTREE, H5E_READERROR, NULL, "can't read B-tree leaf node") + if(H5F_block_read(f, H5FD_MEM_BTREE, addr, shared->node_size, dxpl_id, shared->page)<0) + HGOTO_ERROR(H5E_BTREE, H5E_READERROR, NULL, "can't read B-tree internal node") p = shared->page; /* Magic number */ - if(HDmemcmp(p, H5B2_LEAF_MAGIC, (size_t)H5B2_SIZEOF_MAGIC)) - HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "wrong B-tree leaf node signature") + if(HDmemcmp(p, H5B2_INT_MAGIC, (size_t)H5B2_SIZEOF_MAGIC)) + HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "wrong B-tree internal node signature") p += H5B2_SIZEOF_MAGIC; /* Version */ - if(*p++ != H5B2_LEAF_VERSION) - HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "wrong B-tree leaf node version") + if(*p++ != H5B2_INT_VERSION) + HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "wrong B-tree internal node version") /* XXX: Add metadata flags & checksum to v2 B-tree metadata (like fractal heap) */ /* B-tree type */ - if(*p++ != (uint8_t)shared->type->id) + if (*p++ != (uint8_t)shared->type->id) HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "incorrect B-tree type") /* Allocate space for the native keys in memory */ - if((leaf->leaf_native = H5FL_FAC_MALLOC(shared->leaf_fac)) == NULL) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for B-tree leaf native keys") + if((internal->int_native = H5FL_FAC_MALLOC(shared->int_fac)) == NULL) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for B-tree internal native keys") + + /* Allocate space for the node pointers in memory */ + if((internal->node_ptrs = H5FL_FAC_MALLOC(shared->node_ptr_fac)) == NULL) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for B-tree internal node pointers") /* Set the number of records in the leaf */ - leaf->nrec = *nrec; + internal->nrec = *nrec; - /* Deserialize records for leaf node */ - native = leaf->leaf_native; - for(u = 0; u < leaf->nrec; u++) { + /* Deserialize records for internal node */ + native = internal->int_native; + for(u = 0; u < internal->nrec; u++) { /* Decode record */ if((shared->type->decode)(f, p, native) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTENCODE, NULL, "unable to decode B-tree record") @@ -505,69 +510,82 @@ H5B2_cache_leaf_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_nrec, v native += shared->type->nrec_size; } /* end for */ + /* Deserialize node pointers for internal node */ + int_node_ptr = internal->node_ptrs; + for(u = 0; u < internal->nrec + 1; u++) { + /* Decode node pointer */ + H5F_addr_decode(f, (const uint8_t **)&p, &(int_node_ptr->addr)); + UINT16DECODE(p, int_node_ptr->node_nrec); + H5F_DECODE_LENGTH(f, p, int_node_ptr->all_nrec); + + /* Move to next node pointer */ + int_node_ptr++; + } /* end for */ + /* Sanity check parsing */ HDassert((size_t)(p - shared->page) <= shared->node_size); /* Set return value */ - ret_value = leaf; + ret_value = internal; done: - if(!ret_value && leaf) - (void)H5B2_cache_leaf_dest(f,leaf); + if(!ret_value && internal) + (void)H5B2_cache_internal_dest(f, internal); FUNC_LEAVE_NOAPI(ret_value) -} /* H5B2_cache_leaf_load() */ /*lint !e818 Can't make udata a pointer to const */ +} /* H5B2_cache_internal_load() */ /*lint !e818 Can't make udata a pointer to const */ /*------------------------------------------------------------------------- - * Function: H5B2_cache_leaf_flush + * Function: H5B2_cache_internal_flush * - * Purpose: Flushes a dirty B-tree leaf node to disk. + * Purpose: Flushes a dirty B-tree internal node to disk. * * Return: Non-negative on success/Negative on failure * * Programmer: Quincey Koziol * koziol@ncsa.uiuc.edu - * Feb 2 2005 + * Feb 3 2005 * *------------------------------------------------------------------------- */ static herr_t -H5B2_cache_leaf_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B2_leaf_t *leaf) +H5B2_cache_internal_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B2_internal_t *internal) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5B2_cache_leaf_flush, FAIL) + FUNC_ENTER_NOAPI(H5B2_cache_internal_flush, FAIL) /* check arguments */ HDassert(f); HDassert(H5F_addr_defined(addr)); - HDassert(leaf); + HDassert(internal); - if(leaf->cache_info.is_dirty) { + if(internal->cache_info.is_dirty) { H5B2_shared_t *shared; /* Shared B-tree information */ uint8_t *p; /* Pointer into raw data buffer */ - uint8_t *native; /* Pointer to native keys */ + uint8_t *native; /* Pointer to native record info */ + H5B2_node_ptr_t *int_node_ptr; /* Pointer to node pointer info */ unsigned u; /* Local index variable */ /* Get the pointer to the shared B-tree info */ - shared = H5RC_GET_OBJ(leaf->shared); + shared = H5RC_GET_OBJ(internal->shared); HDassert(shared); p = shared->page; - /* magic number */ - HDmemcpy(p, H5B2_LEAF_MAGIC, (size_t)H5B2_SIZEOF_MAGIC); + /* Magic number */ + HDmemcpy(p, H5B2_INT_MAGIC, (size_t)H5B2_SIZEOF_MAGIC); p += H5B2_SIZEOF_MAGIC; - /* version # */ - *p++ = H5B2_LEAF_VERSION; + /* Version # */ + *p++ = H5B2_INT_VERSION; - /* b-tree type */ + /* B-tree type */ *p++ = shared->type->id; - /* Serialize records for leaf node */ - native = leaf->leaf_native; - for(u = 0; u < leaf->nrec; u++) { + /* Serialize records for internal node */ + native = internal->int_native; + for(u = 0; u < internal->nrec; u++) { /* Encode record */ if((shared->type->encode)(f, p, native) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTENCODE, FAIL, "unable to encode B-tree record") @@ -577,27 +595,39 @@ H5B2_cache_leaf_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5 native += shared->type->nrec_size; } /* end for */ - /* Write the B-tree leaf node */ + /* Serialize node pointers for internal node */ + int_node_ptr = internal->node_ptrs; + for(u = 0; u < internal->nrec + 1; u++) { + /* Encode node pointer */ + H5F_addr_encode(f, &p, int_node_ptr->addr); + UINT16ENCODE(p, int_node_ptr->node_nrec); + H5F_ENCODE_LENGTH(f, p, int_node_ptr->all_nrec); + + /* Move to next node pointer */ + int_node_ptr++; + } /* end for */ + + /* Write the B-tree internal node */ HDassert((size_t)(p - shared->page) <= shared->node_size); if(H5F_block_write(f, H5FD_MEM_BTREE, addr, shared->node_size, dxpl_id, shared->page) < 0) - HGOTO_ERROR(H5E_BTREE, H5E_CANTFLUSH, FAIL, "unable to save B-tree leaf node to disk") + HGOTO_ERROR(H5E_BTREE, H5E_CANTFLUSH, FAIL, "unable to save B-tree internal node to disk") - leaf->cache_info.is_dirty = FALSE; + internal->cache_info.is_dirty = FALSE; } /* end if */ if(destroy) - if(H5B2_cache_leaf_dest(f, leaf) < 0) - HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree leaf node") + if(H5B2_cache_internal_dest(f, internal) < 0) + HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree internal node") done: FUNC_LEAVE_NOAPI(ret_value) -} /* H5B2_cache_leaf_flush() */ +} /* H5B2_cache_internal_flush() */ /*------------------------------------------------------------------------- - * Function: H5B2_cache_leaf_dest + * Function: H5B2_cache_internal_dest * - * Purpose: Destroys a B-tree leaf node in memory. + * Purpose: Destroys a B-tree internal node in memory. * * Return: Non-negative on success/Negative on failure * @@ -609,40 +639,44 @@ done: */ /* ARGSUSED */ herr_t -H5B2_cache_leaf_dest(H5F_t UNUSED *f, H5B2_leaf_t *leaf) +H5B2_cache_internal_dest(H5F_t UNUSED *f, H5B2_internal_t *internal) { H5B2_shared_t *shared; /* Shared B-tree information */ - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5B2_cache_leaf_dest) + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5B2_cache_internal_dest) /* * Check arguments. */ - HDassert(leaf); + HDassert(internal); /* Get the pointer to the shared B-tree info */ - shared = H5RC_GET_OBJ(leaf->shared); + shared = H5RC_GET_OBJ(internal->shared); HDassert(shared); - /* Release leaf's native key buffer */ - if(leaf->leaf_native) - H5FL_FAC_FREE(shared->leaf_fac,leaf->leaf_native); + /* Release internal node's native key buffer */ + if(internal->int_native) + H5FL_FAC_FREE(shared->int_fac, internal->int_native); + + /* Release internal node's node pointer buffer */ + if(internal->node_ptrs) + H5FL_FAC_FREE(shared->node_ptr_fac, internal->node_ptrs); /* Decrement reference count on shared B-tree info */ - if(leaf->shared) - H5RC_DEC(leaf->shared); + if(internal->shared) + H5RC_DEC(internal->shared); - /* Free B-tree leaf node info */ - H5FL_FREE(H5B2_leaf_t,leaf); + /* Free B-tree internal node info */ + H5FL_FREE(H5B2_internal_t, internal); FUNC_LEAVE_NOAPI(SUCCEED) -} /* end H5B2_cache_leaf_dest() */ +} /* end H5B2_cache_internal_dest() */ /*------------------------------------------------------------------------- - * Function: H5B2_cache_leaf_clear + * Function: H5B2_cache_internal_clear * - * Purpose: Mark a B-tree leaf node in memory as non-dirty. + * Purpose: Mark a B-tree internal node in memory as non-dirty. * * Return: Non-negative on success/Negative on failure * @@ -653,33 +687,33 @@ H5B2_cache_leaf_dest(H5F_t UNUSED *f, H5B2_leaf_t *leaf) *------------------------------------------------------------------------- */ static herr_t -H5B2_cache_leaf_clear(H5F_t *f, H5B2_leaf_t *leaf, hbool_t destroy) +H5B2_cache_internal_clear(H5F_t *f, H5B2_internal_t *internal, hbool_t destroy) { herr_t ret_value = SUCCEED; - FUNC_ENTER_NOAPI_NOINIT(H5B2_cache_leaf_clear) + FUNC_ENTER_NOAPI_NOINIT(H5B2_cache_internal_clear) /* * Check arguments. */ - HDassert(leaf); + HDassert(internal); /* Reset the dirty flag. */ - leaf->cache_info.is_dirty = FALSE; + internal->cache_info.is_dirty = FALSE; if(destroy) - if(H5B2_cache_leaf_dest(f, leaf) < 0) - HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree leaf node") + if(H5B2_cache_internal_dest(f, internal) < 0) + HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree internal node") done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5B2_cache_leaf_clear() */ +} /* end H5B2_cache_internal_clear() */ /*------------------------------------------------------------------------- - * Function: H5B2_cache_leaf_size + * Function: H5B2_cache_internal_size * - * Purpose: Compute the size in bytes of a B-tree leaf node + * Purpose: Compute the size in bytes of a B-tree internal node * on disk, and return it in *size_ptr. On failure, * the value of *size_ptr is undefined. * @@ -692,33 +726,33 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5B2_cache_leaf_size(const H5F_t UNUSED *f, const H5B2_leaf_t *leaf, size_t *size_ptr) +H5B2_cache_internal_size(const H5F_t UNUSED *f, const H5B2_internal_t *internal, size_t *size_ptr) { H5B2_shared_t *shared; /* Shared B-tree information */ - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5B2_cache_leaf_size) + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5B2_cache_internal_size) /* check arguments */ - HDassert(leaf); + HDassert(internal); HDassert(size_ptr); /* Get the pointer to the shared B-tree info */ - shared = H5RC_GET_OBJ(leaf->shared); + shared = H5RC_GET_OBJ(internal->shared); HDassert(shared); /* Set size value */ *size_ptr = shared->node_size; FUNC_LEAVE_NOAPI(SUCCEED) -} /* H5B2_cache_leaf_size() */ +} /* H5B2_cache_internal_size() */ /*------------------------------------------------------------------------- - * Function: H5B2_cache_internal_load + * Function: H5B2_cache_leaf_load * - * Purpose: Loads a B-tree internal node from the disk. + * Purpose: Loads a B-tree leaf from the disk. * - * Return: Success: Pointer to a new B-tree internal node. + * Return: Success: Pointer to a new B-tree leaf node. * * Failure: NULL * @@ -728,73 +762,68 @@ H5B2_cache_leaf_size(const H5F_t UNUSED *f, const H5B2_leaf_t *leaf, size_t *siz * *------------------------------------------------------------------------- */ -static H5B2_internal_t * -H5B2_cache_internal_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_nrec, void *_bt2_shared) +static H5B2_leaf_t * +H5B2_cache_leaf_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_nrec, void *_bt2_shared) { const unsigned *nrec = (const unsigned *)_nrec; - H5RC_t *bt2_shared = (H5RC_t *)_bt2_shared; /* Ref counter for shared B-tree info */ + H5RC_t *bt2_shared = (H5RC_t *)_bt2_shared; /* Shared B-tree information */ H5B2_shared_t *shared; /* Shared B-tree information */ - H5B2_internal_t *internal = NULL; /* Internal node read */ + H5B2_leaf_t *leaf = NULL; /* Pointer to lead node loaded */ uint8_t *p; /* Pointer into raw data buffer */ - uint8_t *native; /* Pointer to native record info */ - H5B2_node_ptr_t *int_node_ptr; /* Pointer to node pointer info */ + uint8_t *native; /* Pointer to native keys */ unsigned u; /* Local index variable */ - H5B2_internal_t *ret_value; /* Return value */ + H5B2_leaf_t *ret_value; /* Return value */ - FUNC_ENTER_NOAPI(H5B2_cache_internal_load, NULL) + FUNC_ENTER_NOAPI(H5B2_cache_leaf_load, NULL) /* Check arguments */ HDassert(f); HDassert(H5F_addr_defined(addr)); HDassert(bt2_shared); - if(NULL == (internal = H5FL_MALLOC(H5B2_internal_t))) + if(NULL == (leaf = H5FL_MALLOC(H5B2_leaf_t))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") - HDmemset(&internal->cache_info, 0, sizeof(H5AC_info_t)); + HDmemset(&leaf->cache_info, 0, sizeof(H5AC_info_t)); /* Share common B-tree information */ - internal->shared = bt2_shared; - H5RC_INC(internal->shared); + leaf->shared = bt2_shared; + H5RC_INC(leaf->shared); /* Get the pointer to the shared B-tree info */ - shared=H5RC_GET_OBJ(internal->shared); + shared = H5RC_GET_OBJ(leaf->shared); HDassert(shared); /* Read header from disk */ - if(H5F_block_read(f, H5FD_MEM_BTREE, addr, shared->node_size, dxpl_id, shared->page)<0) - HGOTO_ERROR(H5E_BTREE, H5E_READERROR, NULL, "can't read B-tree internal node") + if(H5F_block_read(f, H5FD_MEM_BTREE, addr, shared->node_size, dxpl_id, shared->page) < 0) + HGOTO_ERROR(H5E_BTREE, H5E_READERROR, NULL, "can't read B-tree leaf node") p = shared->page; /* Magic number */ - if(HDmemcmp(p, H5B2_INT_MAGIC, (size_t)H5B2_SIZEOF_MAGIC)) - HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "wrong B-tree internal node signature") + if(HDmemcmp(p, H5B2_LEAF_MAGIC, (size_t)H5B2_SIZEOF_MAGIC)) + HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "wrong B-tree leaf node signature") p += H5B2_SIZEOF_MAGIC; /* Version */ - if(*p++ != H5B2_INT_VERSION) - HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "wrong B-tree internal node version") + if(*p++ != H5B2_LEAF_VERSION) + HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "wrong B-tree leaf node version") /* XXX: Add metadata flags & checksum to v2 B-tree metadata (like fractal heap) */ /* B-tree type */ - if (*p++ != (uint8_t)shared->type->id) + if(*p++ != (uint8_t)shared->type->id) HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "incorrect B-tree type") /* Allocate space for the native keys in memory */ - if((internal->int_native = H5FL_FAC_MALLOC(shared->int_fac)) == NULL) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for B-tree internal native keys") - - /* Allocate space for the node pointers in memory */ - if((internal->node_ptrs = H5FL_FAC_MALLOC(shared->node_ptr_fac)) == NULL) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for B-tree internal node pointers") + if((leaf->leaf_native = H5FL_FAC_MALLOC(shared->leaf_fac)) == NULL) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for B-tree leaf native keys") /* Set the number of records in the leaf */ - internal->nrec = *nrec; + leaf->nrec = *nrec; - /* Deserialize records for internal node */ - native = internal->int_native; - for(u = 0; u < internal->nrec; u++) { + /* Deserialize records for leaf node */ + native = leaf->leaf_native; + for(u = 0; u < leaf->nrec; u++) { /* Decode record */ if((shared->type->decode)(f, p, native) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTENCODE, NULL, "unable to decode B-tree record") @@ -804,82 +833,69 @@ H5B2_cache_internal_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_nre native += shared->type->nrec_size; } /* end for */ - /* Deserialize node pointers for internal node */ - int_node_ptr = internal->node_ptrs; - for(u = 0; u < internal->nrec + 1; u++) { - /* Decode node pointer */ - H5F_addr_decode(f, (const uint8_t **)&p, &(int_node_ptr->addr)); - UINT16DECODE(p, int_node_ptr->node_nrec); - H5F_DECODE_LENGTH(f, p, int_node_ptr->all_nrec); - - /* Move to next node pointer */ - int_node_ptr++; - } /* end for */ - /* Sanity check parsing */ HDassert((size_t)(p - shared->page) <= shared->node_size); /* Set return value */ - ret_value = internal; + ret_value = leaf; done: - if(!ret_value && internal) - (void)H5B2_cache_internal_dest(f, internal); + if(!ret_value && leaf) + (void)H5B2_cache_leaf_dest(f,leaf); FUNC_LEAVE_NOAPI(ret_value) -} /* H5B2_cache_internal_load() */ /*lint !e818 Can't make udata a pointer to const */ +} /* H5B2_cache_leaf_load() */ /*lint !e818 Can't make udata a pointer to const */ /*------------------------------------------------------------------------- - * Function: H5B2_cache_internal_flush + * Function: H5B2_cache_leaf_flush * - * Purpose: Flushes a dirty B-tree internal node to disk. + * Purpose: Flushes a dirty B-tree leaf node to disk. * * Return: Non-negative on success/Negative on failure * * Programmer: Quincey Koziol * koziol@ncsa.uiuc.edu - * Feb 3 2005 + * Feb 2 2005 * *------------------------------------------------------------------------- */ static herr_t -H5B2_cache_internal_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B2_internal_t *internal) +H5B2_cache_leaf_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B2_leaf_t *leaf) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5B2_cache_internal_flush, FAIL) + FUNC_ENTER_NOAPI(H5B2_cache_leaf_flush, FAIL) /* check arguments */ HDassert(f); HDassert(H5F_addr_defined(addr)); - HDassert(internal); + HDassert(leaf); - if(internal->cache_info.is_dirty) { + if(leaf->cache_info.is_dirty) { H5B2_shared_t *shared; /* Shared B-tree information */ uint8_t *p; /* Pointer into raw data buffer */ - uint8_t *native; /* Pointer to native record info */ - H5B2_node_ptr_t *int_node_ptr; /* Pointer to node pointer info */ + uint8_t *native; /* Pointer to native keys */ unsigned u; /* Local index variable */ /* Get the pointer to the shared B-tree info */ - shared = H5RC_GET_OBJ(internal->shared); + shared = H5RC_GET_OBJ(leaf->shared); HDassert(shared); p = shared->page; - /* Magic number */ - HDmemcpy(p, H5B2_INT_MAGIC, (size_t)H5B2_SIZEOF_MAGIC); + /* magic number */ + HDmemcpy(p, H5B2_LEAF_MAGIC, (size_t)H5B2_SIZEOF_MAGIC); p += H5B2_SIZEOF_MAGIC; - /* Version # */ - *p++ = H5B2_INT_VERSION; + /* version # */ + *p++ = H5B2_LEAF_VERSION; - /* B-tree type */ + /* b-tree type */ *p++ = shared->type->id; - /* Serialize records for internal node */ - native = internal->int_native; - for(u = 0; u < internal->nrec; u++) { + /* Serialize records for leaf node */ + native = leaf->leaf_native; + for(u = 0; u < leaf->nrec; u++) { /* Encode record */ if((shared->type->encode)(f, p, native) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTENCODE, FAIL, "unable to encode B-tree record") @@ -889,39 +905,27 @@ H5B2_cache_internal_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr native += shared->type->nrec_size; } /* end for */ - /* Serialize node pointers for internal node */ - int_node_ptr = internal->node_ptrs; - for(u = 0; u < internal->nrec + 1; u++) { - /* Encode node pointer */ - H5F_addr_encode(f, &p, int_node_ptr->addr); - UINT16ENCODE(p, int_node_ptr->node_nrec); - H5F_ENCODE_LENGTH(f, p, int_node_ptr->all_nrec); - - /* Move to next node pointer */ - int_node_ptr++; - } /* end for */ - - /* Write the B-tree internal node */ + /* Write the B-tree leaf node */ HDassert((size_t)(p - shared->page) <= shared->node_size); if(H5F_block_write(f, H5FD_MEM_BTREE, addr, shared->node_size, dxpl_id, shared->page) < 0) - HGOTO_ERROR(H5E_BTREE, H5E_CANTFLUSH, FAIL, "unable to save B-tree internal node to disk") + HGOTO_ERROR(H5E_BTREE, H5E_CANTFLUSH, FAIL, "unable to save B-tree leaf node to disk") - internal->cache_info.is_dirty = FALSE; + leaf->cache_info.is_dirty = FALSE; } /* end if */ if(destroy) - if(H5B2_cache_internal_dest(f, internal) < 0) - HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree internal node") + if(H5B2_cache_leaf_dest(f, leaf) < 0) + HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree leaf node") done: FUNC_LEAVE_NOAPI(ret_value) -} /* H5B2_cache_internal_flush() */ +} /* H5B2_cache_leaf_flush() */ /*------------------------------------------------------------------------- - * Function: H5B2_cache_internal_dest + * Function: H5B2_cache_leaf_dest * - * Purpose: Destroys a B-tree internal node in memory. + * Purpose: Destroys a B-tree leaf node in memory. * * Return: Non-negative on success/Negative on failure * @@ -933,44 +937,40 @@ done: */ /* ARGSUSED */ herr_t -H5B2_cache_internal_dest(H5F_t UNUSED *f, H5B2_internal_t *internal) +H5B2_cache_leaf_dest(H5F_t UNUSED *f, H5B2_leaf_t *leaf) { H5B2_shared_t *shared; /* Shared B-tree information */ - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5B2_cache_internal_dest) + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5B2_cache_leaf_dest) /* * Check arguments. */ - HDassert(internal); + HDassert(leaf); /* Get the pointer to the shared B-tree info */ - shared = H5RC_GET_OBJ(internal->shared); + shared = H5RC_GET_OBJ(leaf->shared); HDassert(shared); - /* Release internal node's native key buffer */ - if(internal->int_native) - H5FL_FAC_FREE(shared->int_fac, internal->int_native); - - /* Release internal node's node pointer buffer */ - if(internal->node_ptrs) - H5FL_FAC_FREE(shared->node_ptr_fac, internal->node_ptrs); + /* Release leaf's native key buffer */ + if(leaf->leaf_native) + H5FL_FAC_FREE(shared->leaf_fac,leaf->leaf_native); /* Decrement reference count on shared B-tree info */ - if(internal->shared) - H5RC_DEC(internal->shared); + if(leaf->shared) + H5RC_DEC(leaf->shared); - /* Free B-tree internal node info */ - H5FL_FREE(H5B2_internal_t, internal); + /* Free B-tree leaf node info */ + H5FL_FREE(H5B2_leaf_t,leaf); FUNC_LEAVE_NOAPI(SUCCEED) -} /* end H5B2_cache_internal_dest() */ +} /* end H5B2_cache_leaf_dest() */ /*------------------------------------------------------------------------- - * Function: H5B2_cache_internal_clear + * Function: H5B2_cache_leaf_clear * - * Purpose: Mark a B-tree internal node in memory as non-dirty. + * Purpose: Mark a B-tree leaf node in memory as non-dirty. * * Return: Non-negative on success/Negative on failure * @@ -981,33 +981,33 @@ H5B2_cache_internal_dest(H5F_t UNUSED *f, H5B2_internal_t *internal) *------------------------------------------------------------------------- */ static herr_t -H5B2_cache_internal_clear(H5F_t *f, H5B2_internal_t *internal, hbool_t destroy) +H5B2_cache_leaf_clear(H5F_t *f, H5B2_leaf_t *leaf, hbool_t destroy) { herr_t ret_value = SUCCEED; - FUNC_ENTER_NOAPI_NOINIT(H5B2_cache_internal_clear) + FUNC_ENTER_NOAPI_NOINIT(H5B2_cache_leaf_clear) /* * Check arguments. */ - HDassert(internal); + HDassert(leaf); /* Reset the dirty flag. */ - internal->cache_info.is_dirty = FALSE; + leaf->cache_info.is_dirty = FALSE; if(destroy) - if(H5B2_cache_internal_dest(f, internal) < 0) - HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree internal node") + if(H5B2_cache_leaf_dest(f, leaf) < 0) + HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree leaf node") done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5B2_cache_internal_clear() */ +} /* end H5B2_cache_leaf_clear() */ /*------------------------------------------------------------------------- - * Function: H5B2_cache_internal_size + * Function: H5B2_cache_leaf_size * - * Purpose: Compute the size in bytes of a B-tree internal node + * Purpose: Compute the size in bytes of a B-tree leaf node * on disk, and return it in *size_ptr. On failure, * the value of *size_ptr is undefined. * @@ -1020,23 +1020,23 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5B2_cache_internal_size(const H5F_t UNUSED *f, const H5B2_internal_t *internal, size_t *size_ptr) +H5B2_cache_leaf_size(const H5F_t UNUSED *f, const H5B2_leaf_t *leaf, size_t *size_ptr) { H5B2_shared_t *shared; /* Shared B-tree information */ - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5B2_cache_internal_size) + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5B2_cache_leaf_size) /* check arguments */ - HDassert(internal); + HDassert(leaf); HDassert(size_ptr); /* Get the pointer to the shared B-tree info */ - shared = H5RC_GET_OBJ(internal->shared); + shared = H5RC_GET_OBJ(leaf->shared); HDassert(shared); /* Set size value */ *size_ptr = shared->node_size; FUNC_LEAVE_NOAPI(SUCCEED) -} /* H5B2_cache_internal_size() */ +} /* H5B2_cache_leaf_size() */ -- cgit v0.12