summaryrefslogtreecommitdiffstats
path: root/src/H5BTbtree2.c
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2005-03-11 00:44:03 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2005-03-11 00:44:03 (GMT)
commit5b7ebc2ff95e1dea0bd9517e360b7af98dbd0a4d (patch)
tree14e1c52be4efa2294208450fb6fe778cafddf6cd /src/H5BTbtree2.c
parent134d7ed4f0de170ab361a6a88622cead5a49dd84 (diff)
downloadhdf5-5b7ebc2ff95e1dea0bd9517e360b7af98dbd0a4d.zip
hdf5-5b7ebc2ff95e1dea0bd9517e360b7af98dbd0a4d.tar.gz
hdf5-5b7ebc2ff95e1dea0bd9517e360b7af98dbd0a4d.tar.bz2
[svn-r10184] Purpose:
New feature Description: Add new "block tracker" data structure to library, for tracking blocks of bytes in a file. Block trackers will be used to keep track of the blocks belonging to the soon-to-be-implemented "segmented heap" which is designed to replace the current local & global heaps (starting with the local heap). Block trackers will also keep track of the free space in the segmented heap and someday could be used to track the free space in the entire HDF5 file. They are implemented as a small header of information to cache the state of the blocks (max & min sizes of blocks tracked, etc.) and the records of the blocks themselves are stored in a v2 B-tree. Platforms tested: FreeBSD 4.11 (sleipnir) Solaris 2.9 (shanti) h5committest
Diffstat (limited to 'src/H5BTbtree2.c')
-rw-r--r--src/H5BTbtree2.c218
1 files changed, 218 insertions, 0 deletions
diff --git a/src/H5BTbtree2.c b/src/H5BTbtree2.c
new file mode 100644
index 0000000..4c37004
--- /dev/null
+++ b/src/H5BTbtree2.c
@@ -0,0 +1,218 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have *
+ * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer: Quincey Koziol <koziol@ncsa.uiuc.edu>
+ * Thursday, March 10, 2005
+ *
+ * Purpose: v2 B-tree callback routines for block info records
+ */
+
+#define H5BT_PACKAGE /*suppress error about including H5BTpkg */
+
+/* Private headers */
+#include "H5private.h" /* Generic Functions */
+#include "H5BTpkg.h" /* Block tracker */
+#include "H5Eprivate.h" /* Error handling */
+
+/* Static Prototypes */
+static herr_t H5BT_store(void *nrecord, const void *udata);
+static herr_t H5BT_retrieve(void *udata, const void *nrecord);
+static herr_t H5BT_compare(const void *rec1, const void *rec2);
+static herr_t H5BT_encode(const H5F_t *f, uint8_t *raw,
+ const void *nrecord);
+static herr_t H5BT_decode(const H5F_t *f, const uint8_t *raw,
+ void *nrecord);
+static herr_t H5BT_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
+ int indent, int fwidth, const void *record, const void *_udata);
+
+/* Package variables */
+const H5B2_class_t H5B2_BLKTRK[1]={{ /* B-tree class information */
+ H5B2_BLK_TRK_ID, /* Type of B-tree */
+ sizeof(hsize_t), /* Size of native key */
+ H5BT_store, /* Record storage callback */
+ H5BT_retrieve, /* Record retrieval callback */
+ H5BT_compare, /* Record comparison callback */
+ H5BT_encode, /* Record encoding callback */
+ H5BT_decode, /* Record decoding callback */
+ H5BT_debug /* Record debugging callback */
+}};
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5BT_store
+ *
+ * Purpose: Store native information into record for B-tree
+ *
+ * Return: Success: non-negative
+ *
+ * Failure: negative
+ *
+ * Programmer: Quincey Koziol
+ * Thursday, March 10, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5BT_store(void *nrecord, const void *udata)
+{
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5BT_store)
+
+ *(H5BT_blk_info_t *)nrecord=*(const H5BT_blk_info_t *)udata;
+
+ FUNC_LEAVE_NOAPI(SUCCEED);
+} /* H5BT_store() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5BT_retrieve
+ *
+ * Purpose: Retrieve native information from record for B-tree
+ *
+ * Return: Success: non-negative
+ *
+ * Failure: negative
+ *
+ * Programmer: Quincey Koziol
+ * Thursday, March 10, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5BT_retrieve(void *udata, const void *nrecord)
+{
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5BT_retrieve)
+
+ *(H5BT_blk_info_t *)udata=*(const H5BT_blk_info_t *)nrecord;
+
+ FUNC_LEAVE_NOAPI(SUCCEED);
+} /* H5BT_retrieve() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5BT_compare
+ *
+ * Purpose: Compare two native information records, according to some key
+ *
+ * Return: <0 if rec1 < rec2
+ * =0 if rec1 == rec2
+ * >0 if rec1 > rec2
+ *
+ * Programmer: Quincey Koziol
+ * Thursday, March 10, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5BT_compare(const void *rec1, const void *rec2)
+{
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5BT_compare)
+
+ FUNC_LEAVE_NOAPI(H5F_addr_cmp(((const H5BT_blk_info_t *)rec1)->addr,((const H5BT_blk_info_t *)rec2)->addr));
+} /* H5BT_compare() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5BT_encode
+ *
+ * Purpose: Encode native information into raw form for storing on disk
+ *
+ * Return: Success: non-negative
+ *
+ * Failure: negative
+ *
+ * Programmer: Quincey Koziol
+ * Thursday, March 10, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5BT_encode(const H5F_t *f, uint8_t *raw, const void *nrecord)
+{
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5BT_encode)
+
+ H5F_addr_encode(f, &raw, ((const H5BT_blk_info_t *)nrecord)->addr);
+ H5F_ENCODE_LENGTH(f, raw, ((const H5BT_blk_info_t *)nrecord)->len);
+
+ FUNC_LEAVE_NOAPI(SUCCEED);
+} /* H5BT_encode() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5BT_decode
+ *
+ * Purpose: Decode raw disk form of record into native form
+ *
+ * Return: Success: non-negative
+ *
+ * Failure: negative
+ *
+ * Programmer: Quincey Koziol
+ * Thursday, March 10, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5BT_decode(const H5F_t *f, const uint8_t *raw, void *nrecord)
+{
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5BT_decode)
+
+ H5F_addr_decode(f, &raw, &(((H5BT_blk_info_t *)nrecord)->addr));
+ H5F_DECODE_LENGTH(f, raw, ((H5BT_blk_info_t *)nrecord)->len);
+
+ FUNC_LEAVE_NOAPI(SUCCEED);
+} /* H5BT_decode() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5BT_debug
+ *
+ * Purpose: Debug native form of record
+ *
+ * Return: Success: non-negative
+ *
+ * Failure: negative
+ *
+ * Programmer: Quincey Koziol
+ * Thursday, March 10, 2005
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5BT_debug(FILE *stream, const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, int indent, int fwidth,
+ const void *record, const void UNUSED *_udata)
+{
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5BT_debug)
+
+ HDassert (record);
+
+ HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth, "Block Address:",
+ ((const H5BT_blk_info_t *)record)->addr);
+ HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth, "Block Length:",
+ ((const H5BT_blk_info_t *)record)->len);
+
+ FUNC_LEAVE_NOAPI(SUCCEED);
+} /* H5BT_debug() */
+