summaryrefslogtreecommitdiffstats
path: root/src/H5I.c
diff options
context:
space:
mode:
authorRobb Matzke <matzke@llnl.gov>1998-10-08 17:13:14 (GMT)
committerRobb Matzke <matzke@llnl.gov>1998-10-08 17:13:14 (GMT)
commit19ec99786adba12a7517f633888c3976738135ce (patch)
tree8d40536cf23cbded60afb3133c1cefd1aebeb3ed /src/H5I.c
parent1fddd40b8b45e8ced68d2192e10baf000deb0857 (diff)
downloadhdf5-19ec99786adba12a7517f633888c3976738135ce.zip
hdf5-19ec99786adba12a7517f633888c3976738135ce.tar.gz
hdf5-19ec99786adba12a7517f633888c3976738135ce.tar.bz2
[svn-r745] Changes since 19981002
---------------------- ./doc/html/H5.format.html ./src/H5HG.c Fixed a bug in the global heap that caused H5HG_read() to write past the end of the buffer in certain cases. ./test/big.c The test is skipped if hdf5 was configured with `--disable-hsizet'. ./src/H5Ofill.c Data type conversions are implemented for the fill value. ./src/H5.c Tracing prints one of H5P_FILE_CREATE, H5P_FILE_ACCESS, H5P_DATASET_CREATE, H5P_DATASET_XFER, or H5P_MOUNT instead of the more cryptic H5I_TEMPLATE_* constants. ./src/H5D.c Removed prototype for H5D_find_name(). ./src/H5I.c The GROUP_MASK and ID_MASK are both calculated from GROUP_BITS instead of being set by hand. We don't use the sign bit of hid_t; all valid hid_t values are positive so we can say things like `if ((file=H5Fopen(...))<0)'. Changed `(int)pow(2.0,x)' to `1<<x' so we don't have to worry about rounding. Fixed H5I_get_type() so it doesn't always fail an assertion. ./src/H5E.c ./src/H5Epublic.h Added minor error H5E_MOUNT ./src/H5F.c ./src/H5Fprivate.h Added H5Fmount() and H5Funmount(). Mounting and unmounting works as documented but some of the other things aren't implemented yet, the biggest being current working groups always acting on the root of the mount tree, and H5Fclose() closing the entire tree. The rest of the stuff will be added shortly... ./src/H5P.c ./src/H5Ppublic.h Added the H5P_MOUNT property list but haven't implemented any particular properties for it yet. ./src/H5Gstab.c Hard links across files return an error instead of failing an assertion.
Diffstat (limited to 'src/H5I.c')
-rw-r--r--src/H5I.c41
1 files changed, 27 insertions, 14 deletions
diff --git a/src/H5I.c b/src/H5I.c
index 06ee59c..2de9b25 100644
--- a/src/H5I.c
+++ b/src/H5I.c
@@ -84,18 +84,25 @@ static herr_t H5I_init_interface(void);
# define ID_CACHE_SIZE 4 /*# of previous atoms cached */
#endif
-/* # of bits to use for Group ID in each atom (change if H5I_MAXID>32) */
-#define GROUP_BITS 5
-#define GROUP_MASK 0x1F
+/*
+ * Number of bits to use for Group ID in each atom. Increase if H5I_MAXID
+ * becomes too large (an assertion would fail in H5I_init_interface). This is
+ * the only number that must be changed since all other bit field sizes and
+ * masks are calculated from GROUP_BITS.
+ */
+#define GROUP_BITS 5
+#define GROUP_MASK ((1<<GROUP_BITS)-1)
-/* # of bits to use for the Atom index in each atom (assumes 8-bit bytes) */
-#define ID_BITS ((sizeof(hid_t)*8)-GROUP_BITS)
-#define ID_MASK 0x07FFFFFF
+/*
+ * Number of bits to use for the Atom index in each atom (assumes 8-bit
+ * bytes). We don't use the sign bit.
+ */
+#define ID_BITS ((sizeof(hid_t)*8)-(GROUP_BITS+1))
+#define ID_MASK ((1<<ID_BITS)-1)
/* Map an atom to a Group number */
-#define H5I_GROUP(a) ((H5I_type_t) \
- ((((hid_t)(a))>> \
- ((sizeof(hid_t)*8)-GROUP_BITS))&GROUP_MASK))
+#define H5I_GROUP(a) ((H5I_type_t)(((hid_t)(a)>>ID_BITS) & GROUP_MASK))
+
#ifdef HASH_SIZE_POWER_2
/*
@@ -107,11 +114,11 @@ static herr_t H5I_init_interface(void);
/*
* Map an ID to a hash location.
*/
-# define H5I_LOC(a,s) (((hid_t)(a)&ID_MASK)%(s))
+# define H5I_LOC(a,s) (((hid_t)(a)&ID_MASK)%(s))
#endif
/* Combine a Group number and an atom index into an atom */
-#define H5I_MAKE(g,i) ((((hid_t)(g)&GROUP_MASK)<<ID_BITS)| \
+#define H5I_MAKE(g,i) ((((hid_t)(g)&GROUP_MASK)<<ID_BITS)| \
((hid_t)(i)&ID_MASK))
#ifdef IDS_ARE_CACHED
@@ -148,8 +155,15 @@ H5I_init_interface(void)
herr_t ret_value = SUCCEED;
FUNC_ENTER(H5I_init_interface, FAIL);
- /* Make certain the ID types don't overflow the number of bits allocated for them in an ID */
+ /*
+ * Make certain the ID types don't overflow the number of bits allocated
+ * for them in an ID.
+ */
+#if 0
assert((int)H5I_MAXID<=(int)pow((double)2.0,(double)GROUP_BITS));
+#else
+ assert(H5I_MAXID<=(1<<GROUP_BITS));
+#endif
/* Registers the cleanup routine with the exit chain */
ret_value = H5_add_exit(&H5I_term_interface);
@@ -554,9 +568,8 @@ H5I_get_type(hid_t id)
FUNC_ENTER(H5I_get_type, H5I_BADID);
- assert(id>H5I_BADID && id<H5I_MAXID);
-
ret_value = H5I_GROUP(id);
+ assert(ret_value>H5I_BADID && ret_value<H5I_MAXID);
FUNC_LEAVE(ret_value);
}