summaryrefslogtreecommitdiffstats
path: root/src/H5Fprivate.h
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/H5Fprivate.h
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/H5Fprivate.h')
-rw-r--r--src/H5Fprivate.h64
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,