From 2e8b6c0223e6969e3840e2dfefdfa34a223f3e15 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Thu, 1 Mar 2007 16:26:31 -0500 Subject: [svn-r13440] Description: Revise latest form of superblock format pretty drastically, to eliminate unused fields and move rarely used fields into superblock extension. Finished removing last vestiges of references to (never used) i"shared" object header message ID. Added object header messages for non-default v1 B-tree 'K' values and for driver info. Updated testfiles to reflect size changes, etc. Various minor cleanups, etc. Tested on: FreeBSD/32 6.2 (duty) Mac OS X/32 10.4.8 (amazon) --- MANIFEST | 2 + src/H5F.c | 43 +- src/H5Fdbg.c | 10 +- src/H5Fpkg.h | 8 +- src/H5Fsuper.c | 717 ++++++++++++++++---------- src/H5O.c | 5 +- src/H5Obtreek.c | 257 +++++++++ src/H5Odrvinfo.c | 313 +++++++++++ src/H5Oginfo.c | 2 +- src/H5Olinfo.c | 2 +- src/H5Omessage.c | 4 - src/H5Opkg.h | 24 +- src/H5Oprivate.h | 30 +- src/H5Oshmesg.c | 31 +- src/Makefile.am | 5 +- src/Makefile.in | 10 +- test/be_extlink1.h5 | Bin 880 -> 936 bytes test/be_extlink2.h5 | Bin 2744 -> 2888 bytes test/le_extlink1.h5 | Bin 880 -> 936 bytes test/le_extlink2.h5 | Bin 2744 -> 2888 bytes tools/testfiles/h5diff_types.h5 | Bin 4874 -> 4874 bytes tools/testfiles/h5mkgrp_nested_latest.ls | 4 +- tools/testfiles/h5mkgrp_nested_mult_latest.ls | 8 +- tools/testfiles/h5mkgrp_several_latest.ls | 4 +- tools/testfiles/h5mkgrp_single_latest.ls | 2 +- tools/testfiles/h5repack_objs.h5 | Bin 18592 -> 19568 bytes tools/testfiles/tall-2A.h5.xml | 4 +- tools/testfiles/tall.h5 | Bin 9136 -> 10072 bytes tools/testfiles/tall.h5.xml | 4 +- tools/testfiles/tboot1.ddl | 2 +- tools/testfiles/tcontents.ddl | 2 +- tools/testfiles/textlink.h5 | Bin 920 -> 992 bytes tools/testfiles/tfcontents1.h5 | Bin 6744 -> 7610 bytes tools/testfiles/tmany.h5 | Bin 18456 -> 18728 bytes tools/testfiles/tmany.h5.xml | 38 +- tools/testfiles/tudlink.h5 | Bin 920 -> 952 bytes tools/testfiles/twithub.h5 | Bin 8852 -> 10760 bytes tools/testfiles/twithub513.h5 | Bin 8852 -> 11304 bytes 38 files changed, 1129 insertions(+), 402 deletions(-) create mode 100644 src/H5Obtreek.c create mode 100644 src/H5Odrvinfo.c diff --git a/MANIFEST b/MANIFEST index edc4e2e..2599adf 100644 --- a/MANIFEST +++ b/MANIFEST @@ -586,10 +586,12 @@ ./src/H5Oattr.c ./src/H5Oattribute.c ./src/H5Obogus.c +./src/H5Obtreek.c ./src/H5Ocache.c ./src/H5Ocont.c ./src/H5Ocopy.c ./src/H5Odbg.c +./src/H5Odrvinfo.c ./src/H5Odtype.c ./src/H5Oefl.c ./src/H5Ofill.c diff --git a/src/H5F.c b/src/H5F.c index 603c438..fd8dc24 100644 --- a/src/H5F.c +++ b/src/H5F.c @@ -32,7 +32,6 @@ #include "H5MMprivate.h" /* Memory management */ #include "H5Pprivate.h" /* Property lists */ #include "H5Tprivate.h" /* Datatypes */ -#include "H5SMprivate.h" /* Shared Object Header messages */ /* Predefined file drivers */ #include "H5FDcore.h" /*temporary in-memory files */ @@ -1303,46 +1302,19 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id, hid_t d * empty or not. */ if(0 == H5FD_get_eof(lf) && (flags & H5F_ACC_RDWR)) { - H5O_loc_t ext_loc; /* Superblock extension location */ - /* * We've just opened a fresh new file (or truncated one). We need * to create & write the superblock. */ /* Initialize information about the superblock and allocate space for it */ - if(H5F_init_superblock(file, &ext_loc, dxpl_id) < 0) + /* (Writes superblock extension messages, if there are any) */ + if(H5F_super_init(file, dxpl_id) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to allocate file superblock") - /* Create the Shared Object Header Message table and register it with - * the metadata cache, if this file supports shared messages. - */ - if(file->shared->sohm_nindexes > 0) { - H5P_genplist_t *c_plist; /*file creation property list */ - - /* Get the file's creation property list */ - if(NULL == (c_plist = H5P_object_verify(fcpl_id, H5P_FILE_CREATE))) - HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, NULL, "can't find object for ID"); - - /* Initialize the shared message code */ - if(H5SM_init(file, c_plist, &ext_loc, dxpl_id) < 0) - HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create SOHM table") - } /* end if */ - - /* Close the superblock extension, if it was opened */ - if(H5F_addr_defined(file->shared->extension_addr)) { - /* Twiddle the number of open objects to avoid closing the file - * (since this will be the only open object currently). - */ - file->nopen_objs++; - if(H5O_close(&ext_loc) < 0) - HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, NULL, "unable to close superblock extension") - file->nopen_objs--; - } /* end if */ - /* Create and open the root group */ /* (This must be after the space for the superblock is allocated in - * the file and after the SOHM table has been created) + * the file, since the superblock must be at offset 0) */ if(H5G_mkroot(file, dxpl_id, NULL) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create/open root group") @@ -1351,7 +1323,7 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id, hid_t d /* (This must be after the root group is created, since the root * group's symbol table entry is part of the superblock) */ - if(H5F_write_superblock(file, dxpl_id) < 0) + if(H5F_super_write(file, dxpl_id) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to write file superblock") } else if (1 == shared->nrefs) { H5G_loc_t root_loc; /*root location */ @@ -1364,7 +1336,7 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id, hid_t d H5G_loc_reset(&root_loc); /* Read the superblock if it hasn't been read before. */ - if(H5F_read_superblock(file, dxpl_id, &root_loc) < 0) + if(H5F_super_read(file, dxpl_id, &root_loc) < 0) HGOTO_ERROR(H5E_FILE, H5E_READERROR, NULL, "unable to read superblock") /* Open the root group */ @@ -1826,12 +1798,11 @@ H5F_flush(H5F_t *f, hid_t dxpl_id, H5F_scope_t scope, unsigned flags) } /* end if */ /* Write the superblock to disk */ - if(H5F_write_superblock(f, dxpl_id) != SUCCEED) + if(H5F_super_write(f, dxpl_id) != SUCCEED) HGOTO_ERROR(H5E_CACHE, H5E_WRITEERROR, FAIL, "unable to write superblock to file") /* Flush file buffers to disk. */ - if(H5FD_flush(f->shared->lf, dxpl_id, - (unsigned)((flags & H5F_FLUSH_CLOSING) > 0)) < 0) + if(H5FD_flush(f->shared->lf, dxpl_id, (unsigned)((flags & H5F_FLUSH_CLOSING) > 0)) < 0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "low level flush failed") /* Check flush errors for children - errors are already on the stack */ diff --git a/src/H5Fdbg.c b/src/H5Fdbg.c index 9db8b2f..c3d1ea7 100644 --- a/src/H5Fdbg.c +++ b/src/H5Fdbg.c @@ -104,15 +104,13 @@ H5F_debug(H5F_t *f, hid_t dxpl_id, FILE * stream, int indent, int fwidth) HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, "Symbol table leaf node 1/2 rank:", f->shared->sym_leaf_k); HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, - "Symbol table internal node 1/2 rank:", - f->shared->btree_k[H5B_SNODE_ID]); - HDfprintf(stream, "%*s%-*s 0x%08lx\n", indent, "", fwidth, - "File consistency flags:", - (unsigned long) (f->shared->consist_flags)); + "Symbol table internal node 1/2 rank:", f->shared->btree_k[H5B_SNODE_ID]); + HDfprintf(stream, "%*s%-*s 0x%02x\n", indent, "", fwidth, + "File consistency flags:", (unsigned)(f->shared->consist_flags)); HDfprintf(stream, "%*s%-*s %a (abs)\n", indent, "", fwidth, "Base address:", f->shared->base_addr); HDfprintf(stream, "%*s%-*s %a (rel)\n", indent, "", fwidth, - "Superblock extension address (formerly free space address):", f->shared->extension_addr); + "Superblock extension address:", f->shared->extension_addr); HDfprintf(stream, "%*s%-*s %a (rel)\n", indent, "", fwidth, "Shared object header message table address:", f->shared->sohm_addr); HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, diff --git a/src/H5Fpkg.h b/src/H5Fpkg.h index 9a76472..e8df026 100644 --- a/src/H5Fpkg.h +++ b/src/H5Fpkg.h @@ -69,7 +69,7 @@ typedef struct H5F_file_t { H5FD_t *lf; /* Lower level file handle for I/O */ unsigned nrefs; /* Ref count for times file is opened */ - uint32_t consist_flags; /* File Consistency Flags */ + uint8_t consist_flags; /* File Consistency Flags */ unsigned flags; /* Access Permissions for file */ /* Cached values from FCPL */ @@ -171,9 +171,9 @@ H5_DLL int H5F_term_unmount_cb(void *obj_ptr, hid_t obj_id, void *key); H5_DLL herr_t H5F_mount_count_ids(H5F_t *f, unsigned *nopen_files, unsigned *nopen_objs); /* Superblock related routines */ -H5_DLL herr_t H5F_init_superblock(H5F_t *f, H5O_loc_t *ext_loc, hid_t dxpl_id); -H5_DLL herr_t H5F_write_superblock(H5F_t *f, hid_t dxpl_id); -H5_DLL herr_t H5F_read_superblock(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc); +H5_DLL herr_t H5F_super_init(H5F_t *f, hid_t dxpl_id); +H5_DLL herr_t H5F_super_write(H5F_t *f, hid_t dxpl_id); +H5_DLL herr_t H5F_super_read(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc); /* Shared file list related routines */ H5_DLL herr_t H5F_sfile_add(H5F_file_t *shared); diff --git a/src/H5Fsuper.c b/src/H5Fsuper.c index 5a3692a..547502d 100644 --- a/src/H5Fsuper.c +++ b/src/H5Fsuper.c @@ -71,14 +71,13 @@ + H5F_SIZEOF_ADDR(f) /* driver block address */ \ + H5G_SIZEOF_ENTRY(f)) /* root group ptr */ #define H5F_SUPERBLOCK_VARLEN_SIZE_V2(f) \ - ( H5F_SUPERBLOCK_VARLEN_SIZE_COMMON /* Common variable-length info */ \ - + 2 /* indexed B-tree internal k */ \ + ( 2 /* size of address, size of lengths */ \ + + 1 /* consistency flags */ \ + H5F_SIZEOF_ADDR(f) /* base address */ \ + H5F_SIZEOF_ADDR(f) /* superblock extension address */ \ + H5F_SIZEOF_ADDR(f) /* EOF address */ \ - + H5F_SIZEOF_ADDR(f) /* driver block address */ \ - + H5G_SIZEOF_ENTRY(f) /* root group ptr */ \ - + H5F_SIZEOF_CHKSUM) /* superblock + driver info block checksum (keep this last) */ + + H5F_SIZEOF_ADDR(f) /* root group object header address */ \ + + H5F_SIZEOF_CHKSUM) /* superblock checksum (keep this last) */ #define H5F_SUPERBLOCK_VARLEN_SIZE(v, f) ( \ (v == 0 ? H5F_SUPERBLOCK_VARLEN_SIZE_V0(f) : 0) \ + (v == 1 ? H5F_SUPERBLOCK_VARLEN_SIZE_V1(f) : 0) \ @@ -213,7 +212,7 @@ done: /*------------------------------------------------------------------------- - * Function: H5F_read_superblock + * Function: H5F_super_read * * Purpose: Reads the superblock from the file or from the BUF. If * ADDR is a valid address, then it reads it from the file. @@ -230,25 +229,23 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_read_superblock(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc) +H5F_super_read(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc) { + uint8_t sbuf[H5F_MAX_SUPERBLOCK_SIZE]; /* Buffer for superblock */ + H5P_genplist_t *c_plist; /* File creation property list */ + H5F_file_t *shared; /* shared part of `file' */ + H5FD_t *lf; /* file driver part of `shared' */ haddr_t stored_eoa; /*relative end-of-addr in file */ haddr_t eof; /*end of file address */ size_t sizeof_addr; /* Size of offsets in the file (in bytes) */ size_t sizeof_size; /* Size of lengths in the file (in bytes) */ const size_t fixed_size = H5F_SUPERBLOCK_FIXED_SIZE; /*fixed sizeof superblock */ - unsigned sym_leaf_k; /* Symbol table leaf node's 'K' value */ size_t variable_size; /*variable sizeof superblock */ - unsigned btree_k[H5B_NUM_BTREE_ID]; /* B-tree internal node 'K' values */ - H5F_file_t *shared = NULL; /* shared part of `file' */ - H5FD_t *lf = NULL; /* file driver part of `shared' */ uint8_t *p; /* Temporary pointer into encoding buffer */ unsigned super_vers; /* Superblock version */ - uint8_t buf[H5F_MAX_SUPERBLOCK_SIZE + H5F_MAX_DRVINFOBLOCK_SIZE]; /* Buffer for superblock & driver info block */ - H5P_genplist_t *c_plist; /* File creation property list */ herr_t ret_value = SUCCEED; - FUNC_ENTER_NOAPI(H5F_read_superblock, FAIL) + FUNC_ENTER_NOAPI(H5F_super_read, FAIL) /* Short cuts */ shared = f->shared; @@ -263,7 +260,7 @@ H5F_read_superblock(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc) HGOTO_ERROR(H5E_FILE, H5E_NOTHDF5, FAIL, "unable to find file signature") /* Read fixed-size portion of the superblock */ - p = buf; + p = sbuf; if(H5FD_set_eoa(lf, H5FD_MEM_SUPER, shared->super_addr + fixed_size) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "set end of space allocation request failed") if(H5FD_read(lf, H5FD_MEM_SUPER, dxpl_id, shared->super_addr, fixed_size, p) < 0) @@ -280,12 +277,12 @@ H5F_read_superblock(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc) HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set superblock version") /* Sanity check */ - HDassert(((size_t)(p - buf)) == fixed_size); + HDassert(((size_t)(p - sbuf)) == fixed_size); /* Determine the size of the variable-length part of the superblock */ variable_size = H5F_SUPERBLOCK_VARLEN_SIZE(super_vers, f); HDassert(variable_size > 0); - HDassert(fixed_size + variable_size <= sizeof(buf)); + HDassert(fixed_size + variable_size <= sizeof(sbuf)); /* Read in variable-sized portion of superblock */ if(H5FD_set_eoa(lf, H5FD_MEM_SUPER, shared->super_addr + fixed_size + variable_size) < 0) @@ -293,194 +290,235 @@ H5F_read_superblock(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc) if(H5FD_read(lf, H5FD_MEM_SUPER, dxpl_id, shared->super_addr + fixed_size, variable_size, p) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to read superblock") - /* Freespace version */ - if(HDF5_FREESPACE_VERSION != *p++) - HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad free space version number") - - /* Root group version number */ - if(HDF5_OBJECTDIR_VERSION != *p++) - HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad object directory version number") - - /* Skip over reserved byte */ - p++; - - /* Shared header version number */ - if(HDF5_SHAREDHEADER_VERSION != *p++) - HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad shared-header format version number") - - /* Size of file addresses */ - sizeof_addr = *p++; - if(sizeof_addr != 2 && sizeof_addr != 4 && - sizeof_addr != 8 && sizeof_addr != 16 && sizeof_addr != 32) - HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad byte number in an address") - if(H5P_set(c_plist, H5F_CRT_ADDR_BYTE_NUM_NAME,&sizeof_addr) < 0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set byte number in an address") - shared->sizeof_addr = sizeof_addr; /* Keep a local copy also */ - - /* Size of file sizes */ - sizeof_size = *p++; - if(sizeof_size != 2 && sizeof_size != 4 && - sizeof_size != 8 && sizeof_size != 16 && sizeof_size != 32) - HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad byte number for object size") - if(H5P_set(c_plist, H5F_CRT_OBJ_BYTE_NUM_NAME, &sizeof_size) < 0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set byte number for object size") - shared->sizeof_size = sizeof_size; /* Keep a local copy also */ - - /* Skip over reserved byte */ - p++; - - /* Various B-tree sizes */ - UINT16DECODE(p, sym_leaf_k); - if(sym_leaf_k == 0) - HGOTO_ERROR(H5E_FILE, H5E_BADRANGE, FAIL, "bad symbol table leaf node 1/2 rank") - if(H5P_set(c_plist, H5F_CRT_SYM_LEAF_NAME, &sym_leaf_k) < 0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set rank for symbol table leaf nodes") - shared->sym_leaf_k = sym_leaf_k; /* Keep a local copy also */ - - /* Need 'get' call to set other array values */ - if(H5P_get(c_plist, H5F_CRT_BTREE_RANK_NAME, btree_k) < 0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get rank for btree internal nodes") - UINT16DECODE(p, btree_k[H5B_SNODE_ID]); - if(btree_k[H5B_SNODE_ID] == 0) - HGOTO_ERROR(H5E_FILE, H5E_BADRANGE, FAIL, "bad 1/2 rank for btree internal nodes") - /* - * Delay setting the value in the property list until we've checked - * for the indexed storage B-tree internal 'K' value later. - */ - - /* File consistency flags. Not really used yet */ - UINT32DECODE(p, shared->consist_flags); - - /* - * If the superblock version # is greater than 0, read in the indexed - * storage B-tree internal 'K' value - */ - if(super_vers > HDF5_SUPERBLOCK_VERSION_DEF) { - UINT16DECODE(p, btree_k[H5B_ISTORE_ID]); - /* Reserved bytes are present only in version 1 */ - if(super_vers == HDF5_SUPERBLOCK_VERSION_1) - p += 2; /* reserved */ - } /* end if */ - else - btree_k[H5B_ISTORE_ID] = HDF5_BTREE_ISTORE_IK_DEF; - - /* Set the B-tree internal node values, etc */ - if(H5P_set(c_plist, H5F_CRT_BTREE_RANK_NAME, btree_k) < 0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set rank for btree internal nodes") - HDmemcpy(shared->btree_k, btree_k, sizeof(unsigned) * (size_t)H5B_NUM_BTREE_ID); /* Keep a local copy also */ - - /* Remainder of "variable-sized" portion of superblock */ - H5F_addr_decode(f, (const uint8_t **)&p, &shared->base_addr/*out*/); - H5F_addr_decode(f, (const uint8_t **)&p, &shared->extension_addr/*out*/); - H5F_addr_decode(f, (const uint8_t **)&p, &stored_eoa/*out*/); - H5F_addr_decode(f, (const uint8_t **)&p, &shared->driver_addr/*out*/); - if(H5G_obj_ent_decode(f, (const uint8_t **)&p, root_loc->oloc/*out*/) < 0) - HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to read root symbol entry") - - /* - * Check if superblock address is different from base address and - * adjust base address and "end of address" address if so. - */ - if(!H5F_addr_eq(shared->super_addr, shared->base_addr)) { - /* Check if the superblock moved earlier in the file */ - if(H5F_addr_lt(shared->super_addr, shared->base_addr)) - stored_eoa -= (shared->base_addr - shared->super_addr); - else - /* The superblock moved later in the file */ - stored_eoa += (shared->super_addr - shared->base_addr); + /* Check for older version of superblock format */ + if(super_vers < HDF5_SUPERBLOCK_VERSION_2) { + uint32_t consist_flags; /* File Consistency Flags */ + unsigned btree_k[H5B_NUM_BTREE_ID]; /* B-tree internal node 'K' values */ + unsigned sym_leaf_k; /* Symbol table leaf node's 'K' value */ + + /* Freespace version (hard-wired) */ + if(HDF5_FREESPACE_VERSION != *p++) + HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad free space version number") + + /* Root group version number (hard-wired) */ + if(HDF5_OBJECTDIR_VERSION != *p++) + HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad object directory version number") + + /* Skip over reserved byte */ + p++; + + /* Shared header version number (hard-wired) */ + if(HDF5_SHAREDHEADER_VERSION != *p++) + HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad shared-header format version number") + + /* Size of file addresses */ + sizeof_addr = *p++; + if(sizeof_addr != 2 && sizeof_addr != 4 && + sizeof_addr != 8 && sizeof_addr != 16 && sizeof_addr != 32) + HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad byte number in an address") + if(H5P_set(c_plist, H5F_CRT_ADDR_BYTE_NUM_NAME, &sizeof_addr) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set byte number in an address") + shared->sizeof_addr = sizeof_addr; /* Keep a local copy also */ + + /* Size of file sizes */ + sizeof_size = *p++; + if(sizeof_size != 2 && sizeof_size != 4 && + sizeof_size != 8 && sizeof_size != 16 && sizeof_size != 32) + HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad byte number for object size") + if(H5P_set(c_plist, H5F_CRT_OBJ_BYTE_NUM_NAME, &sizeof_size) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set byte number for object size") + shared->sizeof_size = sizeof_size; /* Keep a local copy also */ + + /* Skip over reserved byte */ + p++; + + /* Various B-tree sizes */ + UINT16DECODE(p, sym_leaf_k); + if(sym_leaf_k == 0) + HGOTO_ERROR(H5E_FILE, H5E_BADRANGE, FAIL, "bad symbol table leaf node 1/2 rank") + if(H5P_set(c_plist, H5F_CRT_SYM_LEAF_NAME, &sym_leaf_k) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set rank for symbol table leaf nodes") + shared->sym_leaf_k = sym_leaf_k; /* Keep a local copy also */ + + /* Need 'get' call to set other array values */ + if(H5P_get(c_plist, H5F_CRT_BTREE_RANK_NAME, btree_k) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get rank for btree internal nodes") + UINT16DECODE(p, btree_k[H5B_SNODE_ID]); + if(btree_k[H5B_SNODE_ID] == 0) + HGOTO_ERROR(H5E_FILE, H5E_BADRANGE, FAIL, "bad 1/2 rank for btree internal nodes") + /* + * Delay setting the value in the property list until we've checked + * for the indexed storage B-tree internal 'K' value later. + */ - shared->base_addr = shared->super_addr; - } /* end if */ + /* File consistency flags. (Not really used yet) */ + UINT32DECODE(p, consist_flags); + HDassert(consist_flags <= 255); + shared->consist_flags = consist_flags; - /* This step is for h5repart tool only. If user wants to change file driver - * from family to sec2 while using h5repart, set the driver address to - * undefined to let the library ignore the family driver information saved - * in the superblock. - */ - if(shared->fam_to_sec2) - shared->driver_addr = HADDR_UNDEF; - - /* Decode the optional driver information block */ - if(H5F_addr_defined(shared->driver_addr)) { - char drv_name[9]; /* Name of driver */ - unsigned drv_vers; /* Version of driver info block */ - haddr_t drv_addr = shared->base_addr + shared->driver_addr; - size_t drv_fixed_size; /* Amount of fixed size driver info to read */ - size_t drv_variable_size; /* Size of variable-length portion of driver info block, in bytes */ - - /* Account for extra data read in for superblock version > 1 */ - /* (extra room is for the trailing checksum on the superblock + driver info block) */ - if(super_vers >= HDF5_SUPERBLOCK_VERSION_2) - drv_fixed_size = (size_t)H5F_DRVINFOBLOCK_HDR_SIZE - H5F_SIZEOF_CHKSUM; + /* + * If the superblock version # is greater than 0, read in the indexed + * storage B-tree internal 'K' value + */ + if(super_vers > HDF5_SUPERBLOCK_VERSION_DEF) { + UINT16DECODE(p, btree_k[H5B_ISTORE_ID]); + /* Reserved bytes are present only in version 1 */ + if(super_vers == HDF5_SUPERBLOCK_VERSION_1) + p += 2; /* reserved */ + } /* end if */ else - drv_fixed_size = (size_t)H5F_DRVINFOBLOCK_HDR_SIZE; - - /* Read in fixed-sized portion of driver info block */ - if(H5FD_set_eoa(lf, H5FD_MEM_SUPER, drv_addr + H5F_DRVINFOBLOCK_HDR_SIZE) < 0) - HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "set end of space allocation request failed") - if(H5FD_read(lf, H5FD_MEM_SUPER, dxpl_id, drv_addr, drv_fixed_size, p) < 0) - HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to read driver information block") + btree_k[H5B_ISTORE_ID] = HDF5_BTREE_ISTORE_IK_DEF; - /* Version number */ - drv_vers = *p++; - if(drv_vers != HDF5_DRIVERINFO_VERSION_0) - HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "bad driver information block version number") + /* Set the B-tree internal node values, etc */ + if(H5P_set(c_plist, H5F_CRT_BTREE_RANK_NAME, btree_k) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set rank for btree internal nodes") + HDmemcpy(shared->btree_k, btree_k, sizeof(unsigned) * (size_t)H5B_NUM_BTREE_ID); /* Keep a local copy also */ - p += 3; /* reserved bytes */ + /* Remainder of "variable-sized" portion of superblock */ + H5F_addr_decode(f, (const uint8_t **)&p, &shared->base_addr/*out*/); + H5F_addr_decode(f, (const uint8_t **)&p, &shared->extension_addr/*out*/); + H5F_addr_decode(f, (const uint8_t **)&p, &stored_eoa/*out*/); + H5F_addr_decode(f, (const uint8_t **)&p, &shared->driver_addr/*out*/); + if(H5G_obj_ent_decode(f, (const uint8_t **)&p, root_loc->oloc/*out*/) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to read root symbol entry") - /* Driver info size */ - UINT32DECODE(p, drv_variable_size); - - /* Account for extra data to read for superblock version > 1 */ - /* (extra room is for the trailing checksum on the superblock + driver info block) */ - if(super_vers >= HDF5_SUPERBLOCK_VERSION_2) - drv_variable_size += H5F_SIZEOF_CHKSUM; - - /* Sanity check */ - HDassert(fixed_size + variable_size + drv_fixed_size + drv_variable_size <= sizeof(buf)); - - /* Driver name and/or version */ - HDstrncpy(drv_name, (const char *)p, (size_t)8); - drv_name[8] = '\0'; - p += 8; /* advance past name/version */ - - /* Read in variable-sized portion of driver info block */ - if(H5FD_set_eoa(lf, H5FD_MEM_SUPER, drv_addr + H5F_DRVINFOBLOCK_HDR_SIZE + drv_variable_size) < 0) - HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "set end of space allocation request failed") - if(H5FD_read(lf, H5FD_MEM_SUPER, dxpl_id, drv_addr + H5F_DRVINFOBLOCK_HDR_SIZE, drv_variable_size, p) < 0) - HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to read file driver information") - - /* Decode driver information */ - /* Check if driver matches driver information saved. Unfortunately, we can't push this - * function to each specific driver because we're checking if the driver is correct. + /* + * Check if superblock address is different from base address and + * adjust base address and "end of address" address if so. */ - if(!HDstrncmp(drv_name, "NCSAfami", (size_t)8) && HDstrcmp(lf->cls->name, "family")) - HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "family driver should be used") - if(!HDstrncmp(drv_name, "NCSAmult", (size_t)8) && HDstrcmp(lf->cls->name, "multi")) - HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "multi driver should be used") - - /* Decode the driver-specific driver info block information */ - if(H5FD_sb_decode(lf, drv_name, p) < 0) - HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to decode driver information") + if(!H5F_addr_eq(shared->super_addr, shared->base_addr)) { + /* Check if the superblock moved earlier in the file */ + if(H5F_addr_lt(shared->super_addr, shared->base_addr)) + stored_eoa -= (shared->base_addr - shared->super_addr); + else + /* The superblock moved later in the file */ + stored_eoa += (shared->super_addr - shared->base_addr); + + shared->base_addr = shared->super_addr; + } /* end if */ - /* Advance past variable length portion of driver info block */ - p += drv_variable_size; + /* This step is for h5repart tool only. If user wants to change file driver + * from family to sec2 while using h5repart, set the driver address to + * undefined to let the library ignore the family driver information saved + * in the superblock. + */ + if(shared->fam_to_sec2) + shared->driver_addr = HADDR_UNDEF; + + /* Decode the optional driver information block */ + if(H5F_addr_defined(shared->driver_addr)) { + uint8_t dbuf[H5F_MAX_DRVINFOBLOCK_SIZE]; /* Buffer for driver info block */ + char drv_name[9]; /* Name of driver */ + unsigned drv_vers; /* Version of driver info block */ + haddr_t drv_addr = shared->base_addr + shared->driver_addr; + size_t drv_variable_size; /* Size of variable-length portion of driver info block, in bytes */ + + /* Read in fixed-sized portion of driver info block */ + p = dbuf; + if(H5FD_set_eoa(lf, H5FD_MEM_SUPER, drv_addr + H5F_DRVINFOBLOCK_HDR_SIZE) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "set end of space allocation request failed") + if(H5FD_read(lf, H5FD_MEM_SUPER, dxpl_id, drv_addr, (size_t)H5F_DRVINFOBLOCK_HDR_SIZE, p) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to read driver information block") + + /* Version number */ + drv_vers = *p++; + if(drv_vers != HDF5_DRIVERINFO_VERSION_0) + HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "bad driver information block version number") + + p += 3; /* reserved bytes */ + + /* Driver info size */ + UINT32DECODE(p, drv_variable_size); + + /* Sanity check */ + HDassert(H5F_DRVINFOBLOCK_HDR_SIZE + drv_variable_size <= sizeof(dbuf)); + + /* Driver name and/or version */ + HDstrncpy(drv_name, (const char *)p, (size_t)8); + drv_name[8] = '\0'; + p += 8; /* advance past name/version */ + + /* Check if driver matches driver information saved. Unfortunately, we can't push this + * function to each specific driver because we're checking if the driver is correct. + */ + if(!HDstrncmp(drv_name, "NCSAfami", (size_t)8) && HDstrcmp(lf->cls->name, "family")) + HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "family driver should be used") + if(!HDstrncmp(drv_name, "NCSAmult", (size_t)8) && HDstrcmp(lf->cls->name, "multi")) + HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "multi driver should be used") + + /* Read in variable-sized portion of driver info block */ + if(H5FD_set_eoa(lf, H5FD_MEM_SUPER, drv_addr + H5F_DRVINFOBLOCK_HDR_SIZE + drv_variable_size) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "set end of space allocation request failed") + if(H5FD_read(lf, H5FD_MEM_SUPER, dxpl_id, drv_addr + H5F_DRVINFOBLOCK_HDR_SIZE, drv_variable_size, p) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to read file driver information") + + /* Decode driver information */ + if(H5FD_sb_decode(lf, drv_name, p) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to decode driver information") + } /* end if */ } /* end if */ - - /* Compute checksum for superblock versions > 1 */ - if(super_vers >= HDF5_SUPERBLOCK_VERSION_2) { + else { + haddr_t root_addr; /* Address of root group */ uint32_t computed_chksum; /* Computed checksum */ uint32_t read_chksum; /* Checksum read from file */ - /* Compute checksum on superblock + driver info block */ - computed_chksum = H5_checksum_metadata(buf, (size_t)(p - buf), 0); + /* Size of file addresses */ + sizeof_addr = *p++; + if(sizeof_addr != 2 && sizeof_addr != 4 && + sizeof_addr != 8 && sizeof_addr != 16 && sizeof_addr != 32) + HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad byte number in an address") + if(H5P_set(c_plist, H5F_CRT_ADDR_BYTE_NUM_NAME, &sizeof_addr) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set byte number in an address") + shared->sizeof_addr = sizeof_addr; /* Keep a local copy also */ + + /* Size of file sizes */ + sizeof_size = *p++; + if(sizeof_size != 2 && sizeof_size != 4 && + sizeof_size != 8 && sizeof_size != 16 && sizeof_size != 32) + HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad byte number for object size") + if(H5P_set(c_plist, H5F_CRT_OBJ_BYTE_NUM_NAME, &sizeof_size) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set byte number for object size") + shared->sizeof_size = sizeof_size; /* Keep a local copy also */ + + /* File consistency flags. (Not really used yet) */ + shared->consist_flags = *p++; + + /* Base, superblock extension, end of file & root group object header addresses */ + H5F_addr_decode(f, (const uint8_t **)&p, &shared->base_addr/*out*/); + H5F_addr_decode(f, (const uint8_t **)&p, &shared->extension_addr/*out*/); + H5F_addr_decode(f, (const uint8_t **)&p, &stored_eoa/*out*/); + H5F_addr_decode(f, (const uint8_t **)&p, &root_addr/*out*/); + + /* Compute checksum for superblock */ + computed_chksum = H5_checksum_metadata(sbuf, (size_t)(p - sbuf), 0); /* Decode checksum */ UINT32DECODE(p, read_chksum); + /* Verify correct checksum */ if(read_chksum != computed_chksum) HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "bad checksum on driver information block") - } /* end if */ + + /* Create root group object location */ + H5O_loc_reset(root_loc->oloc); + root_loc->oloc->file = f; + root_loc->oloc->addr = root_addr; + + /* + * Check if superblock address is different from base address and + * adjust base address and "end of address" address if so. + */ + if(!H5F_addr_eq(shared->super_addr, shared->base_addr)) { + /* Check if the superblock moved earlier in the file */ + if(H5F_addr_lt(shared->super_addr, shared->base_addr)) + stored_eoa -= (shared->base_addr - shared->super_addr); + else + /* The superblock moved later in the file */ + stored_eoa += (shared->super_addr - shared->base_addr); + + shared->base_addr = shared->super_addr; + } /* end if */ + } /* end else */ /* * The user-defined data is the area of the file before the base @@ -508,7 +546,9 @@ H5F_read_superblock(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc) /* Read the file's superblock extension, if there is one. */ if(H5F_addr_defined(shared->extension_addr)) { - H5O_loc_t ext_loc; /* "Object location" for superblock extension */ + H5O_loc_t ext_loc; /* "Object location" for superblock extension */ + H5O_btreek_t btreek; /* v1 B-tree 'K' value message from superblock extension */ + H5O_drvinfo_t drvinfo; /* Driver info message from superblock extension */ /* Sanity check - superblock extension should only be defined for * superblock version >= 2. @@ -528,6 +568,51 @@ H5F_read_superblock(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc) if(H5SM_get_info(&ext_loc, c_plist, dxpl_id) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to read SOHM table information") + /* Read in v1 B-tree 'K' value message, if it exists */ + if(NULL == H5O_msg_read(&ext_loc, H5O_BTREEK_ID, &btreek, dxpl_id)) { + /* Reset error from "failed" message read */ + H5E_clear_stack(NULL); + + /* No non-default v1 B-tree 'K' value info in file, use defaults */ + shared->btree_k[H5B_ISTORE_ID] = HDF5_BTREE_ISTORE_IK_DEF; + shared->btree_k[H5B_SNODE_ID] = HDF5_BTREE_SNODE_IK_DEF; + shared->sym_leaf_k = H5F_CRT_SYM_LEAF_DEF; + } /* end if */ + else { + /* Set non-default v1 B-tree 'K' value info from file */ + shared->btree_k[H5B_ISTORE_ID] = btreek.btree_k[H5B_ISTORE_ID]; + shared->btree_k[H5B_SNODE_ID] = btreek.btree_k[H5B_SNODE_ID]; + shared->sym_leaf_k = btreek.sym_leaf_k; + + /* Set non-default v1 B-tree 'K' values in the property list */ + if(H5P_set(c_plist, H5F_CRT_BTREE_RANK_NAME, btreek.btree_k) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set rank for btree internal nodes") + if(H5P_set(c_plist, H5F_CRT_SYM_LEAF_NAME, &btreek.sym_leaf_k) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set rank for symbol table leaf nodes") + } /* end else */ + + /* Read in driver info message, if it exists */ + if(NULL == H5O_msg_read(&ext_loc, H5O_DRVINFO_ID, &drvinfo, dxpl_id)) { + /* Reset error from "failed" message read */ + H5E_clear_stack(NULL); + } /* end if */ + else { + /* Check if driver matches driver information saved. Unfortunately, we can't push this + * function to each specific driver because we're checking if the driver is correct. + */ + if(!HDstrncmp(drvinfo.name, "NCSAfami", (size_t)8) && HDstrcmp(lf->cls->name, "family")) + HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "family driver should be used") + if(!HDstrncmp(drvinfo.name, "NCSAmult", (size_t)8) && HDstrcmp(lf->cls->name, "multi")) + HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "multi driver should be used") + + /* Decode driver information */ + if(H5FD_sb_decode(lf, drvinfo.name, drvinfo.buf) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to decode driver information") + + /* Reset driver info message */ + H5O_msg_reset(H5O_DRVINFO_ID, &drvinfo); + } /* end else */ + /* Close the extension. Bump the version number to avoid closing the * file (since this will be the only open object). */ @@ -539,15 +624,15 @@ H5F_read_superblock(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc) done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5F_read_superblock() */ +} /* end H5F_super_read() */ /*------------------------------------------------------------------------- - * Function: H5F_init_superblock + * Function: H5F_super_init * * Purpose: Allocates the superblock for the file and initializes - * information about the superblock in memory. Does not write - * any superblock information to the file. + * information about the superblock in memory. Writes extension + * messages if any are needed. * * Return: Success: SUCCEED * Failure: FAIL @@ -559,18 +644,19 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_init_superblock(H5F_t *f, H5O_loc_t *ext_loc, hid_t dxpl_id) +H5F_super_init(H5F_t *f, hid_t dxpl_id) { + H5P_genplist_t *plist; /* File creation property list */ hsize_t userblock_size; /* Size of userblock, in bytes */ size_t superblock_size; /* Size of superblock, in bytes */ size_t driver_size; /* Size of driver info block (bytes) */ + hsize_t alloc_size; /* Size to allocate on disk */ unsigned super_vers; /* Superblock version */ haddr_t super_addr; /* Address of superblock */ - H5P_genplist_t *plist; /* File creation property list */ hbool_t need_ext; /* Whether the superblock extension is needed */ herr_t ret_value = SUCCEED; - FUNC_ENTER_NOAPI(H5F_init_superblock, FAIL) + FUNC_ENTER_NOAPI(H5F_super_init, FAIL) /* Get the shared file creation property list */ if(NULL == (plist = H5I_object(f->shared->fcpl_id))) @@ -614,8 +700,10 @@ H5F_init_superblock(H5F_t *f, H5O_loc_t *ext_loc, hid_t dxpl_id) * allocation request is required to return memory at format address zero. */ H5_CHECK_OVERFLOW(f->shared->base_addr, haddr_t, hsize_t); - super_addr = H5FD_alloc(f->shared->lf, H5FD_MEM_SUPER, dxpl_id, - ((hsize_t)f->shared->base_addr + superblock_size + driver_size)); + alloc_size = (hsize_t)f->shared->base_addr + superblock_size; + if(super_vers < HDF5_SUPERBLOCK_VERSION_2) + alloc_size += driver_size; + super_addr = H5FD_alloc(f->shared->lf, H5FD_MEM_SUPER, dxpl_id, alloc_size); if(HADDR_UNDEF == super_addr) HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to allocate file space for userblock and/or superblock") if(0 != super_addr) @@ -651,6 +739,8 @@ H5F_init_superblock(H5F_t *f, H5O_loc_t *ext_loc, hid_t dxpl_id) /* Create the superblock extension for "extra" superblock data, if necessary. */ if(need_ext) { + H5O_loc_t ext_loc; /* Superblock extension object location */ + /* The superblock extension isn't actually a group, but the * default group creation list should work fine. * If we don't supply a size for the object header, HDF5 will @@ -659,27 +749,73 @@ H5F_init_superblock(H5F_t *f, H5O_loc_t *ext_loc, hid_t dxpl_id) * be tuned if more information is added to the superblock * extension. */ - H5O_loc_reset(ext_loc); - if(H5O_create(f, dxpl_id, 0, H5P_GROUP_CREATE_DEFAULT, ext_loc) < 0) + H5O_loc_reset(&ext_loc); + if(H5O_create(f, dxpl_id, 0, H5P_GROUP_CREATE_DEFAULT, &ext_loc) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTCREATE, FAIL, "unable to create superblock extension") - /* Record this address */ - f->shared->extension_addr = ext_loc->addr; + /* Record the address of the superblock extension */ + f->shared->extension_addr = ext_loc.addr; + + /* Create the Shared Object Header Message table and register it with + * the metadata cache, if this file supports shared messages. + */ + if(f->shared->sohm_nindexes > 0) { + /* Initialize the shared message code & write the SOHM message to the extension */ + if(H5SM_init(f, plist, &ext_loc, dxpl_id) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to create SOHM table") + } /* end if */ + + /* Check for non-default v1 B-tree 'K' values to store */ + if(f->shared->btree_k[H5B_SNODE_ID] != HDF5_BTREE_SNODE_IK_DEF || + f->shared->btree_k[H5B_ISTORE_ID] != HDF5_BTREE_ISTORE_IK_DEF || + f->shared->sym_leaf_k != H5F_CRT_SYM_LEAF_DEF) { + H5O_btreek_t btreek; /* v1 B-tree 'K' value message for superblock extension */ + + /* Write v1 B-tree 'K' value information to the superblock extension */ + btreek.btree_k[H5B_ISTORE_ID] = f->shared->btree_k[H5B_ISTORE_ID]; + btreek.btree_k[H5B_SNODE_ID] = f->shared->btree_k[H5B_SNODE_ID]; + btreek.sym_leaf_k = f->shared->sym_leaf_k; + if(H5O_msg_create(&ext_loc, H5O_BTREEK_ID, H5O_MSG_FLAG_CONSTANT | H5O_MSG_FLAG_DONTSHARE, H5O_UPDATE_TIME, &btreek, dxpl_id) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to update v1 B-tree 'K' value header message") + } /* end if */ + + /* Check for driver info to store */ + if(driver_size > 0) { + H5O_drvinfo_t drvinfo; /* Driver info */ + uint8_t dbuf[H5F_MAX_DRVINFOBLOCK_SIZE]; /* Driver info block encoding buffer */ + + /* Sanity check */ + HDassert(driver_size <= H5F_MAX_DRVINFOBLOCK_SIZE); + + /* Encode driver-specific data */ + if(H5FD_sb_encode(f->shared->lf, drvinfo.name, dbuf) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to encode driver information") + + /* Write driver info information to the superblock extension */ + drvinfo.len = driver_size; + drvinfo.buf = dbuf; + if(H5O_msg_create(&ext_loc, H5O_DRVINFO_ID, H5O_MSG_FLAG_CONSTANT | H5O_MSG_FLAG_DONTSHARE, H5O_UPDATE_TIME, &drvinfo, dxpl_id) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to update driver info header message") + } /* end if */ + + /* Twiddle the number of open objects to avoid closing the file + * (since this will be the only open object currently). + */ + f->nopen_objs++; + if(H5O_close(&ext_loc) < 0) + HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "unable to close superblock extension") + f->nopen_objs--; } /* end if */ done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5F_init_superblock() */ +} /* end H5F_super_init() */ /*------------------------------------------------------------------------- - * Function: H5F_write_superblock + * Function: H5F_super_write * - * Purpose: Writes (and optionally allocates) the superblock for the file. - * If BUF is non-NULL, then write the serialized superblock - * information into it. It should be a buffer of size - * H5F_SUPERBLOCK_SIZE + H5F_DRVINFOBLOCK_SIZE - * or larger. + * Purpose: Writes the superblock for the file. * * Return: Success: SUCCEED * Failure: FAIL @@ -691,18 +827,17 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_write_superblock(H5F_t *f, hid_t dxpl_id) +H5F_super_write(H5F_t *f, hid_t dxpl_id) { + H5P_genplist_t *plist; /* File creation property list */ uint8_t buf[H5F_MAX_SUPERBLOCK_SIZE + H5F_MAX_DRVINFOBLOCK_SIZE]; /* Superblock & driver info blockencoding buffer */ - uint8_t *p = NULL; /* Ptr into encoding buffers */ - uint32_t chksum = 0; /* Checksum temporary variable */ - size_t superblock_size; /* Size of superblock, in bytes */ + uint8_t *p; /* Ptr into encoding buffer */ + size_t superblock_size; /* Size of superblock, in bytes */ size_t driver_size; /* Size of driver info block (bytes)*/ unsigned super_vers; /* Superblock version */ - H5P_genplist_t *plist; /* Property list */ herr_t ret_value = SUCCEED; - FUNC_ENTER_NOAPI(H5F_write_superblock, FAIL) + FUNC_ENTER_NOAPI(H5F_super_write, FAIL) /* Get the shared file creation property list */ if(NULL == (plist = H5I_object(f->shared->fcpl_id))) @@ -712,84 +847,108 @@ H5F_write_superblock(H5F_t *f, hid_t dxpl_id) if(H5P_get(plist, H5F_CRT_SUPER_VERS_NAME, &super_vers) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get superblock version") - /* Encode the file superblock */ + /* Encode the common portion of the file superblock for all versions */ p = buf; HDmemcpy(p, H5F_SIGNATURE, (size_t)H5F_SIGNATURE_LEN); p += H5F_SIGNATURE_LEN; *p++ = (uint8_t)super_vers; - *p++ = (uint8_t)HDF5_FREESPACE_VERSION; - *p++ = (uint8_t)HDF5_OBJECTDIR_VERSION; - *p++ = 0; /* reserved*/ - *p++ = (uint8_t)HDF5_SHAREDHEADER_VERSION; - HDassert(H5F_SIZEOF_ADDR(f) <= 255); - *p++ = (uint8_t)H5F_SIZEOF_ADDR(f); - HDassert(H5F_SIZEOF_SIZE(f) <= 255); - *p++ = (uint8_t)H5F_SIZEOF_SIZE(f); - *p++ = 0; /* reserved */ + /* Check for older version of superblock format */ + if(super_vers < HDF5_SUPERBLOCK_VERSION_2) { + uint32_t consist_flags; /* File Consistency Flags */ - UINT16ENCODE(p, f->shared->sym_leaf_k); - UINT16ENCODE(p, f->shared->btree_k[H5B_SNODE_ID]); - UINT32ENCODE(p, f->shared->consist_flags); + *p++ = (uint8_t)HDF5_FREESPACE_VERSION; /* (hard-wired) */ + *p++ = (uint8_t)HDF5_OBJECTDIR_VERSION; /* (hard-wired) */ + *p++ = 0; /* reserved*/ - /* - * Versions of the superblock >0 have the indexed storage B-tree - * internal 'K' value stored - */ - if(super_vers > HDF5_SUPERBLOCK_VERSION_DEF) { - UINT16ENCODE(p, f->shared->btree_k[H5B_ISTORE_ID]); - if(super_vers < HDF5_SUPERBLOCK_VERSION_2) { + *p++ = (uint8_t)HDF5_SHAREDHEADER_VERSION; /* (hard-wired) */ + HDassert(H5F_SIZEOF_ADDR(f) <= 255); + *p++ = (uint8_t)H5F_SIZEOF_ADDR(f); + HDassert(H5F_SIZEOF_SIZE(f) <= 255); + *p++ = (uint8_t)H5F_SIZEOF_SIZE(f); + *p++ = 0; /* reserved */ + + UINT16ENCODE(p, f->shared->sym_leaf_k); + UINT16ENCODE(p, f->shared->btree_k[H5B_SNODE_ID]); + consist_flags = f->shared->consist_flags; + UINT32ENCODE(p, consist_flags); + + /* + * Versions of the superblock >0 have the indexed storage B-tree + * internal 'K' value stored + */ + if(super_vers > HDF5_SUPERBLOCK_VERSION_DEF) { + UINT16ENCODE(p, f->shared->btree_k[H5B_ISTORE_ID]); *p++ = 0; /*reserved */ *p++ = 0; /*reserved */ } /* end if */ - } /* end if */ - - H5F_addr_encode(f, &p, f->shared->base_addr); - H5F_addr_encode(f, &p, f->shared->extension_addr); - H5F_addr_encode(f, &p, H5FD_get_eoa(f->shared->lf, H5FD_MEM_SUPER)); - H5F_addr_encode(f, &p, f->shared->driver_addr); - if(H5G_obj_ent_encode(f, &p, H5G_oloc(f->shared->root_grp)) < 0) - HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to encode root group information") - /* Compute [possibly partial] superblock checksum */ - if(super_vers >= HDF5_SUPERBLOCK_VERSION_2) + H5F_addr_encode(f, &p, f->shared->base_addr); + H5F_addr_encode(f, &p, f->shared->extension_addr); + H5F_addr_encode(f, &p, H5FD_get_eoa(f->shared->lf, H5FD_MEM_SUPER)); + H5F_addr_encode(f, &p, f->shared->driver_addr); + if(H5G_obj_ent_encode(f, &p, H5G_oloc(f->shared->root_grp)) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to encode root group information") + + /* Encode the driver information block. */ + H5_ASSIGN_OVERFLOW(driver_size, H5FD_sb_size(f->shared->lf), hsize_t, size_t); + if(driver_size > 0) { + char driver_name[9]; /* Name of driver, for driver info block */ + uint8_t *dbuf = p; /* Pointer to beginning of driver info */ + + /* Encode the driver information block */ + *p++ = HDF5_DRIVERINFO_VERSION_0; /* Version */ + *p++ = 0; /* reserved */ + *p++ = 0; /* reserved */ + *p++ = 0; /* reserved */ + + /* Driver info size, excluding header */ + UINT32ENCODE(p, driver_size); + + /* Encode driver-specific data */ + if(H5FD_sb_encode(f->shared->lf, driver_name, dbuf + H5F_DRVINFOBLOCK_HDR_SIZE) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to encode driver information") + + /* Store driver name (set in 'H5FD_sb_encode' call above) */ + HDmemcpy(p, driver_name, (size_t)8); + + /* Advance buffer pointer past name & variable-sized portion of driver info */ + /* (for later use in computing the superblock size) */ + p += 8 + driver_size; + } /* end if */ + } /* end if */ + else { + uint32_t chksum; /* Checksum temporary variable */ + H5O_loc_t *root_oloc; /* Pointer to root group's object location */ + + /* Size of file addresses & offsets, and consistency flags */ + HDassert(H5F_SIZEOF_ADDR(f) <= 255); + *p++ = (uint8_t)H5F_SIZEOF_ADDR(f); + HDassert(H5F_SIZEOF_SIZE(f) <= 255); + *p++ = (uint8_t)H5F_SIZEOF_SIZE(f); + *p++ = f->shared->consist_flags; + + /* Base, superblock extension & end of file addresses */ + H5F_addr_encode(f, &p, f->shared->base_addr); + H5F_addr_encode(f, &p, f->shared->extension_addr); + H5F_addr_encode(f, &p, H5FD_get_eoa(f->shared->lf, H5FD_MEM_SUPER)); + + /* Retrieve information for root group */ + if(NULL == (root_oloc = H5G_oloc(f->shared->root_grp))) + HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to retrieve root group information") + + /* Encode address of root group's object header */ + H5F_addr_encode(f, &p, root_oloc->addr); + + /* Compute superblock checksum */ chksum = H5_checksum_metadata(buf, (H5F_SUPERBLOCK_SIZE(super_vers, f) - H5F_SIZEOF_CHKSUM), 0); - /* Encode the driver information block. */ - H5_ASSIGN_OVERFLOW(driver_size, H5FD_sb_size(f->shared->lf), hsize_t, size_t); - if(driver_size > 0) { - char driver_name[9]; /* Name of driver, for driver info block */ - uint8_t *dbuf = p; /* Pointer to beginning of driver info */ - - /* Encode the driver information block */ - *p++ = HDF5_DRIVERINFO_VERSION_0; /* Version */ - *p++ = 0; /* reserved */ - *p++ = 0; /* reserved */ - *p++ = 0; /* reserved */ - - /* Driver info size, excluding header */ - UINT32ENCODE(p, driver_size); - - /* Encode driver-specific data */ - if(H5FD_sb_encode(f->shared->lf, driver_name, dbuf + H5F_DRVINFOBLOCK_HDR_SIZE) < 0) - HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to encode driver information") + /* Superblock checksum */ + UINT32ENCODE(p, chksum); - /* Store driver name (set in 'H5FD_sb_encode' call above) */ - HDmemcpy(dbuf + 8, driver_name, (size_t)8); - - /* Advance buffer pointer past name & variable-sized portion of driver info */ - /* (for later use in storing the checksum) */ - p += 8 + driver_size; - - /* Update superblock checksum with driver info block checksum */ - /* (on superblock versions > 1) */ - if(super_vers >= HDF5_SUPERBLOCK_VERSION_2) - chksum = H5_checksum_metadata(dbuf, driver_size + H5F_DRVINFOBLOCK_HDR_SIZE, chksum); - } /* end if */ - - /* Encode the checksum on the superblock (for versions > 1) */ - if(super_vers >= HDF5_SUPERBLOCK_VERSION_2) - UINT32ENCODE(p, chksum); + /* Sanity check */ + HDassert((size_t)(p - buf) == H5F_SUPERBLOCK_SIZE(super_vers, f)); + } /* end else */ /* Retrieve the total size of the superblock info */ H5_ASSIGN_OVERFLOW(superblock_size, (p - buf), int, size_t); @@ -803,5 +962,5 @@ H5F_write_superblock(H5F_t *f, hid_t dxpl_id) done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5F_write_superblock() */ +} /* end H5F_super_write() */ diff --git a/src/H5O.c b/src/H5O.c index 0701f39..7b0584f 100644 --- a/src/H5O.c +++ b/src/H5O.c @@ -97,11 +97,12 @@ const H5O_msg_class_t *const H5O_msg_class_g[] = { H5O_MSG_ATTR, /*0x000C Attribute list */ H5O_MSG_NAME, /*0x000D Object name */ H5O_MSG_MTIME, /*0x000E Object modification date and time */ - NULL, /*0x000F UNUSED (used to be "Shared" */ + H5O_MSG_SHMESG, /*0x000F File-wide shared message table */ H5O_MSG_CONT, /*0x0010 Object header continuation */ H5O_MSG_STAB, /*0x0011 Symbol table */ H5O_MSG_MTIME_NEW, /*0x0012 New Object modification date and time */ - H5O_MSG_SHMESG, /*0x0013 File-wide shared message table */ + H5O_MSG_BTREEK, /*0x0013 Non-default v1 B-tree 'K' values */ + H5O_MSG_DRVINFO, /*0x0014 Driver info settings */ }; /* Header object ID to class mapping */ diff --git a/src/H5Obtreek.c b/src/H5Obtreek.c new file mode 100644 index 0000000..cab323d --- /dev/null +++ b/src/H5Obtreek.c @@ -0,0 +1,257 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * 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://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + +/* Programmer: Quincey Koziol + * Thursday, March 1, 2007 + * + * Purpose: A message holding non-default v1 B-tree 'K' value + * information in the superblock extension. + */ + +#define H5O_PACKAGE /*suppress error about including H5Opkg */ + +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Opkg.h" /* Object headers */ +#include "H5MMprivate.h" /* Memory management */ + +static void *H5O_btreek_decode(H5F_t *f, hid_t dxpl_id, unsigned mesg_flags, const uint8_t *p); +static herr_t H5O_btreek_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg); +static void *H5O_btreek_copy(const void *_mesg, void *_dest); +static size_t H5O_btreek_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg); +static herr_t H5O_btreek_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE *stream, + int indent, int fwidth); + +/* This message derives from H5O message class */ +const H5O_msg_class_t H5O_MSG_BTREEK[1] = {{ + H5O_BTREEK_ID, /*message id number */ + "v1 B-tree 'K' values", /*message name for debugging */ + sizeof(H5O_btreek_t), /*native message size */ + FALSE, /* messages are sharable? */ + H5O_btreek_decode, /*decode message */ + H5O_btreek_encode, /*encode message */ + H5O_btreek_copy, /*copy the native value */ + H5O_btreek_size, /*raw message size */ + NULL, /*free internal memory */ + NULL, /* free method */ + NULL, /* file delete method */ + NULL, /* link method */ + NULL, /* set share method */ + NULL, /*can share method */ + NULL, /* pre copy native value to file */ + NULL, /* copy native value to file */ + NULL, /* post copy native value to file */ + NULL, /* get creation index */ + NULL, /* set creation index */ + H5O_btreek_debug /*debug the message */ +}}; + +/* Current version of v1 B-tree 'K' value information */ +#define H5O_BTREEK_VERSION 0 + + +/*------------------------------------------------------------------------- + * Function: H5O_btreek_decode + * + * Purpose: Decode a shared message table message and return a pointer + * to a newly allocated H5O_btreek_t struct. + * + * Return: Success: Ptr to new message in native struct. + * Failure: NULL + * + * Programmer: Quincey Koziol + * Mar 1, 2007 + * + *------------------------------------------------------------------------- + */ +static void * +H5O_btreek_decode(H5F_t *f, hid_t UNUSED dxpl_id, unsigned UNUSED mesg_flags, + const uint8_t *p) +{ + H5O_btreek_t *mesg; /* Native message */ + void *ret_value; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5O_btreek_decode) + + /* Sanity check */ + HDassert(f); + HDassert(p); + + /* Version of message */ + if(*p++ != H5O_BTREEK_VERSION) + HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for message") + + /* Allocate space for message */ + if(NULL == (mesg = H5MM_calloc(sizeof(H5O_btreek_t)))) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for v1 B-tree 'K' message") + + /* Retrieve non-default B-tree 'K' values */ + UINT16DECODE(p, mesg->btree_k[H5B_ISTORE_ID]); + UINT16DECODE(p, mesg->btree_k[H5B_SNODE_ID]); + UINT16DECODE(p, mesg->sym_leaf_k); + + /* Set return value */ + ret_value = (void *)mesg; + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5O_btreek_decode() */ + + +/*------------------------------------------------------------------------- + * Function: H5O_btreek_encode + * + * Purpose: Encode a v1 B-tree 'K' value message. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * Mar 1, 2007 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5O_btreek_encode(H5F_t *f, hbool_t UNUSED disable_shared, uint8_t *p, const void *_mesg) +{ + const H5O_btreek_t *mesg = (const H5O_btreek_t *)_mesg; + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_btreek_encode) + + /* Sanity check */ + HDassert(f); + HDassert(p); + HDassert(mesg); + + /* Store version and non-default v1 B-tree 'K' values */ + *p++ = H5O_BTREEK_VERSION; + UINT16ENCODE(p, mesg->btree_k[H5B_ISTORE_ID]); + UINT16ENCODE(p, mesg->btree_k[H5B_SNODE_ID]); + UINT16ENCODE(p, mesg->sym_leaf_k); + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5O_btreek_encode() */ + + +/*------------------------------------------------------------------------- + * Function: H5O_btreek_copy + * + * Purpose: Copies a message from _MESG to _DEST, allocating _DEST if + * necessary. + * + * Return: Success: Ptr to _DEST + * Failure: NULL + * + * Programmer: Quincey Koziol + * Mar 1, 2007 + * + *------------------------------------------------------------------------- + */ +static void * +H5O_btreek_copy(const void *_mesg, void *_dest) +{ + const H5O_btreek_t *mesg = (const H5O_btreek_t *)_mesg; + H5O_btreek_t *dest = (H5O_btreek_t *)_dest; + void *ret_value; + + FUNC_ENTER_NOAPI_NOINIT(H5O_btreek_copy) + + /* Sanity check */ + HDassert(mesg); + + if(!dest && NULL == (dest = H5MM_malloc(sizeof(H5O_btreek_t)))) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for shared message table message") + + /* All this message requires is a shallow copy */ + *dest = *mesg; + + /* Set return value */ + ret_value = dest; + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5O_btreek_copy() */ + + +/*------------------------------------------------------------------------- + * Function: H5O_btreek_size + * + * Purpose: Returns the size of the raw message in bytes not counting the + * message type or size fields, but only the data fields. + * + * Return: Success: Message data size in bytes w/o alignment. + * Failure: 0 + * + * Programmer: Quincey Koziol + * Mar 1, 2007 + * + *------------------------------------------------------------------------- + */ +static size_t +H5O_btreek_size(const H5F_t *f, hbool_t UNUSED disable_shared, const void UNUSED *_mesg) +{ + size_t ret_value; + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_btreek_size) + + /* Sanity check */ + HDassert(f); + + ret_value = 1 + /* Version number */ + 2 + /* Indexed storage internal B-tree 'K' value */ + 2 + /* Symbol table node internal B-tree 'K' value */ + 2; /* Symbol table node leaf 'K' value */ + + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5O_btreek_size() */ + + +/*------------------------------------------------------------------------- + * Function: H5O_btreek_debug + * + * Purpose: Prints debugging info for the message. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * Mar 1, 2007 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5O_btreek_debug(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, const void *_mesg, FILE *stream, + int indent, int fwidth) +{ + const H5O_btreek_t *mesg = (const H5O_btreek_t *)_mesg; + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_btreek_debug) + + /* Sanity check */ + HDassert(f); + HDassert(mesg); + HDassert(stream); + HDassert(indent >= 0); + HDassert(fwidth >= 0); + + HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, + "Indexed storage internal B-tree 'K' value:", mesg->btree_k[H5B_ISTORE_ID]); + HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, + "Symbol table node internal B-tree 'K' value:", mesg->btree_k[H5B_SNODE_ID]); + HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, + "Symbol table node leaf 'K' value:", mesg->sym_leaf_k); + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5O_btreek_debug() */ + diff --git a/src/H5Odrvinfo.c b/src/H5Odrvinfo.c new file mode 100644 index 0000000..7e43d82 --- /dev/null +++ b/src/H5Odrvinfo.c @@ -0,0 +1,313 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * 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://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + +/* Programmer: Quincey Koziol + * Thursday, March 1, 2007 + * + * Purpose: A message holding driver info settings + * in the superblock extension. + */ + +#define H5O_PACKAGE /*suppress error about including H5Opkg */ + +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Opkg.h" /* Object headers */ +#include "H5MMprivate.h" /* Memory management */ + +static void *H5O_drvinfo_decode(H5F_t *f, hid_t dxpl_id, unsigned mesg_flags, const uint8_t *p); +static herr_t H5O_drvinfo_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg); +static void *H5O_drvinfo_copy(const void *_mesg, void *_dest); +static size_t H5O_drvinfo_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg); +static herr_t H5O_drvinfo_reset(void *_mesg); +static herr_t H5O_drvinfo_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE *stream, + int indent, int fwidth); + +/* This message derives from H5O message class */ +const H5O_msg_class_t H5O_MSG_DRVINFO[1] = {{ + H5O_DRVINFO_ID, /*message id number */ + "driver info", /*message name for debugging */ + sizeof(H5O_drvinfo_t), /*native message size */ + FALSE, /* messages are sharable? */ + H5O_drvinfo_decode, /*decode message */ + H5O_drvinfo_encode, /*encode message */ + H5O_drvinfo_copy, /*copy the native value */ + H5O_drvinfo_size, /*raw message size */ + H5O_drvinfo_reset, /*free internal memory */ + NULL, /* free method */ + NULL, /* file delete method */ + NULL, /* link method */ + NULL, /* set share method */ + NULL, /*can share method */ + NULL, /* pre copy native value to file */ + NULL, /* copy native value to file */ + NULL, /* post copy native value to file */ + NULL, /* get creation index */ + NULL, /* set creation index */ + H5O_drvinfo_debug /*debug the message */ +}}; + +/* Current version of driver info information */ +#define H5O_DRVINFO_VERSION 0 + + +/*------------------------------------------------------------------------- + * Function: H5O_drvinfo_decode + * + * Purpose: Decode a shared message table message and return a pointer + * to a newly allocated H5O_drvinfo_t struct. + * + * Return: Success: Ptr to new message in native struct. + * Failure: NULL + * + * Programmer: Quincey Koziol + * Mar 1, 2007 + * + *------------------------------------------------------------------------- + */ +static void * +H5O_drvinfo_decode(H5F_t *f, hid_t UNUSED dxpl_id, unsigned UNUSED mesg_flags, + const uint8_t *p) +{ + H5O_drvinfo_t *mesg; /* Native message */ + void *ret_value; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5O_drvinfo_decode) + + /* Sanity check */ + HDassert(f); + HDassert(p); + + /* Version of message */ + if(*p++ != H5O_DRVINFO_VERSION) + HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for message") + + /* Allocate space for message */ + if(NULL == (mesg = H5MM_calloc(sizeof(H5O_drvinfo_t)))) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for driver info message") + + /* Retrieve driver name */ + HDmemcpy(mesg->name, p, 8); + mesg->name[8] = '\0'; + p += 8; + + /* Decode buffer size */ + UINT16DECODE(p, mesg->len); + HDassert(mesg->len); + + /* Allocate space for buffer */ + if(NULL == (mesg->buf = H5MM_malloc(mesg->len))) { + mesg = H5MM_xfree(mesg); + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for driver info buffer") + } /* end if */ + + /* Copy encoded driver info into buffer */ + HDmemcpy(mesg->buf, p, mesg->len); + + /* Set return value */ + ret_value = (void *)mesg; + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5O_drvinfo_decode() */ + + +/*------------------------------------------------------------------------- + * Function: H5O_drvinfo_encode + * + * Purpose: Encode a v1 B-tree 'K' value message. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * Mar 1, 2007 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5O_drvinfo_encode(H5F_t *f, hbool_t UNUSED disable_shared, uint8_t *p, const void *_mesg) +{ + const H5O_drvinfo_t *mesg = (const H5O_drvinfo_t *)_mesg; + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_drvinfo_encode) + + /* Sanity check */ + HDassert(f); + HDassert(p); + HDassert(mesg); + + /* Store version, driver name, buffer length, & encoded buffer */ + *p++ = H5O_DRVINFO_VERSION; + HDmemcpy(p, mesg->name, 8); + p += 8; + HDassert(mesg->len <= 65535); + UINT16ENCODE(p, mesg->len); + HDmemcpy(p, mesg->buf, mesg->len); + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5O_drvinfo_encode() */ + + +/*------------------------------------------------------------------------- + * Function: H5O_drvinfo_copy + * + * Purpose: Copies a message from _MESG to _DEST, allocating _DEST if + * necessary. + * + * Return: Success: Ptr to _DEST + * Failure: NULL + * + * Programmer: Quincey Koziol + * Mar 1, 2007 + * + *------------------------------------------------------------------------- + */ +static void * +H5O_drvinfo_copy(const void *_mesg, void *_dest) +{ + const H5O_drvinfo_t *mesg = (const H5O_drvinfo_t *)_mesg; + H5O_drvinfo_t *dest = (H5O_drvinfo_t *)_dest; + void *ret_value; + + FUNC_ENTER_NOAPI_NOINIT(H5O_drvinfo_copy) + + /* Sanity check */ + HDassert(mesg); + + if(!dest && NULL == (dest = H5MM_malloc(sizeof(H5O_drvinfo_t)))) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for shared message table message") + + /* Shallow copy the fields */ + *dest = *mesg; + + /* Copy the buffer */ + if(NULL == (dest->buf = H5MM_malloc(mesg->len))) { + if(dest != _dest) + dest = H5MM_xfree(dest); + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") + } /* end if */ + HDmemcpy(dest->buf, mesg->buf, mesg->len); + + /* Set return value */ + ret_value = dest; + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5O_drvinfo_copy() */ + + +/*------------------------------------------------------------------------- + * Function: H5O_drvinfo_size + * + * Purpose: Returns the size of the raw message in bytes not counting the + * message type or size fields, but only the data fields. + * + * Return: Success: Message data size in bytes w/o alignment. + * Failure: 0 + * + * Programmer: Quincey Koziol + * Mar 1, 2007 + * + *------------------------------------------------------------------------- + */ +static size_t +H5O_drvinfo_size(const H5F_t *f, hbool_t UNUSED disable_shared, const void *_mesg) +{ + const H5O_drvinfo_t *mesg = (const H5O_drvinfo_t *)_mesg; + size_t ret_value; + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_drvinfo_size) + + /* Sanity check */ + HDassert(f); + HDassert(mesg); + + ret_value = 1 + /* Version number */ + 8 + /* Driver name */ + 2 + /* Buffer length */ + mesg->len; /* Buffer */ + + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5O_drvinfo_size() */ + + +/*------------------------------------------------------------------------- + * Function: H5O_drvinfo_reset + * + * Purpose: Frees internal pointers and resets the message to an + * initial state. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * koziol@hdfgroup.org + * Mar 1 2007 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5O_drvinfo_reset(void *_mesg) +{ + H5O_drvinfo_t *mesg = (H5O_drvinfo_t *) _mesg; + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_drvinfo_reset) + + /* check args */ + HDassert(mesg); + + /* reset */ + mesg->buf = H5MM_xfree(mesg->buf); + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5O_drvinfo_reset() */ + + +/*------------------------------------------------------------------------- + * Function: H5O_drvinfo_debug + * + * Purpose: Prints debugging info for the message. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * Mar 1, 2007 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5O_drvinfo_debug(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, const void *_mesg, FILE *stream, + int indent, int fwidth) +{ + const H5O_drvinfo_t *mesg = (const H5O_drvinfo_t *)_mesg; + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_drvinfo_debug) + + /* Sanity check */ + HDassert(f); + HDassert(mesg); + HDassert(stream); + HDassert(indent >= 0); + HDassert(fwidth >= 0); + + HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth, + "Driver name:", mesg->name); + HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth, + "Buffer size:", mesg->len); + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5O_drvinfo_debug() */ + + diff --git a/src/H5Oginfo.c b/src/H5Oginfo.c index 4867337..d5b2ed4 100644 --- a/src/H5Oginfo.c +++ b/src/H5Oginfo.c @@ -66,7 +66,7 @@ const H5O_msg_class_t H5O_MSG_GINFO[1] = {{ }}; /* Current version of group info information */ -#define H5O_GINFO_VERSION 1 +#define H5O_GINFO_VERSION 0 /* Flags for group info flag encoding */ #define H5O_GINFO_FLAG_TRACK_NAME 0x01 diff --git a/src/H5Olinfo.c b/src/H5Olinfo.c index a64c501..6184d07 100644 --- a/src/H5Olinfo.c +++ b/src/H5Olinfo.c @@ -74,7 +74,7 @@ const H5O_msg_class_t H5O_MSG_LINFO[1] = {{ }}; /* Current version of link info information */ -#define H5O_LINFO_VERSION 1 +#define H5O_LINFO_VERSION 0 /* Flags for link info index flag encoding */ #define H5O_LINFO_INDEX_NAME 0x01 diff --git a/src/H5Omessage.c b/src/H5Omessage.c index b4413db..cccf8b8 100644 --- a/src/H5Omessage.c +++ b/src/H5Omessage.c @@ -1404,7 +1404,6 @@ H5O_msg_can_share(unsigned type_id, const void *mesg) /* Check args */ HDassert(type_id < NELMTS(H5O_msg_class_g)); - HDassert(type_id != H5O_SHARED_ID); type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */ HDassert(type); HDassert(mesg); @@ -1451,7 +1450,6 @@ H5O_msg_is_shared(unsigned type_id, const void *mesg) /* Check args */ HDassert(type_id < NELMTS(H5O_msg_class_g)); - HDassert(type_id != H5O_SHARED_ID); type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */ HDassert(type); HDassert(mesg); @@ -1491,7 +1489,6 @@ H5O_msg_set_share(unsigned type_id, H5O_shared_t *share, void *mesg) /* Check args */ HDassert(share); HDassert(type_id < NELMTS(H5O_msg_class_g)); - HDassert(type_id != H5O_SHARED_ID); type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */ HDassert(type); HDassert(type->set_share); @@ -1534,7 +1531,6 @@ H5O_msg_reset_share(unsigned type_id, void *mesg) /* Check args */ HDassert(type_id < NELMTS(H5O_msg_class_g)); - HDassert(type_id != H5O_SHARED_ID); type = H5O_msg_class_g[type_id]; /* map the type ID to the actual type object */ HDassert(type); HDassert(type->set_share); diff --git a/src/H5Opkg.h b/src/H5Opkg.h index 72d9c46..6ed310e 100644 --- a/src/H5Opkg.h +++ b/src/H5Opkg.h @@ -31,7 +31,7 @@ #define H5O_NMESGS 8 /*initial number of messages */ #define H5O_NCHUNKS 2 /*initial number of chunks */ #define H5O_MIN_SIZE 32 /*min obj header data size */ -#define H5O_MSG_TYPES 20 /* # of types of messages */ +#define H5O_MSG_TYPES 21 /* # of types of messages */ #define H5O_MAX_CRT_ORDER_IDX 65535 /* Max. creation order index value */ /* Versions of object header structure */ @@ -390,13 +390,11 @@ H5_DLLVAR const H5O_msg_class_t H5O_MSG_NAME[1]; */ H5_DLLVAR const H5O_msg_class_t H5O_MSG_MTIME[1]; -/* Shared Object Message. (0x000f) */ -/* - * This message ID never really appears in an object - * header. Instead, bit 2 of the `Flags' field will be set and the ID field - * will be the ID of the pointed-to message. +/* Shared Message information message (0x000f) + * A message for the superblock extension, holding information about + * the file-wide shared message "SOHM" table */ -H5_DLLVAR const H5O_msg_class_t H5O_MSG_SHARED[1]; +H5_DLLVAR const H5O_msg_class_t H5O_MSG_SHMESG[1]; /* Object Header Continuation Message. (0x0010) */ H5_DLLVAR const H5O_msg_class_t H5O_MSG_CONT[1]; @@ -410,11 +408,17 @@ H5_DLLVAR const H5O_msg_class_t H5O_MSG_STAB[1]; */ H5_DLLVAR const H5O_msg_class_t H5O_MSG_MTIME_NEW[1]; -/* Shared Message information message (0x000a) +/* v1 B-tree 'K' value message (0x0013) * A message for the superblock extension, holding information about - * the file-wide shared message "SOHM" table + * the file-wide v1 B-tree 'K' values. */ -H5_DLLVAR const H5O_msg_class_t H5O_MSG_SHMESG[1]; +H5_DLLVAR const H5O_msg_class_t H5O_MSG_BTREEK[1]; + +/* Driver info message (0x0014) + * A message for the superblock extension, holding information about + * the file driver settings + */ +H5_DLLVAR const H5O_msg_class_t H5O_MSG_DRVINFO[1]; /* diff --git a/src/H5Oprivate.h b/src/H5Oprivate.h index 88c2a33..0438101 100644 --- a/src/H5Oprivate.h +++ b/src/H5Oprivate.h @@ -128,11 +128,12 @@ typedef struct H5O_copy_t { #define H5O_ATTR_ID 0x000c /* Attribute Message. */ #define H5O_NAME_ID 0x000d /* Object name message. */ #define H5O_MTIME_ID 0x000e /* Modification time message. (Old) */ -#define H5O_SHARED_ID 0x000f /* Shared object message. */ +#define H5O_SHMESG_ID 0x000f /* Shared message "SOHM" table. */ #define H5O_CONT_ID 0x0010 /* Object header continuation message. */ #define H5O_STAB_ID 0x0011 /* Symbol table message. */ #define H5O_MTIME_NEW_ID 0x0012 /* Modification time message. (New) */ -#define H5O_SHMESG_ID 0x0013 /* Shared message "SOHM" table. */ +#define H5O_BTREEK_ID 0x0013 /* v1 B-tree 'K' values message. */ +#define H5O_DRVINFO_ID 0x0014 /* Driver info message. */ /* Shared object message flags. @@ -147,7 +148,7 @@ typedef struct H5O_copy_t { #define H5O_IS_SHARED(F) (((F) & (H5O_SHARED_IN_HEAP_FLAG | H5O_COMMITTED_FLAG)) ? TRUE : FALSE) /* - * Shared object message. + * Shared object header message info. * This needs to go first because other messages can be shared and * include a H5O_shared_t struct * The oloc shouldn't ever be holding open a file; if it ever is (if @@ -384,6 +385,29 @@ typedef struct H5O_shmesg_table_t { unsigned nindexes; /*number of indexes in the table */ } H5O_shmesg_table_t; +/* + * v1 B-tree 'K' value message + * Information about file-wide non-default v1 B-tree 'K' values, stored in + * superblock extension + * (Data structure in memory) + */ +typedef struct H5O_btreek_t { + unsigned btree_k[H5B_NUM_BTREE_ID]; /* B-tree internal node 'K' values */ + unsigned sym_leaf_k; /* Symbol table leaf node's 'K' value */ +} H5O_btreek_t; + +/* + * Driver info message + * Information about driver info, stored in superblock extension + * (Data structure in memory) + */ +typedef struct H5O_drvinfo_t { + char name[9]; /* Driver name */ + size_t len; /* Length of encoded buffer */ + uint8_t *buf; /* Buffer for encoded info */ +} H5O_drvinfo_t; + + /* Typedef for iteration operations */ typedef herr_t (*H5O_operator_t)(const void *mesg/*in*/, unsigned idx, void *operator_data/*in,out*/); diff --git a/src/H5Oshmesg.c b/src/H5Oshmesg.c index 05898a3..7ac5ed6 100644 --- a/src/H5Oshmesg.c +++ b/src/H5Oshmesg.c @@ -14,7 +14,7 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/* Programmer: James Laird +/* Programmer: James Laird * Monday, January 29, 2007 * * Purpose: A message holding "implicitly shared object header message" @@ -30,12 +30,12 @@ static void *H5O_shmesg_decode(H5F_t *f, hid_t dxpl_id, unsigned mesg_flags, const uint8_t *p); static herr_t H5O_shmesg_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg); -static void *H5O_shmesg_copy(const void *_mesg, void *_dest); +static void *H5O_shmesg_copy(const void *_mesg, void *_dest); static size_t H5O_shmesg_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg); static herr_t H5O_shmesg_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE *stream, int indent, int fwidth); -/* This message derives from H5O message class, for old fill value before version 1.5 */ +/* This message derives from H5O message class */ const H5O_msg_class_t H5O_MSG_SHMESG[1] = {{ H5O_SHMESG_ID, /*message id number */ "shared message table", /*message name for debugging */ @@ -78,11 +78,12 @@ static void * H5O_shmesg_decode(H5F_t *f, hid_t UNUSED dxpl_id, unsigned UNUSED mesg_flags, const uint8_t *p) { - H5O_shmesg_table_t *mesg = NULL; - void *ret_value = NULL; + H5O_shmesg_table_t *mesg; /* Native message */ + void *ret_value; /* Return value */ FUNC_ENTER_NOAPI_NOINIT(H5O_shmesg_decode) + /* Sanity check */ HDassert(f); HDassert(p); @@ -95,7 +96,7 @@ H5O_shmesg_decode(H5F_t *f, hid_t UNUSED dxpl_id, unsigned UNUSED mesg_flags, mesg->nindexes = *p++; /* Set return value */ - ret_value = (void*)mesg; + ret_value = (void *)mesg; done: FUNC_LEAVE_NOAPI(ret_value) @@ -105,8 +106,7 @@ done: /*------------------------------------------------------------------------- * Function: H5O_shmesg_encode * - * Purpose: Encode a shared message table message and return a pointer - * to a newly allocated H5O_shmesg_table_t struct. + * Purpose: Encode a shared message table message. * * Return: Non-negative on success/Negative on failure * @@ -122,6 +122,7 @@ H5O_shmesg_encode(H5F_t *f, hbool_t UNUSED disable_shared, uint8_t *p, const voi FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_shmesg_encode) + /* Sanity check */ HDassert(f); HDassert(p); HDassert(mesg); @@ -154,10 +155,11 @@ H5O_shmesg_copy(const void *_mesg, void *_dest) { const H5O_shmesg_table_t *mesg = (const H5O_shmesg_table_t *)_mesg; H5O_shmesg_table_t *dest = (H5O_shmesg_table_t *)_dest; - void *ret_value = NULL; + void *ret_value; FUNC_ENTER_NOAPI_NOINIT(H5O_shmesg_copy) + /* Sanity check */ HDassert(mesg); if(!dest && NULL == (dest = H5MM_malloc(sizeof(H5O_shmesg_table_t)))) @@ -178,10 +180,7 @@ done: * Function: H5O_shmesg_size * * Purpose: Returns the size of the raw message in bytes not counting the - * message type or size fields, but only the data fields. This - * function doesn't take into account alignment. The new fill - * value message is fill value plus space allocation time and - * fill value writing time and whether fill value is defined. + * message type or size fields, but only the data fields. * * Return: Success: Message data size in bytes w/o alignment. * Failure: 0 @@ -192,15 +191,14 @@ done: *------------------------------------------------------------------------- */ static size_t -H5O_shmesg_size(const H5F_t *f, hbool_t UNUSED disable_shared, const void *_mesg) +H5O_shmesg_size(const H5F_t *f, hbool_t UNUSED disable_shared, const void UNUSED *_mesg) { - const H5O_shmesg_table_t *mesg = (const H5O_shmesg_table_t *)_mesg; size_t ret_value; FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_shmesg_size) + /* Sanity check */ HDassert(f); - HDassert(mesg); ret_value = 1 + /* Version number */ H5F_SIZEOF_ADDR(f) + /* Table address */ @@ -230,6 +228,7 @@ H5O_shmesg_debug(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, const void *_mesg, FILE FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_shmesg_debug) + /* Sanity check */ HDassert(f); HDassert(mesg); HDassert(stream); diff --git a/src/Makefile.am b/src/Makefile.am index 2e2eda4..9120544 100755 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -61,8 +61,9 @@ libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \ H5HFspace.c H5HFstat.c H5HFtest.c H5HFtiny.c \ H5HG.c H5HGdbg.c H5HL.c H5HLdbg.c H5HP.c H5I.c H5MF.c H5MM.c \ H5MP.c H5MPtest.c H5L.c H5Lexternal.c H5O.c H5Oalloc.c H5Oattr.c \ - H5Oattribute.c H5Obogus.c H5Ocache.c \ - H5Ocont.c H5Ocopy.c H5Odbg.c H5Odtype.c H5Oefl.c H5Ofill.c H5Oginfo.c \ + H5Oattribute.c H5Obogus.c H5Obtreek.c H5Ocache.c \ + H5Ocont.c H5Ocopy.c H5Odbg.c H5Odrvinfo.c H5Odtype.c H5Oefl.c \ + H5Ofill.c H5Oginfo.c \ H5Olayout.c \ H5Olinfo.c H5Olink.c H5Omessage.c H5Omtime.c \ H5Oname.c H5Onull.c H5Opline.c H5Osdspace.c H5Oshared.c H5Ostab.c \ diff --git a/src/Makefile.in b/src/Makefile.in index 5ed5705..d86d395 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -101,8 +101,8 @@ am_libhdf5_la_OBJECTS = H5.lo H5checksum.lo H5dbg.lo H5system.lo \ H5HFspace.lo H5HFstat.lo H5HFtest.lo H5HFtiny.lo H5HG.lo \ H5HGdbg.lo H5HL.lo H5HLdbg.lo H5HP.lo H5I.lo H5MF.lo H5MM.lo \ H5MP.lo H5MPtest.lo H5L.lo H5Lexternal.lo H5O.lo H5Oalloc.lo \ - H5Oattr.lo H5Oattribute.lo H5Obogus.lo H5Ocache.lo H5Ocont.lo \ - H5Ocopy.lo H5Odbg.lo H5Odtype.lo H5Oefl.lo H5Ofill.lo \ + H5Oattr.lo H5Oattribute.lo H5Obogus.lo H5Obtreek.lo H5Ocache.lo H5Ocont.lo \ + H5Ocopy.lo H5Odbg.lo H5Odrvinfo.lo H5Odtype.lo H5Oefl.lo H5Ofill.lo \ H5Oginfo.lo H5Olayout.lo H5Olinfo.lo H5Olink.lo H5Omessage.lo \ H5Omtime.lo H5Oname.lo H5Onull.lo H5Opline.lo H5Osdspace.lo \ H5Oshared.lo H5Ostab.lo H5Oshmesg.lo H5Otest.lo H5P.lo \ @@ -419,8 +419,8 @@ libhdf5_la_SOURCES = H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \ H5HFspace.c H5HFstat.c H5HFtest.c H5HFtiny.c \ H5HG.c H5HGdbg.c H5HL.c H5HLdbg.c H5HP.c H5I.c H5MF.c H5MM.c \ H5MP.c H5MPtest.c H5L.c H5Lexternal.c H5O.c H5Oalloc.c H5Oattr.c \ - H5Oattribute.c H5Obogus.c H5Ocache.c \ - H5Ocont.c H5Ocopy.c H5Odbg.c H5Odtype.c H5Oefl.c H5Ofill.c H5Oginfo.c \ + H5Oattribute.c H5Obogus.c H5Obtreek.c H5Ocache.c \ + H5Ocont.c H5Ocopy.c H5Odbg.c H5Odrvinfo.c H5Odtype.c H5Oefl.c H5Ofill.c H5Oginfo.c \ H5Olayout.c \ H5Olinfo.c H5Olink.c H5Omessage.c H5Omtime.c \ H5Oname.c H5Onull.c H5Opline.c H5Osdspace.c H5Oshared.c H5Ostab.c \ @@ -672,10 +672,12 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Oattr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Oattribute.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Obogus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Obtreek.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Ocache.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Ocont.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Ocopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Odbg.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Odrvinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Odtype.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Oefl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Ofill.Plo@am__quote@ diff --git a/test/be_extlink1.h5 b/test/be_extlink1.h5 index 0ef71fa..551d6bd 100644 Binary files a/test/be_extlink1.h5 and b/test/be_extlink1.h5 differ diff --git a/test/be_extlink2.h5 b/test/be_extlink2.h5 index 296fef0..ba60adc 100644 Binary files a/test/be_extlink2.h5 and b/test/be_extlink2.h5 differ diff --git a/test/le_extlink1.h5 b/test/le_extlink1.h5 index eea65d8..fd45585 100644 Binary files a/test/le_extlink1.h5 and b/test/le_extlink1.h5 differ diff --git a/test/le_extlink2.h5 b/test/le_extlink2.h5 index 296fef0..ba60adc 100644 Binary files a/test/le_extlink2.h5 and b/test/le_extlink2.h5 differ diff --git a/tools/testfiles/h5diff_types.h5 b/tools/testfiles/h5diff_types.h5 index 805ef5f..02a3913 100644 Binary files a/tools/testfiles/h5diff_types.h5 and b/tools/testfiles/h5diff_types.h5 differ diff --git a/tools/testfiles/h5mkgrp_nested_latest.ls b/tools/testfiles/h5mkgrp_nested_latest.ls index 0c956e4..60343a6 100644 --- a/tools/testfiles/h5mkgrp_nested_latest.ls +++ b/tools/testfiles/h5mkgrp_nested_latest.ls @@ -3,10 +3,10 @@ Expected output for 'h5ls ../testfiles/h5mkgrp_nested_latest.h5' ############################# Opened "../testfiles/h5mkgrp_nested_latest.h5" with sec2 driver. /one Group - Location: 1:618 + Location: 1:564 Links: 1 Modified: XXXX-XX-XX XX:XX:XX XXX /one/two Group - Location: 1:360 + Location: 1:306 Links: 1 Modified: XXXX-XX-XX XX:XX:XX XXX diff --git a/tools/testfiles/h5mkgrp_nested_mult_latest.ls b/tools/testfiles/h5mkgrp_nested_mult_latest.ls index 6774ad9..2844afa 100644 --- a/tools/testfiles/h5mkgrp_nested_mult_latest.ls +++ b/tools/testfiles/h5mkgrp_nested_mult_latest.ls @@ -3,18 +3,18 @@ Expected output for 'h5ls ../testfiles/h5mkgrp_nested_mult_latest.h5' ############################# Opened "../testfiles/h5mkgrp_nested_mult_latest.h5" with sec2 driver. /one Group - Location: 1:618 + Location: 1:564 Links: 1 Modified: XXXX-XX-XX XX:XX:XX XXX /one/two Group - Location: 1:360 + Location: 1:306 Links: 1 Modified: XXXX-XX-XX XX:XX:XX XXX /three Group - Location: 1:1134 + Location: 1:1080 Links: 1 Modified: XXXX-XX-XX XX:XX:XX XXX /three/four Group - Location: 1:876 + Location: 1:822 Links: 1 Modified: XXXX-XX-XX XX:XX:XX XXX diff --git a/tools/testfiles/h5mkgrp_several_latest.ls b/tools/testfiles/h5mkgrp_several_latest.ls index e4f830f..6d0b3cc 100644 --- a/tools/testfiles/h5mkgrp_several_latest.ls +++ b/tools/testfiles/h5mkgrp_several_latest.ls @@ -3,10 +3,10 @@ Expected output for 'h5ls ../testfiles/h5mkgrp_several_latest.h5' ############################# Opened "../testfiles/h5mkgrp_several_latest.h5" with sec2 driver. /one Group - Location: 1:360 + Location: 1:306 Links: 1 Modified: XXXX-XX-XX XX:XX:XX XXX /two Group - Location: 1:618 + Location: 1:564 Links: 1 Modified: XXXX-XX-XX XX:XX:XX XXX diff --git a/tools/testfiles/h5mkgrp_single_latest.ls b/tools/testfiles/h5mkgrp_single_latest.ls index 8c86394..27d5686 100644 --- a/tools/testfiles/h5mkgrp_single_latest.ls +++ b/tools/testfiles/h5mkgrp_single_latest.ls @@ -3,6 +3,6 @@ Expected output for 'h5ls ../testfiles/h5mkgrp_single_latest.h5' ############################# Opened "../testfiles/h5mkgrp_single_latest.h5" with sec2 driver. /latest Group - Location: 1:360 + Location: 1:306 Links: 1 Modified: XXXX-XX-XX XX:XX:XX XXX diff --git a/tools/testfiles/h5repack_objs.h5 b/tools/testfiles/h5repack_objs.h5 index b01258f..6820e8b 100644 Binary files a/tools/testfiles/h5repack_objs.h5 and b/tools/testfiles/h5repack_objs.h5 differ diff --git a/tools/testfiles/tall-2A.h5.xml b/tools/testfiles/tall-2A.h5.xml index 91164e6..32ef153 100644 --- a/tools/testfiles/tall-2A.h5.xml +++ b/tools/testfiles/tall-2A.h5.xml @@ -134,7 +134,7 @@ Expected output for 'h5dump --xml -A tall.h5' - + @@ -157,7 +157,7 @@ Expected output for 'h5dump --xml -A tall.h5' - + diff --git a/tools/testfiles/tall.h5 b/tools/testfiles/tall.h5 index 1f83deb..a08eee2 100644 Binary files a/tools/testfiles/tall.h5 and b/tools/testfiles/tall.h5 differ diff --git a/tools/testfiles/tall.h5.xml b/tools/testfiles/tall.h5.xml index 95af72d..3752372 100644 --- a/tools/testfiles/tall.h5.xml +++ b/tools/testfiles/tall.h5.xml @@ -147,7 +147,7 @@ Expected output for 'h5dump --xml tall.h5' - + @@ -172,7 +172,7 @@ Expected output for 'h5dump --xml tall.h5' - + diff --git a/tools/testfiles/tboot1.ddl b/tools/testfiles/tboot1.ddl index df1a85e..9a7cafc 100644 --- a/tools/testfiles/tboot1.ddl +++ b/tools/testfiles/tboot1.ddl @@ -17,7 +17,7 @@ USER_BLOCK { USERBLOCK_SIZE 0 } DATASET "dset" { - DATATYPE H5T_STD_I32LE + DATATYPE H5T_STD_I32BE DATASPACE SIMPLE { ( 4 ) / ( 4 ) } } } diff --git a/tools/testfiles/tcontents.ddl b/tools/testfiles/tcontents.ddl index f66835a..74805c3 100644 --- a/tools/testfiles/tcontents.ddl +++ b/tools/testfiles/tcontents.ddl @@ -3,7 +3,7 @@ Expected output for 'h5dump -n tfcontents1.h5' ############################# HDF5 "tfcontents1.h5" { FILE_CONTENTS { - datatype /#6392 + datatype /#7290 dataset /dset dataset /dset3 -> /dset dataset /dset4 -> /dset diff --git a/tools/testfiles/textlink.h5 b/tools/testfiles/textlink.h5 index 7cc4cf2..6dd0e8d 100644 Binary files a/tools/testfiles/textlink.h5 and b/tools/testfiles/textlink.h5 differ diff --git a/tools/testfiles/tfcontents1.h5 b/tools/testfiles/tfcontents1.h5 index aa1212d..bd0cd88 100644 Binary files a/tools/testfiles/tfcontents1.h5 and b/tools/testfiles/tfcontents1.h5 differ diff --git a/tools/testfiles/tmany.h5 b/tools/testfiles/tmany.h5 index 5cccd26..6041ca2 100644 Binary files a/tools/testfiles/tmany.h5 and b/tools/testfiles/tmany.h5 differ diff --git a/tools/testfiles/tmany.h5.xml b/tools/testfiles/tmany.h5.xml index 87cd0d2..ec267b0 100644 --- a/tools/testfiles/tmany.h5.xml +++ b/tools/testfiles/tmany.h5.xml @@ -265,17 +265,17 @@ Expected output for 'h5dump --xml tmany.h5' - - + + - - + + - - + + @@ -311,16 +311,16 @@ Expected output for 'h5dump --xml tmany.h5' - - - + + + - - + + - - + + @@ -356,13 +356,13 @@ Expected output for 'h5dump --xml tmany.h5' - - - + + + - - - + + + diff --git a/tools/testfiles/tudlink.h5 b/tools/testfiles/tudlink.h5 index 7f610dd..d93b82a 100644 Binary files a/tools/testfiles/tudlink.h5 and b/tools/testfiles/tudlink.h5 differ diff --git a/tools/testfiles/twithub.h5 b/tools/testfiles/twithub.h5 index 3f794b0..97310ab 100644 Binary files a/tools/testfiles/twithub.h5 and b/tools/testfiles/twithub.h5 differ diff --git a/tools/testfiles/twithub513.h5 b/tools/testfiles/twithub513.h5 index d4c568f..e214cf7 100644 Binary files a/tools/testfiles/twithub513.h5 and b/tools/testfiles/twithub513.h5 differ -- cgit v0.12