summaryrefslogtreecommitdiffstats
path: root/src/H5SMbtree2.c
diff options
context:
space:
mode:
authorJames Laird <jlaird@hdfgroup.org>2006-11-13 20:41:36 (GMT)
committerJames Laird <jlaird@hdfgroup.org>2006-11-13 20:41:36 (GMT)
commitb6c317f27cd150aa7bfc4e9cf275629570c9a319 (patch)
tree3413a54aec3bbebb821088a473f6ff425c3d39be /src/H5SMbtree2.c
parent77c265f26746359cf348437702c93c162f7022f6 (diff)
downloadhdf5-b6c317f27cd150aa7bfc4e9cf275629570c9a319.zip
hdf5-b6c317f27cd150aa7bfc4e9cf275629570c9a319.tar.gz
hdf5-b6c317f27cd150aa7bfc4e9cf275629570c9a319.tar.bz2
[svn-r12902] Checkin of Shared Object Header Message work.
This feature is still in progress; Shared Object Header Messages are not complete as a feature and are not thoroughly tested. There are still "TODO" comments in the code (comments with the word "JAMES" in them, so as not to be confused with other TODO comments). Hopefully this checkin will reduce the liklihood of conflicts as I finish implementing this feature. All current tests pass on juniper, copper (parallel), heping, kagiso, and mir.
Diffstat (limited to 'src/H5SMbtree2.c')
-rwxr-xr-xsrc/H5SMbtree2.c351
1 files changed, 351 insertions, 0 deletions
diff --git a/src/H5SMbtree2.c b/src/H5SMbtree2.c
new file mode 100755
index 0000000..7e98b06
--- /dev/null
+++ b/src/H5SMbtree2.c
@@ -0,0 +1,351 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#define H5SM_PACKAGE /*suppress error about including H5SMpkg */
+#define H5F_PACKAGE /*suppress error about including H5Fpkg */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h" /* Generic Functions */
+#include "H5ACprivate.h" /* Metadata cache */
+#include "H5Eprivate.h" /* Error handling */
+#include "H5FLprivate.h" /* Free Lists */
+#include "H5MMprivate.h" /* Memory management */
+#include "H5Fpkg.h" /* File access */
+#include "H5SMpkg.h" /* Shared object header messages */
+
+#include "H5B2private.h" /* v2 B-trees */
+/****************/
+/* Local Macros */
+/****************/
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static herr_t H5SM_message_store(void *native, const void *udata);
+static herr_t H5SM_message_retrieve(void *udata, const void *native);
+static herr_t H5SM_message_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
+ int indent, int fwidth, const void *record, const void *_udata);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+/* v2 B-tree class for SOHM indexes*/
+const H5B2_class_t H5SM_INDEX[1]={{ /* B-tree class information */
+ H5B2_SOHM_INDEX_ID, /* Type of B-tree */
+ sizeof(H5SM_sohm_t), /* Size of native record */
+ H5SM_message_store, /* Record storage callback */
+ H5SM_message_retrieve, /* Record retrieval callback */
+ H5SM_message_compare, /* Record comparison callback */
+ H5SM_message_encode, /* Record encoding callback */
+ H5SM_message_decode, /* Record decoding callback */
+ H5SM_message_debug /* Record debugging callback */
+}};
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5SM_message_compare
+ *
+ * Purpose: Determine whether the search key rec1 represents a shared
+ * message that is equal to rec2 or not, and if not, whether
+ * rec1 is "greater than" or "less than" rec2.
+ *
+ * Return: 0 if rec1 == rec2
+ * Negative if rec1 < rec2
+ * Positive if rec1 > rec2
+ *
+ * Programmer: James Laird
+ * Monday, November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_message_compare(const H5SM_mesg_key_t *rec1, const H5SM_sohm_t *rec2)
+{
+ herr_t hash_diff;
+ herr_t ret_value=0;
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5SM_message_compare)
+
+ hash_diff = (herr_t) (rec1->hash - rec2->hash);
+
+ /* If the hash values match, make sure the messages are really the same */
+ if(0 == hash_diff) {
+ /* Compare either the heap_ids directly (if the key has one)
+ * or the encoded buffers
+ */
+ /* JAMES: not a great test. Use a flag instead? */
+ if(rec1->encoding_size == 0)
+ {
+ ret_value = (herr_t) (rec1->mesg_heap_id - rec2->fheap_id);
+ }
+ else
+ {
+ unsigned char buf2[H5O_MESG_MAX_SIZE];
+ herr_t ret;
+
+ /* We need to see if this message is in fact the message stored
+ * in the heap. Read it from the heap and compare the two.
+ */
+ HDmemset(buf2, 0, H5O_MESG_MAX_SIZE);
+
+ ret = H5HF_read(rec1->fheap, H5AC_dxpl_id, &(rec2->fheap_id), &buf2);
+ HDassert(ret >= 0);
+
+ /* JAMES: I think I want to use in-heap callback here. */
+ ret_value = HDmemcmp(rec1->encoding, buf2, rec1->encoding_size);
+ }
+ }
+ else
+ ret_value = hash_diff;
+
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM_message_compare */
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5SM_message_store
+ *
+ * Purpose: Store a H5SM_sohm_t SOHM message in the B-tree by copying it
+ * from UDATA to NATIVE.
+ *
+ * Return: Non-negative on success
+ * Negative on failure
+ *
+ * Programmer: James Laird
+ * Monday, November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_message_store(void *native, const void *udata)
+{
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5SM_message_store)
+
+ /* Copy the source message to the B-tree */
+ *(H5SM_sohm_t *)native = *(const H5SM_sohm_t *)udata;
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_message_store */
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5SM_message_retrieve
+ *
+ * Purpose: Retrieve a H5SM_sohm_t SOHM message from the B-tree by
+ * copying it from NATIVE to UDATA.
+ *
+ * Quincey said this function may no longer be used.
+ *
+ * Return: Non-negative on success
+ * Negative on failure
+ *
+ * Programmer: James Laird
+ * Monday, November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_message_retrieve(void *udata, const void *native)
+{
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5SM_message_retrieve)
+
+ /* Copy the B-tree's native message to the udata buffer */
+ *(H5SM_sohm_t *)udata = *(const H5SM_sohm_t *)native;
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_message_retrieve */
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5SM_message_encode
+ *
+ * Purpose: Serialize the SOHM message.
+ *
+ * Return: Non-negative on success
+ * Negative on failure
+ *
+ * Programmer: James Laird
+ * Monday, November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_message_encode(const H5F_t *f, uint8_t *raw, const void *_nrecord)
+{
+ H5SM_sohm_t *message = (H5SM_sohm_t *)_nrecord;
+
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5SM_message_encode)
+
+ /* Encode the SOHM's fields */
+ UINT32ENCODE(raw, message->hash);
+ UINT16ENCODE(raw, message->ref_count);
+ UINT64ENCODE(raw, message->fheap_id);
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_message_encode */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5SM_message_decode
+ *
+ * Purpose: Read an encoded SOHM message into an H5SM_sohm_t struct.
+ *
+ * Return: Non-negative on success
+ * Negative on failure
+ *
+ * Programmer: James Laird
+ * Monday, November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_message_decode(const H5F_t *f, const uint8_t *raw, void *_nrecord)
+{
+ H5SM_sohm_t *message = (H5SM_sohm_t *)_nrecord;
+
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5SM_message_decode)
+
+ /* Encode the SOHM's fields */
+ UINT32DECODE(raw, message->hash);
+ UINT16DECODE(raw, message->ref_count);
+ UINT64DECODE(raw, message->fheap_id);
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_message_decode */
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5SM_message_debug
+ *
+ * Purpose: Print debugging information for a H5SM_sohm_t.
+ *
+ * Return: Non-negative on success
+ * Negative on failure
+ *
+ * Programmer: James Laird
+ * Monday, November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM_message_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
+ int indent, int fwidth, const void *record, const void *_udata)
+{
+ const H5SM_sohm_t *sohm = (const H5SM_sohm_t *)record;
+
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5SM_message_debug)
+
+ HDfprintf(stream, "%*s%-*s {%a, %lo, %Hu}\n", indent, "", fwidth, "Record:",
+ sohm->fheap_id, sohm->hash, sohm->ref_count);
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM_message_debug */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5SM_incr_ref
+ *
+ * Purpose: Increment the reference count for a SOHM message and return
+ * the message's heap ID.
+ *
+ * The message pointer is actually returned via op_data, which
+ * should be a pointer to a H5SM_fheap_id_t.
+ *
+ * Return: Non-negative on success
+ * Negative on failure
+ *
+ * Programmer: James Laird
+ * Monday, November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_incr_ref(void *record, void *op_data, hbool_t *changed)
+{
+ H5SM_sohm_t *message = (H5SM_sohm_t *) record;
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5SM_incr_ref)
+
+ HDassert(record);
+ HDassert(op_data);
+ HDassert(changed);
+
+ ++message->ref_count;
+ *changed = TRUE;
+
+ if(op_data)
+ *(H5SM_fheap_id_t *)op_data = message->fheap_id;
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5SM_decr_ref
+ *
+ * Purpose: Decrement the reference count for a SOHM message. Doesn't
+ * remove the record from the B-tree even if the refcount
+ * reaches zero.
+ *
+ * The new refcount is returned through op_data. If this is
+ * zero, the calling function should remove this record from
+ * the B-tree.
+ *
+ * Return: Non-negative on success
+ * Negative on failure
+ *
+ * Programmer: James Laird
+ * Monday, November 6, 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5SM_decr_ref(void *record, void *op_data, hbool_t *changed)
+{
+ H5SM_sohm_t *message = (H5SM_sohm_t *) record;
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5SM_decr_ref)
+
+ HDassert(record);
+ HDassert(op_data);
+ HDassert(changed);
+
+ --message->ref_count;
+ *changed = TRUE;
+
+ if(op_data)
+ *(hsize_t *)op_data = message->ref_count;
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+