summaryrefslogtreecommitdiffstats
path: root/src/H5SMpkg.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5SMpkg.h')
-rwxr-xr-xsrc/H5SMpkg.h174
1 files changed, 174 insertions, 0 deletions
diff --git a/src/H5SMpkg.h b/src/H5SMpkg.h
new file mode 100755
index 0000000..9016884
--- /dev/null
+++ b/src/H5SMpkg.h
@@ -0,0 +1,174 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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: James Laird <jlaird@ncsa.uiuc.edu>
+ * Thursday, March 30, 2006
+ *
+ * Purpose: This file contains declarations which are visible only within
+ * the H5SM shared object header messages package. Source files
+ * outside the H5SM package should include H5SMprivate.h instead.
+ */
+#ifndef _H5SMpkg_H
+#define _H5SMpkg_H
+
+#include "H5SMprivate.h"
+#include "H5B2private.h" /* B-trees */
+#include "H5HFprivate.h" /* Fractal heaps */
+
+
+/****************************/
+/* Package Macros */
+/****************************/
+#define H5SM_LIST_MAGIC "SMLI"
+#define H5SM_LIST_SIZEOF_MAGIC 4
+#define H5SM_TABLE_MAGIC "SMTB"
+#define H5SM_TABLE_SIZEOF_MAGIC 4
+
+#define H5SM_SOHM_ENTRY_SIZE(f) (4 /* Hash value */ \
+ + 2 /* reference count*/ \
+ + 8) /* JAMES: size of hash value on disk */
+
+#define H5SM_TABLE_SIZE(f) ( H5SM_TABLE_SIZEOF_MAGIC \
+ + 1 /* Table version */ \
+ + 1) /* Number of indexes */
+
+#define H5SM_INDEX_HEADER_SIZE(f) (1 /* Whether index is a list or B-tree */ \
+ + 2 /* Type of messages stored in the index */ \
+ + (3 * 2) /* B-tree cutoff, list cutoff, # of shared messages */ \
+ + H5F_SIZEOF_ADDR(f) /* Location of list or B-tree */ \
+ + H5F_SIZEOF_ADDR(f)) /* Address of heap */
+
+#define H5SM_LIST_SIZE(f, num_mesg) H5SM_LIST_SIZEOF_MAGIC \
+ + (H5SM_SOHM_ENTRY_SIZE(f) * num_mesg)
+
+#define H5SM_MAX_INDEXES 8
+#define H5SM_MAX_LIST_ELEMS 1000
+
+/****************************/
+/* Package Typedefs */
+/****************************/
+
+/* There are a number of Shared Object Header Message-specific structs here.
+ *
+ * The H5SM_master_table_t is pointed to by the file superblock. Since a file
+ * can have more than one SOHM index, this table collects all the indexes into
+ * one place. It holds an array of H5SM_index_header_t structs.
+ *
+ * An H5SM_index_header_t is actually the for a given index. It holds
+ * the number of messages in the index, the types of messages in the index,
+ * etc. It also records whether the index is a list or a b-tree, and has
+ * the address of the list or b-tree.
+ *
+ * If the index is a list, the address in the index header should be given
+ * to the cache, which can load it into a H5SM_list_t struct. This is mostly
+ * just a header for the cache information; it contains a pointer back to
+ * the index header and an unsorted array of messages.
+ *
+ * These messages are H5SM_sohm_t structs. They hold the actual SOHM's
+ * address, hash value, and refcount.
+ *
+ * If the index is a b-tree, the H5SM_index_header_t struct holds the address
+ * of the b-tree instead of the address of a H5SM_list_t. The B-tree's nodes
+ * are still 'H5SM_sohm_t's.
+ *
+ * H5SM_mesg_key_t structs are used to search lists and B-trees for a certain
+ * message. They correspond to a message that hasn't yet been written to
+ * disk.
+ */
+
+/* Declare free lists to manage H5SM structs */
+H5FL_ARR_EXTERN(H5SM_index_header_t);
+H5FL_EXTERN(H5SM_list_t);
+H5FL_ARR_EXTERN(H5SM_sohm_t);
+
+typedef enum {
+ H5SM_BADTYPE = -1,
+ H5SM_LIST, /* Index is an unsorted list */
+ H5SM_BTREE /* Index is a sorted B-tree */
+} H5SM_index_type_t;
+
+/* Typedef for searching an index (list or B-tree) */
+typedef struct {
+ uint32_t hash; /* The hash value for this message */
+ const void *encoding; /* The message encoded */
+ hsize_t encoding_size; /* Size of the encoding */
+ H5HF_t *fheap; /* The heap for this message type, open. */
+ H5SM_fheap_id_t mesg_heap_id; /* The heap_id for this message */
+} H5SM_mesg_key_t;
+
+/* Typedef for a SOHM index header */
+typedef struct {
+ unsigned mesg_types; /* Bit flag vector of message types */
+ size_t list_to_btree; /* >= this many messages, index with a B-tree */
+ size_t btree_to_list; /* <= this many messages, index with a list again */
+ size_t num_messages; /* number of messages being tracked */
+ H5SM_index_type_t index_type; /* Is the index a list or a B-tree? */
+ haddr_t index_addr; /* Address of the actual index (list or B-tree) */
+ haddr_t heap_addr; /* Address of the fheap used to store shared messages */
+} H5SM_index_header_t;
+
+/* Typedef for a SOHM list */
+typedef struct {
+ /* Information for H5AC cache functions, _must_ be first field in structure */
+ H5AC_info_t cache_info;
+
+ H5SM_index_header_t *header; /* Pointer to the corresponding index header */
+ H5SM_sohm_t *messages; /* Actual list, stored as an array */
+} H5SM_list_t;
+
+
+/* Typedef for shared object header message master table */
+typedef struct {
+ /* Information for H5AC cache functions, _must_ be first field in structure */
+ H5AC_info_t cache_info;
+
+ uint8_t num_indexes; /* Number of indexes */
+ H5SM_index_header_t *indexes; /* Array of num_indexes indexes */
+} H5SM_master_table_t;
+
+
+#define H5SM_B2_NODE_SIZE 512
+#define H5SM_B2_SPLIT_PERCENT 100
+#define H5SM_B2_MERGE_PERCENT 40
+
+/****************************/
+/* Package Variables */
+/****************************/
+H5_DLLVAR const H5AC_class_t H5AC_SOHM_TABLE[1];
+H5_DLLVAR const H5AC_class_t H5AC_SOHM_LIST[1];
+
+H5_DLLVAR const H5B2_class_t H5SM_INDEX[1];
+
+/****************************/
+/* Package Prototypes */
+/****************************/
+/* Encode and decode routines, used for B-tree and cache encoding/decoding */
+H5_DLL herr_t H5SM_message_encode(const H5F_t *f, uint8_t *raw,
+ const void *native);
+H5_DLL herr_t H5SM_message_decode(const H5F_t *f, const uint8_t *raw,
+ void *native);
+
+/* Callbacks to give to B-tree traversals */
+/* H5SM_message_compare is in H5SMbtree2.c, but is also used by list code
+ * in H5SM.c.
+ */
+H5_DLL herr_t H5SM_message_compare(const H5SM_mesg_key_t *rec1,
+ const H5SM_sohm_t *rec2);
+
+/* H5B2_modify_t callbacks to adjust record's refcount. */
+H5_DLL herr_t H5SM_incr_ref(void *record, void *op_data, hbool_t *changed);
+H5_DLL herr_t H5SM_decr_ref(void *record, void *op_data, hbool_t *changed);
+#endif /*_H5SMpkg_H*/
+