summaryrefslogtreecommitdiffstats
path: root/src/H5SMpkg.h
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2007-05-14 20:24:08 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2007-05-14 20:24:08 (GMT)
commit31ff357f3190a869147378a9a136510be2caafd7 (patch)
tree5220b17a8e4b6c434b799108719a1dc15d6c0326 /src/H5SMpkg.h
parent1726061075e9adc99ac2286fb542438acc79c4ab (diff)
downloadhdf5-31ff357f3190a869147378a9a136510be2caafd7.zip
hdf5-31ff357f3190a869147378a9a136510be2caafd7.tar.gz
hdf5-31ff357f3190a869147378a9a136510be2caafd7.tar.bz2
[svn-r13753] Description:
Check in "unique, but sharable" optimization to ISOHM code, which allows object header messages that are only used in one object to remain in the sole user's header, but migrates messages that are used in more than one header into the ISOHM heap. Tested on: Mac OS X/32 10.4.9 (amazon) FreeBSD/32 6.2 (duty) Linux/32 2.6 (chicago) Linux/64 2.6 (chicago2)
Diffstat (limited to 'src/H5SMpkg.h')
-rwxr-xr-xsrc/H5SMpkg.h70
1 files changed, 50 insertions, 20 deletions
diff --git a/src/H5SMpkg.h b/src/H5SMpkg.h
index 13935ab..2723bc7 100755
--- a/src/H5SMpkg.h
+++ b/src/H5SMpkg.h
@@ -45,11 +45,18 @@
#define H5SM_TABLE_SIZEOF_MAGIC 4
#define H5SM_SIZEOF_CHECKSUM 4
-#define H5SM_SOHM_ENTRY_SIZE(f) (1 /* "location" (unused right now) */ \
- + 4 /* Hash value */ \
- + 4 /* reference count*/ \
+#define H5SM_HEAP_LOC_SIZE (4 /* Reference count */ \
+ sizeof(H5O_fheap_id_t)) /* size of heap ID on disk */
+#define H5SM_OH_LOC_SIZE(f) (1 /* reserved (possible flags?) */ \
+ + 1 /* message type ID */ \
+ + 2 /* creation index of message in OH */ \
+ + H5F_SIZEOF_ADDR(f)) /* address of OH */
+
+#define H5SM_SOHM_ENTRY_SIZE(f) (1 /* Message location */ \
+ + 4 /* Hash value */ \
+ + MAX(H5SM_HEAP_LOC_SIZE, H5SM_OH_LOC_SIZE(f)))
+
#define H5SM_TABLE_SIZE(f) ( H5SM_TABLE_SIZEOF_MAGIC \
+ H5SM_SIZEOF_CHECKSUM) /* Checksum */
@@ -103,29 +110,37 @@
* disk.
*/
+/* Where a message is stored */
+typedef enum {
+ H5SM_NO_LOC = -1,
+ H5SM_IN_HEAP = 0, /* Message is stored in the heap */
+ H5SM_IN_OH /* Message is stored in an object header */
+} H5SM_storage_loc_t;
+
+/* Typedef for a record's location if it's stored in the heap */
+typedef struct {
+ hsize_t ref_count; /* Number of times this message is used in the file */
+ H5O_fheap_id_t fheap_id; /* ID of the OHM in the fractal heap */
+} H5SM_heap_loc_t;
+
/* Typedef for a SOHM index node */
typedef struct {
- uint32_t hash; /* Hash value for OHM */
- H5O_fheap_id_t fheap_id; /* ID of the OHM in the fractal heap */
- hsize_t ref_count; /* Number of times this message is used */
+ H5SM_storage_loc_t location; /* Type of message location */
+ uint32_t hash; /* Hash value for encoded OHM */
+ unsigned msg_type_id; /* Message's type ID */
+ union {
+ H5O_mesg_loc_t mesg_loc; /* Location of message in object header */
+ H5SM_heap_loc_t heap_loc; /* Heap ID for message in SOHM heap */
+ } u;
} H5SM_sohm_t;
+/* Types of message indices */
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 {
- H5SM_sohm_t message; /* The message to find/insert.
- * If the message doesn't yet have a
- * heap ID, the heap ID will be 0. */
- void *encoding; /* The message encoded, or NULL */
- size_t encoding_size; /* Size of the encoding, or 0 */
- H5HF_t *fheap; /* The heap for this message type, open. */
-} H5SM_mesg_key_t;
-
/* Typedef for a SOHM index header */
typedef struct {
unsigned mesg_types; /* Bit flag vector of message types */
@@ -157,6 +172,18 @@ struct H5SM_master_table_t {
H5SM_index_header_t *indexes; /* Array of num_indexes indexes */
};
+/* Typedef for searching an index (list or B-tree) */
+typedef struct {
+ H5F_t *file; /* File in which sharing is happening */
+ hid_t dxpl_id; /* DXPL for sharing messages in heap */
+ H5HF_t *fheap; /* The heap for this message type, open. */
+ void *encoding; /* The message encoded, or NULL */
+ size_t encoding_size; /* Size of the encoding, or 0 */
+ H5SM_sohm_t message; /* The message to find/insert.
+ * If the message doesn't yet have a
+ * heap ID, the heap ID will be 0. */
+} H5SM_mesg_key_t;
+
/*
* Data exchange structure to pass through the fractal heap layer for the
* H5HF_op function when computing a hash value for a message.
@@ -169,6 +196,13 @@ typedef struct {
uint32_t hash; /* Hash value */
} H5SM_fh_ud_gh_t;
+/* Typedef to increment a reference count in the B-tree */
+typedef struct {
+ H5SM_mesg_key_t *key; /* IN: key for message being incremented */
+ H5O_fheap_id_t fheap_id; /* OUT: fheap ID of record */
+ hid_t dxpl_id;
+} H5SM_incr_ref_opdata;
+
/****************************/
/* Package Variables */
@@ -202,10 +236,6 @@ H5_DLL herr_t H5SM_message_decode(const H5F_t *f, const uint8_t *raw,
H5_DLL herr_t H5SM_message_compare(const void *rec1,
const void *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);
-
/* H5B2_remove_t callback to add messages to a list index */
H5_DLL herr_t H5SM_btree_convert_to_list_op(const void * record, void *op_data);