summaryrefslogtreecommitdiffstats
path: root/src/H5A.c
diff options
context:
space:
mode:
authorRobb Matzke <matzke@llnl.gov>1999-02-20 16:18:51 (GMT)
committerRobb Matzke <matzke@llnl.gov>1999-02-20 16:18:51 (GMT)
commite2e5476fa5449ec941ff19f07bada9725431688f (patch)
tree33f6af7c15322663582c4a736dc0e9b087f38530 /src/H5A.c
parent35a62b068bc6b124004d331c3e949d571682417a (diff)
downloadhdf5-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.c42
1 files changed, 18 insertions, 24 deletions
diff --git a/src/H5A.c b/src/H5A.c
index 3aac523..94c4c66 100644
--- a/src/H5A.c
+++ b/src/H5A.c
@@ -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? */