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/H5Fprivate.h | |
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/H5Fprivate.h')
-rw-r--r-- | src/H5Fprivate.h | 64 |
1 files changed, 40 insertions, 24 deletions
diff --git a/src/H5Fprivate.h b/src/H5Fprivate.h index 2032129..71b6ca4 100644 --- a/src/H5Fprivate.h +++ b/src/H5Fprivate.h @@ -336,6 +336,12 @@ typedef struct H5F_low_class_t { haddr_t *addr/*out*/); } H5F_low_class_t; +/* + * One of these H5F_low_t structs is allocated for each H5F_file_t struct. + * This struct describes how to access the storage for the hdf5 address space, + * whether that storage is file, local memory, shared memory, network + * distributed global memory, etc. + */ typedef struct H5F_low_t { const H5F_low_class_t *type;/* What type of file is this? */ haddr_t eof; /* Address of logical end-of-file */ @@ -427,28 +433,12 @@ typedef struct H5F_rdcc_t { struct H5F_rdcc_ent_t **slot; /* Chunk slots, each points to a chunk*/ } H5F_rdcc_t; -/* Mount property list */ -typedef struct H5F_mprop_t { - hbool_t local; /* Are absolute symlinks local to file? */ -} H5F_mprop_t; - -/* A record of the mount table */ -typedef struct H5F_mount_t { - struct H5G_t *group; /* Mount point group held open */ - struct H5F_t *file; /* File mounted at that point */ -} H5F_mount_t; - -/* The mount table */ -typedef struct H5F_mtab_t { - struct H5F_t *parent;/* Parent file */ - uintn nmounts;/* Number of children which are mounted */ - uintn nalloc; /* Number of mount slots allocated */ - H5F_mount_t *child; /* An array of mount records */ -} H5F_mtab_t; - /* * Define the structure to store the file information for HDF5 files. One of - * these structures is allocated per file, not per H5Fopen(). + * these structures is allocated per file, not per H5Fopen(). That is, set of + * H5F_t structs can all point to the same H5F_file_t struct. The `nrefs' + * count in this struct indicates the number of H5F_t structs which are + * pointing to this struct. */ typedef struct H5F_file_t { H5F_search_t key; /* The key for looking up files */ @@ -471,10 +461,35 @@ typedef struct H5F_file_t { H5MF_free_t fl_free[H5MF_NFREE]; /*free block array */ } H5F_file_t; +/* Mount property list */ +typedef struct H5F_mprop_t { + hbool_t local; /* Are absolute symlinks local to file? */ +} H5F_mprop_t; + +/* A record of the mount table */ +typedef struct H5F_mount_t { + struct H5G_t *group; /* Mount point group held open */ + struct H5F_t *file; /* File mounted at that point */ +} H5F_mount_t; + +/* + * The mount table describes what files are attached to (mounted on) the file + * to which this table belongs. + */ +typedef struct H5F_mtab_t { + struct H5F_t *parent;/* Parent file */ + uintn nmounts;/* Number of children which are mounted */ + uintn nalloc; /* Number of mount slots allocated */ + H5F_mount_t *child; /* An array of mount records */ +} H5F_mtab_t; + /* * This is the top-level file descriptor. One of these structures is - * allocated every time H5Fopen() is called although they may contain - * pointers to shared H5F_file_t structs. + * allocated every time H5Fopen() is called although they may contain pointers + * to shared H5F_file_t structs. The reference count (nrefs) indicates the + * number of times the file has been opened (the application can only open a + * file once explicitly, but the library can open the file a second time to + * indicate that the file is mounted on some other file). */ typedef struct H5F_t { uintn nrefs; /* Reference count */ @@ -482,7 +497,7 @@ typedef struct H5F_t { char *name; /* Name used to open file */ H5F_file_t *shared; /* The shared file info */ uintn nopen_objs; /* Number of open object headers*/ - hbool_t close_pending; /* File close is pending */ + hid_t closing; /* H5I_FILE_CLOSING ID or zero */ H5F_mtab_t mtab; /* File mount table */ } H5F_t; @@ -545,13 +560,14 @@ __DLLVAR__ hbool_t H5_mpi_1_metawrite_g; /* Private functions, not part of the publicly documented API */ __DLL__ herr_t H5F_init(void); -__DLL__ herr_t H5F_close_all(void); __DLL__ void H5F_encode_length_unusual(const H5F_t *f, uint8_t **p, uint8_t *l); __DLL__ H5F_t *H5F_open(const char *name, uintn flags, const H5F_create_t *create_parms, const H5F_access_t *access_parms); __DLL__ herr_t H5F_close(H5F_t *f); +__DLL__ herr_t H5F_close_all(void); +__DLL__ herr_t H5F_flush_all(hbool_t invalidate); __DLL__ herr_t H5F_debug(H5F_t *f, const haddr_t *addr, FILE * stream, intn indent, intn fwidth); __DLL__ herr_t H5F_istore_debug(H5F_t *f, const haddr_t *addr, FILE * stream, |