From e77303f48370403e04b4185aa54fb6417e1e52fa Mon Sep 17 00:00:00 2001
From: Quincey Koziol <koziol@hdfgroup.org>
Date: Thu, 18 Dec 2008 08:43:21 -0500
Subject: [svn-r16204] Description: 	Moved v1 B-tree debugging routines
 into separate module and thinned out header files a bit.

Tested on:
        Mac OS X/32 10.5.5 (amazon) in debug mode
        Mac OS X/32 10.5.5 (amazon) w/C++ & FORTRAN, w/threadsafe,
                                in production mode
        FreeBSD/32 6.3 (duty) in debug mode
        FreeBSD/64 6.3 (liberty) w/C++ & FORTRAN, in debug mode
        Linux/32 2.6 (jam) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
                                in debug mode
        Linux/64-amd64 2.6 (smirom) w/Intel compilers w/default API=1.6.x,
                                w/C++ & FORTRAN, in production mode
        Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
                                w/szip filter, in production mode
        Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
                                in production mode
        Linux/64-ia64 2.4 (tg-login3) w/parallel, w/FORTRAN, in production mode
---
 MANIFEST        |   1 +
 src/H5B.c       | 259 +--------------------------------------------------
 src/H5Bdbg.c    | 284 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/H5Bpkg.h    |   9 +-
 src/Makefile.am |   2 +-
 src/Makefile.in |   5 +-
 6 files changed, 302 insertions(+), 258 deletions(-)
 create mode 100644 src/H5Bdbg.c

diff --git a/MANIFEST b/MANIFEST
index 0a4807a..82a4f80 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -449,6 +449,7 @@
 ./src/H5ACpublic.h
 ./src/H5B.c
 ./src/H5Bcache.c
+./src/H5Bdbg.c
 ./src/H5Bpkg.h
 ./src/H5Bprivate.h
 ./src/H5Bpublic.h			
diff --git a/src/H5B.c b/src/H5B.c
index 618cda8..9d317c8 100644
--- a/src/H5B.c
+++ b/src/H5B.c
@@ -98,23 +98,20 @@
 /****************/
 
 #define H5B_PACKAGE		/*suppress error about including H5Bpkg	  */
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
 
 
 /***********/
 /* Headers */
 /***********/
 #include "H5private.h"		/* Generic Functions			*/
-#include "H5ACprivate.h"	/* Metadata cache			*/
 #include "H5Bpkg.h"		/* B-link trees				*/
 #include "H5Dprivate.h"		/* Datasets				*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
-#include "H5Fpkg.h"		/* File access				*/
 #include "H5Iprivate.h"		/* IDs			  		*/
 #include "H5MFprivate.h"	/* File memory management		*/
-#include "H5MMprivate.h"	/* Memory management			*/
 #include "H5Pprivate.h"         /* Property lists                       */
 
+
 /****************/
 /* Local Macros */
 /****************/
@@ -122,7 +119,7 @@
    (H5_SIZEOF_MAGIC +		/*magic number				  */  \
     4 +				/*type, level, num entries		  */  \
     2*H5F_SIZEOF_ADDR(F))	/*left and right sibling addresses	  */
-#define H5B_NKEY(b,shared,idx)  ((b)->native+(shared)->nkey[(idx)])
+
 
 /******************/
 /* Local Typedefs */
@@ -153,10 +150,7 @@ static herr_t H5B_split(H5F_t *f, hid_t dxpl_id, H5B_t *old_bt,
                         unsigned *old_bt_flags, haddr_t old_addr,
                         unsigned idx, void *udata, haddr_t *new_addr/*out*/);
 static H5B_t * H5B_copy(const H5B_t *old_bt);
-#ifdef H5B_DEBUG
-static herr_t H5B_assert(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type,
-			 void *udata);
-#endif
+
 
 /*********************/
 /* Package Variables */
@@ -171,10 +165,12 @@ H5FL_BLK_DEFINE(native_block);
 /* Declare a free list to manage the H5B_t struct */
 H5FL_DEFINE(H5B_t);
 
+
 /*****************************/
 /* Library Private Variables */
 /*****************************/
 
+
 /*******************/
 /* Local Variables */
 /*******************/
@@ -2061,248 +2057,3 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5B_get_info() */
 
-
-/*-------------------------------------------------------------------------
- * Function:	H5B_debug
- *
- * Purpose:	Prints debugging info about a B-tree.
- *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	Robb Matzke
- *		matzke@llnl.gov
- *		Aug  4 1997
- *
- * Modifications:
- *		Robb Matzke, 1999-07-28
- *		The ADDR argument is passed by value.
- *-------------------------------------------------------------------------
- */
-herr_t
-H5B_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int fwidth,
-	  const H5B_class_t *type, void *udata)
-{
-    H5B_t	*bt = NULL;
-    H5B_shared_t        *shared;        /* Pointer to shared B-tree info */
-    unsigned	u;                      /* Local index variable */
-    herr_t      ret_value=SUCCEED;       /* Return value */
-
-    FUNC_ENTER_NOAPI(H5B_debug, FAIL)
-
-    /*
-     * Check arguments.
-     */
-    assert(f);
-    assert(H5F_addr_defined(addr));
-    assert(stream);
-    assert(indent >= 0);
-    assert(fwidth >= 0);
-    assert(type);
-
-    /*
-     * Load the tree node.
-     */
-    if (NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, type, udata, H5AC_READ)))
-	HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, FAIL, "unable to load B-tree node")
-    shared=(H5B_shared_t *)H5RC_GET_OBJ(bt->rc_shared);
-    HDassert(shared);
-
-    /*
-     * Print the values.
-     */
-    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
-	      "Tree type ID:",
-	      ((shared->type->id)==H5B_SNODE_ID ? "H5B_SNODE_ID" :
-            ((shared->type->id)==H5B_CHUNK_ID ? "H5B_CHUNK_ID" : "Unknown!")));
-    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
-	      "Size of node:",
-	      shared->sizeof_rnode);
-    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
-	      "Size of raw (disk) key:",
-	      shared->sizeof_rkey);
-    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
-	      "Dirty flag:",
-	      bt->cache_info.is_dirty ? "True" : "False");
-    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
-	      "Level:",
-	      bt->level);
-
-    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
-	      "Address of left sibling:",
-	      bt->left);
-
-    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
-	      "Address of right sibling:",
-	      bt->right);
-
-    HDfprintf(stream, "%*s%-*s %u (%u)\n", indent, "", fwidth,
-	      "Number of children (max):",
-	      bt->nchildren, shared->two_k);
-
-    /*
-     * Print the child addresses
-     */
-    for (u = 0; u < bt->nchildren; u++) {
-	HDfprintf(stream, "%*sChild %d...\n", indent, "", u);
-	HDfprintf(stream, "%*s%-*s %a\n", indent + 3, "", MAX(0, fwidth - 3),
-		  "Address:", bt->child[u]);
-
-        /* If there is a key debugging routine, use it to display the left & right keys */
-	if (type->debug_key) {
-            /* Decode the 'left' key & print it */
-            HDfprintf(stream, "%*s%-*s\n", indent + 3, "", MAX(0, fwidth - 3),
-                      "Left Key:");
-            assert(H5B_NKEY(bt,shared,u));
-	    (void)(type->debug_key)(stream, f, dxpl_id, indent+6, MAX (0, fwidth-6),
-			      H5B_NKEY(bt,shared,u), udata);
-
-            /* Decode the 'right' key & print it */
-            HDfprintf(stream, "%*s%-*s\n", indent + 3, "", MAX(0, fwidth - 3),
-                      "Right Key:");
-            assert(H5B_NKEY(bt,shared,u+1));
-	    (void)(type->debug_key)(stream, f, dxpl_id, indent+6, MAX (0, fwidth-6),
-			      H5B_NKEY(bt,shared,u+1), udata);
-	}
-    }
-
-done:
-    if (bt && H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, bt, H5AC__NO_FLAGS_SET) < 0)
-        HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release B-tree node")
-
-    FUNC_LEAVE_NOAPI(ret_value)
-}
-
-
-/*-------------------------------------------------------------------------
- * Function:	H5B_assert
- *
- * Purpose:	Verifies that the tree is structured correctly.
- *
- * Return:	Success:	SUCCEED
- *
- *		Failure:	aborts if something is wrong.
- *
- * Programmer:	Robb Matzke
- *		Tuesday, November  4, 1997
- *
- * Modifications:
- *		Robb Matzke, 1999-07-28
- *		The ADDR argument is passed by value.
- *
- *              John Mainzer, 6/8/05
- *              Modified the function to use the new dirtied parameter of
- *              of H5AC_unprotect() instead of modifying the is_dirty
- *              field of the cache info.
- *
- *-------------------------------------------------------------------------
- */
-#ifdef H5B_DEBUG
-static herr_t
-H5B_assert(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type, void *udata)
-{
-    H5B_t	*bt = NULL;
-    H5B_shared_t        *shared;        /* Pointer to shared B-tree info */
-    int	i, ncell, cmp;
-    static int	ncalls = 0;
-    herr_t	status;
-    herr_t      ret_value=SUCCEED;       /* Return value */
-
-    /* A queue of child data */
-    struct child_t {
-	haddr_t			addr;
-	unsigned		level;
-	struct child_t	       *next;
-    } *head = NULL, *tail = NULL, *prev = NULL, *cur = NULL, *tmp = NULL;
-
-    FUNC_ENTER_NOAPI(H5B_assert, FAIL)
-
-    if (0==ncalls++) {
-	if (H5DEBUG(B)) {
-	    fprintf(H5DEBUG(B), "H5B: debugging B-trees (expensive)\n");
-	}
-    }
-    /* Initialize the queue */
-    bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, type, udata, H5AC_READ);
-    assert(bt);
-    shared=(H5B_shared_t *)H5RC_GET_OBJ(bt->rc_shared);
-    HDassert(shared);
-    cur = H5MM_calloc(sizeof(struct child_t));
-    assert (cur);
-    cur->addr = addr;
-    cur->level = bt->level;
-    head = tail = cur;
-
-    status = H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, bt, H5AC__NO_FLAGS_SET);
-    assert(status >= 0);
-    bt=NULL;    /* Make certain future references will be caught */
-
-    /*
-     * Do a breadth-first search of the tree.  New nodes are added to the end
-     * of the queue as the `cur' pointer is advanced toward the end.  We don't
-     * remove any nodes from the queue because we need them in the uniqueness
-     * test.
-     */
-    for (ncell = 0; cur; ncell++) {
-	bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, cur->addr, type, udata, H5AC_READ);
-	assert(bt);
-
-	/* Check node header */
-	assert(bt->level == cur->level);
-	if (cur->next && cur->next->level == bt->level) {
-	    assert(H5F_addr_eq(bt->right, cur->next->addr));
-	} else {
-	    assert(!H5F_addr_defined(bt->right));
-	}
-	if (prev && prev->level == bt->level) {
-	    assert(H5F_addr_eq(bt->left, prev->addr));
-	} else {
-	    assert(!H5F_addr_defined(bt->left));
-	}
-
-	if (cur->level > 0) {
-	    for (i = 0; i < bt->nchildren; i++) {
-
-		/*
-		 * Check that child nodes haven't already been seen.  If they
-		 * have then the tree has a cycle.
-		 */
-		for (tmp = head; tmp; tmp = tmp->next) {
-		    assert(H5F_addr_ne(tmp->addr, bt->child[i]));
-		}
-
-		/* Add the child node to the end of the queue */
-		tmp = H5MM_calloc(sizeof(struct child_t));
-		assert (tmp);
-		tmp->addr = bt->child[i];
-		tmp->level = bt->level - 1;
-		tail->next = tmp;
-		tail = tmp;
-
-		/* Check that the keys are monotonically increasing */
-		cmp = (type->cmp2) (f, dxpl_id, H5B_NKEY(bt,shared,i), udata,
-				    H5B_NKEY(bt,shared,i+1));
-		assert(cmp < 0);
-	    }
-	}
-	/* Release node */
-	status = H5AC_unprotect(f, dxpl_id, H5AC_BT, cur->addr, bt, H5AC__NO_FLAGS_SET);
-	assert(status >= 0);
-        bt=NULL;    /* Make certain future references will be caught */
-
-	/* Advance current location in queue */
-	prev = cur;
-	cur = cur->next;
-    }
-
-    /* Free all entries from queue */
-    while (head) {
-	tmp = head->next;
-	H5MM_xfree(head);
-	head = tmp;
-    }
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-}
-#endif /* H5B_DEBUG */
-
diff --git a/src/H5Bdbg.c b/src/H5Bdbg.c
new file mode 100644
index 0000000..f517daf
--- /dev/null
+++ b/src/H5Bdbg.c
@@ -0,0 +1,284 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help@hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Bdbg.c
+ *			Dec 11 2008
+ *			Quincey Koziol <koziol@hdfgroup.org>
+ *
+ * Purpose:		Debugging routines for B-link tree package.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5B_PACKAGE		/*suppress error about including H5Bpkg	  */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Bpkg.h"		/* B-link trees				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+
+
+/*-------------------------------------------------------------------------
+ * Function:	H5B_debug
+ *
+ * Purpose:	Prints debugging info about a B-tree.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		matzke@llnl.gov
+ *		Aug  4 1997
+ *
+ * Modifications:
+ *		Robb Matzke, 1999-07-28
+ *		The ADDR argument is passed by value.
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int fwidth,
+	  const H5B_class_t *type, void *udata)
+{
+    H5B_t	*bt = NULL;
+    H5B_shared_t        *shared;        /* Pointer to shared B-tree info */
+    unsigned	u;                      /* Local index variable */
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(H5B_debug, FAIL)
+
+    /*
+     * Check arguments.
+     */
+    assert(f);
+    assert(H5F_addr_defined(addr));
+    assert(stream);
+    assert(indent >= 0);
+    assert(fwidth >= 0);
+    assert(type);
+
+    /*
+     * Load the tree node.
+     */
+    if (NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, type, udata, H5AC_READ)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, FAIL, "unable to load B-tree node")
+    shared=(H5B_shared_t *)H5RC_GET_OBJ(bt->rc_shared);
+    HDassert(shared);
+
+    /*
+     * Print the values.
+     */
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "Tree type ID:",
+	      ((shared->type->id)==H5B_SNODE_ID ? "H5B_SNODE_ID" :
+            ((shared->type->id)==H5B_CHUNK_ID ? "H5B_CHUNK_ID" : "Unknown!")));
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Size of node:",
+	      shared->sizeof_rnode);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Size of raw (disk) key:",
+	      shared->sizeof_rkey);
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "Dirty flag:",
+	      bt->cache_info.is_dirty ? "True" : "False");
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Level:",
+	      bt->level);
+
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "Address of left sibling:",
+	      bt->left);
+
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "Address of right sibling:",
+	      bt->right);
+
+    HDfprintf(stream, "%*s%-*s %u (%u)\n", indent, "", fwidth,
+	      "Number of children (max):",
+	      bt->nchildren, shared->two_k);
+
+    /*
+     * Print the child addresses
+     */
+    for (u = 0; u < bt->nchildren; u++) {
+	HDfprintf(stream, "%*sChild %d...\n", indent, "", u);
+	HDfprintf(stream, "%*s%-*s %a\n", indent + 3, "", MAX(0, fwidth - 3),
+		  "Address:", bt->child[u]);
+
+        /* If there is a key debugging routine, use it to display the left & right keys */
+	if (type->debug_key) {
+            /* Decode the 'left' key & print it */
+            HDfprintf(stream, "%*s%-*s\n", indent + 3, "", MAX(0, fwidth - 3),
+                      "Left Key:");
+            assert(H5B_NKEY(bt,shared,u));
+	    (void)(type->debug_key)(stream, f, dxpl_id, indent+6, MAX (0, fwidth-6),
+			      H5B_NKEY(bt,shared,u), udata);
+
+            /* Decode the 'right' key & print it */
+            HDfprintf(stream, "%*s%-*s\n", indent + 3, "", MAX(0, fwidth - 3),
+                      "Right Key:");
+            assert(H5B_NKEY(bt,shared,u+1));
+	    (void)(type->debug_key)(stream, f, dxpl_id, indent+6, MAX (0, fwidth-6),
+			      H5B_NKEY(bt,shared,u+1), udata);
+	}
+    }
+
+done:
+    if (bt && H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, bt, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release B-tree node")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function:	H5B_assert
+ *
+ * Purpose:	Verifies that the tree is structured correctly.
+ *
+ * Return:	Success:	SUCCEED
+ *
+ *		Failure:	aborts if something is wrong.
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, November  4, 1997
+ *
+ * Modifications:
+ *		Robb Matzke, 1999-07-28
+ *		The ADDR argument is passed by value.
+ *
+ *              John Mainzer, 6/8/05
+ *              Modified the function to use the new dirtied parameter of
+ *              of H5AC_unprotect() instead of modifying the is_dirty
+ *              field of the cache info.
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5B_DEBUG
+herr_t
+H5B_assert(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type, void *udata)
+{
+    H5B_t	*bt = NULL;
+    H5B_shared_t        *shared;        /* Pointer to shared B-tree info */
+    int	i, ncell, cmp;
+    static int	ncalls = 0;
+    herr_t	status;
+    herr_t      ret_value=SUCCEED;       /* Return value */
+
+    /* A queue of child data */
+    struct child_t {
+	haddr_t			addr;
+	unsigned		level;
+	struct child_t	       *next;
+    } *head = NULL, *tail = NULL, *prev = NULL, *cur = NULL, *tmp = NULL;
+
+    FUNC_ENTER_NOAPI(H5B_assert, FAIL)
+
+    if (0==ncalls++) {
+	if (H5DEBUG(B)) {
+	    fprintf(H5DEBUG(B), "H5B: debugging B-trees (expensive)\n");
+	}
+    }
+    /* Initialize the queue */
+    bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, type, udata, H5AC_READ);
+    assert(bt);
+    shared=(H5B_shared_t *)H5RC_GET_OBJ(bt->rc_shared);
+    HDassert(shared);
+    cur = H5MM_calloc(sizeof(struct child_t));
+    assert (cur);
+    cur->addr = addr;
+    cur->level = bt->level;
+    head = tail = cur;
+
+    status = H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, bt, H5AC__NO_FLAGS_SET);
+    assert(status >= 0);
+    bt=NULL;    /* Make certain future references will be caught */
+
+    /*
+     * Do a breadth-first search of the tree.  New nodes are added to the end
+     * of the queue as the `cur' pointer is advanced toward the end.  We don't
+     * remove any nodes from the queue because we need them in the uniqueness
+     * test.
+     */
+    for (ncell = 0; cur; ncell++) {
+	bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, cur->addr, type, udata, H5AC_READ);
+	assert(bt);
+
+	/* Check node header */
+	assert(bt->level == cur->level);
+	if (cur->next && cur->next->level == bt->level) {
+	    assert(H5F_addr_eq(bt->right, cur->next->addr));
+	} else {
+	    assert(!H5F_addr_defined(bt->right));
+	}
+	if (prev && prev->level == bt->level) {
+	    assert(H5F_addr_eq(bt->left, prev->addr));
+	} else {
+	    assert(!H5F_addr_defined(bt->left));
+	}
+
+	if (cur->level > 0) {
+	    for (i = 0; i < bt->nchildren; i++) {
+
+		/*
+		 * Check that child nodes haven't already been seen.  If they
+		 * have then the tree has a cycle.
+		 */
+		for (tmp = head; tmp; tmp = tmp->next) {
+		    assert(H5F_addr_ne(tmp->addr, bt->child[i]));
+		}
+
+		/* Add the child node to the end of the queue */
+		tmp = H5MM_calloc(sizeof(struct child_t));
+		assert (tmp);
+		tmp->addr = bt->child[i];
+		tmp->level = bt->level - 1;
+		tail->next = tmp;
+		tail = tmp;
+
+		/* Check that the keys are monotonically increasing */
+		cmp = (type->cmp2) (f, dxpl_id, H5B_NKEY(bt,shared,i), udata,
+				    H5B_NKEY(bt,shared,i+1));
+		assert(cmp < 0);
+	    }
+	}
+	/* Release node */
+	status = H5AC_unprotect(f, dxpl_id, H5AC_BT, cur->addr, bt, H5AC__NO_FLAGS_SET);
+	assert(status >= 0);
+        bt=NULL;    /* Make certain future references will be caught */
+
+	/* Advance current location in queue */
+	prev = cur;
+	cur = cur->next;
+    }
+
+    /* Free all entries from queue */
+    while (head) {
+	tmp = head->next;
+	H5MM_xfree(head);
+	head = tmp;
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}
+#endif /* H5B_DEBUG */
+
diff --git a/src/H5Bpkg.h b/src/H5Bpkg.h
index 7f1fd37..ddabf52 100644
--- a/src/H5Bpkg.h
+++ b/src/H5Bpkg.h
@@ -32,12 +32,15 @@
 #include "H5Bprivate.h"
 
 /* Other private headers needed by this file */
-#include "H5RCprivate.h"	/* Reference counted objects            */
 
 /**************************/
 /* Package Private Macros */
 /**************************/
 
+/* Get the native key at a given index */
+#define H5B_NKEY(b, shared, idx)  ((b)->native + (shared)->nkey[(idx)])
+
+
 /****************************/
 /* Package Private Typedefs */
 /****************************/
@@ -75,6 +78,10 @@ H5FL_EXTERN(H5B_t);
 /* Package Private Prototypes */
 /******************************/
 H5_DLL herr_t H5B_dest(H5F_t *f, H5B_t *b);
+#ifdef H5B_DEBUG
+herr_t H5B_assert(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type,
+			 void *udata);
+#endif
 
 #endif /*_H5Bpkg_H*/
 
diff --git a/src/Makefile.am b/src/Makefile.am
index 5eeaee7..9ae2252 100755
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -43,7 +43,7 @@ DISTCLEANFILES=H5pubconf.h
 # library sources
 libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
         H5A.c H5Abtree2.c H5Adense.c H5Adeprec.c H5Aint.c H5Atest.c \
-        H5AC.c H5B.c H5Bcache.c \
+        H5AC.c H5B.c H5Bcache.c H5Bdbg.c \
         H5B2.c H5B2cache.c H5B2dbg.c H5B2int.c H5B2stat.c H5B2test.c \
         H5C.c H5CS.c \
         H5D.c H5Dbtree.c H5Dchunk.c H5Dcompact.c H5Dcontig.c H5Ddbg.c \
diff --git a/src/Makefile.in b/src/Makefile.in
index 4bc37d4..4fde49e 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -80,7 +80,7 @@ LTLIBRARIES = $(lib_LTLIBRARIES)
 libhdf5_la_LIBADD =
 am_libhdf5_la_OBJECTS = H5.lo H5checksum.lo H5dbg.lo H5system.lo \
 	H5timer.lo H5trace.lo H5A.lo H5Abtree2.lo H5Adense.lo \
-	H5Adeprec.lo H5Aint.lo H5Atest.lo H5AC.lo H5B.lo H5Bcache.lo \
+	H5Adeprec.lo H5Aint.lo H5Atest.lo H5AC.lo H5B.lo H5Bcache.lo H5Bdbg.lo \
 	H5B2.lo H5B2cache.lo H5B2dbg.lo H5B2int.lo H5B2stat.lo \
 	H5B2test.lo H5C.lo H5CS.lo H5D.lo H5Dchunk.lo H5Dcompact.lo \
 	H5Dcontig.lo H5Ddbg.lo H5Ddeprec.lo H5Defl.lo H5Dfill.lo \
@@ -426,7 +426,7 @@ DISTCLEANFILES = H5pubconf.h
 # library sources
 libhdf5_la_SOURCES = H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
         H5A.c H5Abtree2.c H5Adense.c H5Adeprec.c H5Aint.c H5Atest.c \
-        H5AC.c H5B.c H5Bcache.c \
+        H5AC.c H5B.c H5Bcache.c H5Bdbg.c \
         H5B2.c H5B2cache.c H5B2dbg.c H5B2int.c H5B2stat.c H5B2test.c \
         H5C.c H5CS.c \
         H5D.c H5Dchunk.c H5Dcompact.c H5Dcontig.c H5Ddbg.c \
@@ -631,6 +631,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5B2stat.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5B2test.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Bcache.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Bdbg.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5C.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5CS.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5D.Plo@am__quote@
-- 
cgit v0.12