diff options
author | Robb Matzke <matzke@llnl.gov> | 1999-02-20 16:18:51 (GMT) |
---|---|---|
committer | Robb Matzke <matzke@llnl.gov> | 1999-02-20 16:18:51 (GMT) |
commit | e2e5476fa5449ec941ff19f07bada9725431688f (patch) | |
tree | 33f6af7c15322663582c4a736dc0e9b087f38530 /src/H5A.c | |
parent | 35a62b068bc6b124004d331c3e949d571682417a (diff) | |
download | hdf5-e2e5476fa5449ec941ff19f07bada9725431688f.zip hdf5-e2e5476fa5449ec941ff19f07bada9725431688f.tar.gz hdf5-e2e5476fa5449ec941ff19f07bada9725431688f.tar.bz2 |
[svn-r1087] Changes since 19990218
----------------------
./src/H5F.c
./src/H5private.h
./src/H5Ipublic.h
./src/H5O.c
Fixed a rather nasty bug with file closing that caused the
file boot block to be updated incorrectly, effectively
truncating the file. The bug I fixed was triggered by:
1. Create a file, F
2. Open an object, X
3. Close file F
4. Reopen file F for read/write.
5. Create and close some objects
6. Close file F
7. Close library (exit).
Step 3 pended the close because object X is still open, but
the file ID was removed from the H5I_FILE ID group. Step 4
created a new file because it didn't see any matching file on
the H5I_FILE ID group. Step 5 extends the file. Step 6 writes
the new file boot block to disk. Step 7 closes object X and
completes the close from step 3, writing the old boot block
information to disk.
The new behavior is that step 3 moves the file from the
H5I_FILE group to the H5I_FILE_CLOSING group. Step 4 searches
both groups and finds the file. Step 5 extends the file using
the same H5F_file_t struct as step 3. Step 6 closes the H5F_t
struct opened in step 3 but not the H5F_file_t struct shared
by steps 1 and 3. Step 7 closes object X which closes the
H5F_file_t from step 1, flushing the boot block which was
shared by all steps.
./src/H5F.c
Added some bulletproofing to file reference counting and
removed comments which no longer apply. Added H5F_flush_all()
and H5F_close_all() which apply to all files.
./src/H5A.c
./src/H5D.c
./src/H5F.c
./src/H5G.c
./src/H5I.c
./src/H5Iprivate.h
./src/H5R.c
./src/H5RA.c
./src/H5S.c
./src/H5T.c
Added the new H5I_free_t data type to describe the function
type to be passed as the `free_func' argument to
H5I_init_group().
./src/H5I.c
Bulletproofed the object removal functions. Removed comments
which no longer apply. Changed global variable names so they
don't violate the naming scheme. Added H5I_debug() that prints
the contents of an ID group. Removed H5I_inc_ref() because it
isn't used. Reindented a couple of functions.
./src/H5.c
./src/H5G.c
./src/H5Ipublic.h
Changed H5I_MAXID to H5I_NGROUPS to better relect the fact
that it's the total number of valid ID groups.
./src/H5Shyper.c
Changed hyperslab offset arrays to signed quantities to get
rid of warnings on DEC cluster.
./src/H5Flow.c
./src/H5Fprivate.h
Changed the objno argument of H5F_addr_pack() to be unsigned
to get rid of warnings on DEC cluster.
Diffstat (limited to 'src/H5A.c')
-rw-r--r-- | src/H5A.c | 42 |
1 files changed, 18 insertions, 24 deletions
@@ -68,7 +68,7 @@ H5A_init_interface(void) * Create attribute group. */ if (H5I_init_group(H5I_ATTR, H5I_ATTRID_HASHSIZE, H5A_RESERVED_ATOMS, - (herr_t (*)(void *)) H5A_close)<0) { + (H5I_free_t)H5A_close)<0) { HRETURN_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "unable to initialize interface"); } @@ -285,8 +285,7 @@ H5A_create(const H5G_entry_t *ent, const char *name, const H5T_t *type, done: if (ret_value < 0) { - if(attr) - H5A_close(attr); + if(attr) H5A_close(attr); } FUNC_LEAVE(ret_value); @@ -522,8 +521,7 @@ H5A_open(H5G_entry_t *ent, unsigned idx) done: if (ret_value < 0) { - if(attr) - H5A_close(attr); + if(attr) H5A_close(attr); } FUNC_LEAVE(ret_value); @@ -928,21 +926,21 @@ H5Aget_type(hid_t attr_id) * reopen the type before returning it to the user. Make the type * read-only. */ - if (NULL==(dst=H5T_copy (attr->dt, H5T_COPY_REOPEN))) { - HRETURN_ERROR (H5E_ATTR, H5E_CANTINIT, FAIL, - "unable to copy datatype"); + if (NULL==(dst=H5T_copy(attr->dt, H5T_COPY_REOPEN))) { + HRETURN_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, + "unable to copy datatype"); } - if (H5T_lock (dst, FALSE)<0) { - H5T_close (dst); - HRETURN_ERROR (H5E_DATATYPE, H5E_CANTINIT, FAIL, - "unable to lock transient data type"); + if (H5T_lock(dst, FALSE)<0) { + H5T_close(dst); + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, + "unable to lock transient data type"); } /* Atomize */ - if ((ret_value=H5I_register (H5I_DATATYPE, dst))<0) { - H5T_close (dst); - HRETURN_ERROR (H5E_ATOM, H5E_CANTREGISTER, FAIL, - "unable to register datatype atom"); + if ((ret_value=H5I_register(H5I_DATATYPE, dst))<0) { + H5T_close(dst); + HRETURN_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, + "unable to register datatype atom"); } FUNC_LEAVE(ret_value); @@ -1377,16 +1375,12 @@ H5A_close(H5A_t *attr) /* Free dynamicly allocated items */ if(attr->name) H5MM_xfree(attr->name); - if(attr->dt) - H5T_close(attr->dt); - if(attr->ds) - H5S_close(attr->ds); - if(attr->data) - H5MM_xfree(attr->data); + if(attr->dt) H5T_close(attr->dt); + if(attr->ds) H5S_close(attr->ds); + if(attr->data) H5MM_xfree(attr->data); /* Close the object's symbol-table entry */ - if(attr->ent_opened) - H5O_close(&(attr->ent)); + if(attr->ent_opened) H5O_close(&(attr->ent)); #ifndef LATER /* Do something with the shared information? */ |