summaryrefslogtreecommitdiffstats
path: root/src/H5F.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5F.c')
-rw-r--r--src/H5F.c74
1 files changed, 29 insertions, 45 deletions
diff --git a/src/H5F.c b/src/H5F.c
index af3892b..c07ac38 100644
--- a/src/H5F.c
+++ b/src/H5F.c
@@ -417,14 +417,6 @@ H5F_new (H5F_file_t *shared)
/* Create a main cache */
H5AC_create (f, H5AC_NSLOTS);
-
- /* Create the shadow hash table */
- f->shared->nshadows = H5G_NSHADOWS;
- f->shared->shadow = H5MM_xcalloc (f->shared->nshadows,
- sizeof(struct H5G_hash_t*));
-
- /* Create a root symbol slot */
- f->shared->root_sym = H5G_ent_calloc ();
}
f->shared->nrefs++;
@@ -463,9 +455,7 @@ H5F_dest (H5F_t *f)
if (f) {
if (0 == --(f->shared->nrefs)) {
H5AC_dest (f);
- f->shared->root_sym = H5MM_xfree (f->shared->root_sym);
- f->shared->nshadows = 0;
- f->shared->shadow = H5MM_xfree (f->shared->shadow);
+ f->shared->root_ent = H5MM_xfree (f->shared->root_ent);
f->shared = H5MM_xfree (f->shared);
}
f->name = H5MM_xfree (f->name);
@@ -586,6 +576,7 @@ H5F_open (const H5F_low_class_t *type, const char *name, uintn flags,
size_t variable_size; /*variable part of boot block */
H5F_create_t *cp=NULL; /*file creation parameters */
haddr_t addr1, addr2; /*temporary address */
+ H5G_entry_t root_ent; /*root symbol table entry */
const char *s = name;
FUNC_ENTER (H5F_open, NULL);
@@ -887,10 +878,15 @@ H5F_open (const H5F_low_class_t *type, const char *name, uintn flags,
H5F_addr_decode (f, &p, &(f->shared->smallobj_addr));
H5F_addr_decode (f, &p, &(f->shared->freespace_addr));
H5F_addr_decode (f, &p, &(f->shared->hdf5_eof));
- if (H5G_ent_decode (f, &p, f->shared->root_sym)<0) {
+ if (H5G_ent_decode (f, &p, &root_ent)<0) {
HGOTO_ERROR (H5E_FILE, H5E_CANTOPENFILE, NULL,
"can't read root symbol entry");
}
+ if (H5F_addr_defined (&(root_ent.header))) {
+ f->shared->root_ent = H5MM_xmalloc (sizeof(H5G_entry_t));
+ *(f->shared->root_ent) = root_ent;
+ }
+
/*
* The userdefined data is the area of the file before the base
@@ -1150,8 +1146,6 @@ hid_t H5Fopen(const char *filename, uintn flags, hid_t access_temp)
* Return: Success: SUCCEED
*
* Failure: FAIL
- * -2 if the there are open objects and
- * INVALIDATE was non-zero.
*
* Programmer: Robb Matzke
* matzke@llnl.gov
@@ -1165,7 +1159,6 @@ static herr_t
H5F_flush (H5F_t *f, hbool_t invalidate)
{
uint8 buf[2048], *p=buf;
- herr_t shadow_flush;
FUNC_ENTER (H5F_flush, FAIL);
@@ -1177,12 +1170,6 @@ H5F_flush (H5F_t *f, hbool_t invalidate)
*/
if (0==(H5F_ACC_WRITE & f->shared->flags)) HRETURN (SUCCEED);
- /*
- * Flush all open object info. If this fails just remember it and return
- * failure at the end. At least that way we get a consistent file.
- */
- shadow_flush = H5G_shadow_flush (f, invalidate);
-
/* flush (and invalidate) the entire cache */
if (H5AC_flush (f, NULL, 0, invalidate)<0) {
HRETURN_ERROR (H5E_CACHE, H5E_CANTFLUSH, FAIL, "can't flush cache");
@@ -1207,7 +1194,7 @@ H5F_flush (H5F_t *f, hbool_t invalidate)
H5F_addr_encode (f, &p, &(f->shared->smallobj_addr));
H5F_addr_encode (f, &p, &(f->shared->freespace_addr));
H5F_addr_encode (f, &p, &(f->shared->hdf5_eof));
- H5G_ent_encode (f, &p, f->shared->root_sym);
+ H5G_ent_encode (f, &p, f->shared->root_ent);
/* update file length if necessary */
if (!H5F_addr_defined (&(f->shared->hdf5_eof))) {
@@ -1226,11 +1213,6 @@ H5F_flush (H5F_t *f, hbool_t invalidate)
HRETURN_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "low level flush failed");
}
- /* Did shadow flush fail above? */
- if (shadow_flush<0) {
- HRETURN_ERROR (H5E_CACHE, H5E_CANTFLUSH, -2, "object are still open");
- }
-
FUNC_LEAVE (SUCCEED);
}
@@ -1242,8 +1224,7 @@ H5F_flush (H5F_t *f, hbool_t invalidate)
*
* Return: Success: SUCCEED
*
- * Failure: FAIL, or -2 if the failure is due to objects
- * still being open.
+ * Failure: FAIL
*
* Programmer: Robb Matzke
* Tuesday, September 23, 1997
@@ -1255,27 +1236,24 @@ H5F_flush (H5F_t *f, hbool_t invalidate)
herr_t
H5F_close (H5F_t *f)
{
- herr_t ret_value = FAIL;
-
FUNC_ENTER (H5F_close, FAIL);
- if (-2==(ret_value=H5F_flush (f, TRUE))) {
- /*objects are still open, but don't fail yet*/
- } else if (ret_value<0) {
- HRETURN_ERROR (H5E_CACHE, H5E_CANTFLUSH, FAIL,
- "can't flush cache");
+ /* Close all current working groups */
+ while (H5G_pop (f)>=0) /*void*/;
+
+ /* Flush the boot block and caches */
+ if (H5F_flush (f, TRUE)<0) {
+ HRETURN_ERROR (H5E_CACHE, H5E_CANTFLUSH, FAIL, "can't flush cache");
}
+
+ /* Dump debugging info */
if (f->intent & H5F_ACC_DEBUG) H5AC_debug (f);
+ /* Close files and release resources */
H5F_low_close (f->shared->lf);
- H5F_dest (f);
-
- /* Did the H5F_flush() fail because of open objects? */
- if (ret_value<0) {
- HRETURN_ERROR (H5E_SYM, H5E_CANTFLUSH, ret_value, "objects are open");
- }
+ f = H5F_dest (f);
- FUNC_LEAVE (ret_value);
+ FUNC_LEAVE (SUCCEED);
}
/*--------------------------------------------------------------------------
@@ -1537,8 +1515,14 @@ H5F_debug (H5F_t *f, const haddr_t *addr, FILE *stream, intn indent,
"Shared header version number:",
(unsigned)(f->shared->create_parms.sharedheader_ver));
- fprintf (stream, "%*sRoot symbol table entry:\n", indent, "");
- H5G_ent_debug (f, f->shared->root_sym, stream, indent+3, MAX(0, fwidth-3));
+ fprintf (stream, "%*s%-*s %s\n", indent, "", fwidth,
+ "Root symbol table entry:",
+ f->shared->root_ent ? "" : "(none)");
+ if (f->shared->root_ent) {
+ H5G_ent_debug (f, f->shared->root_ent, stream,
+ indent+3, MAX(0, fwidth-3));
+ }
+
FUNC_LEAVE (SUCCEED);
}