summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/H5F.c38
-rw-r--r--src/H5Gprivate.h1
-rw-r--r--src/H5I.c12
-rw-r--r--src/H5Iprivate.h1
4 files changed, 44 insertions, 8 deletions
diff --git a/src/H5F.c b/src/H5F.c
index b095ace..4ee3441 100644
--- a/src/H5F.c
+++ b/src/H5F.c
@@ -2216,6 +2216,9 @@ H5Fopen(const char *filename, unsigned flags, hid_t fapl_id)
/* Get an atom for the file */
if ((ret_value = H5I_register(H5I_FILE, new_file))<0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file handle")
+
+ /* Keep this ID in file object structure */
+ new_file->file_id = ret_value;
done:
if (ret_value<0 && new_file)
@@ -3219,6 +3222,10 @@ H5F_close(H5F_t *f)
/* Register an ID for closing the file later */
if (!f->closing)
f->closing = H5I_register(H5I_FILE_CLOSING, f);
+
+ /* Invalidate file ID */
+ f->file_id = -1;
+
HGOTO_DONE(SUCCEED)
} else {
if (f->closing) {
@@ -3249,6 +3256,10 @@ H5F_close(H5F_t *f)
/* Register an ID for closing the file later */
if (!f->closing)
f->closing = H5I_register(H5I_FILE_CLOSING, f);
+
+ /* Invalidate file ID */
+ f->file_id = -1;
+
HGOTO_DONE(SUCCEED)
} else {
if (!f->closing && f->shared->nrefs>1)
@@ -3260,7 +3271,7 @@ H5F_close(H5F_t *f)
break;
case H5F_CLOSE_STRONG:
- /* Forcefully close all opened objects in file */
+ /* Force to close all opened objects in file */
while(f->nopen_objs > 0) {
int obj_count; /* # of open objects */
hid_t objs[128]; /* Array of objects to close */
@@ -3311,6 +3322,9 @@ H5F_close(H5F_t *f)
HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close file, unknown file close degree")
} /* end switch */
+ /* Invalidate file ID */
+ f->file_id = -1;
+
/* Only flush at this point if the file will be closed */
assert(closing);
/* Dump debugging info */
@@ -3931,6 +3945,9 @@ H5Freopen(hid_t file_id)
if ((ret_value=H5I_register(H5I_FILE, new_file))<0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file handle")
+ /* Keep this ID in file object structure */
+ new_file->file_id = ret_value;
+
done:
if (ret_value<0 && new_file)
if(H5F_close(new_file)<0)
@@ -4189,8 +4206,25 @@ H5F_get_id(H5F_t *file)
FUNC_ENTER_NOINIT(H5F_get_id)
assert(file);
- ret_value = file->file_id;
+ if(file->file_id == -1) {
+ if(H5I_remove(file->closing)==NULL)
+ HGOTO_ERROR(H5E_ATOM, H5E_READERROR, FAIL, "unable to remove from closing list")
+
+ /* Get an atom for the file */
+ if ((file->file_id = H5I_register(H5I_FILE, file))<0)
+ HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file")
+
+ /* Indicate file is not closing */
+ file->closing = 0;
+ } else {
+ /* Increment reference count on atom. */
+ if (H5I_inc_ref(file->file_id)<0)
+ HGOTO_ERROR (H5E_ATOM, H5E_CANTSET, FAIL, "incrementing file ID failed");
+ }
+ ret_value = file->file_id;
+
+done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5F_get_id() */
diff --git a/src/H5Gprivate.h b/src/H5Gprivate.h
index 2bf2c3f..b2bff6c 100644
--- a/src/H5Gprivate.h
+++ b/src/H5Gprivate.h
@@ -38,6 +38,7 @@
#include "H5private.h" /* Generic Functions */
#include "H5Bprivate.h" /* B-trees */
#include "H5Fprivate.h" /* File access */
+#include "H5Gprivate.h" /* Group */
#include "H5RSprivate.h" /* Reference-counted strings */
/*
diff --git a/src/H5I.c b/src/H5I.c
index 4af50a1..c2ee0ea 100644
--- a/src/H5I.c
+++ b/src/H5I.c
@@ -117,7 +117,6 @@ H5FL_DEFINE_STATIC(H5I_id_info_t);
/*--------------------- Local function prototypes ---------------------------*/
static herr_t H5I_init_interface(void);
static H5I_id_info_t *H5I_find_id(hid_t id);
-static hid_t H5I_get_file_id(hid_t obj_id);
#ifdef H5I_DEBUG_OUTPUT
static herr_t H5I_debug(H5I_type_t grp);
#endif /* H5I_DEBUG_OUTPUT */
@@ -843,7 +842,7 @@ done:
*
*-------------------------------------------------------------------------
*/
-static hid_t
+hid_t
H5I_get_file_id(hid_t obj_id)
{
H5G_entry_t *ent;
@@ -855,6 +854,11 @@ H5I_get_file_id(hid_t obj_id)
switch(H5I_GRP(obj_id)) {
case H5I_FILE:
ret_value = obj_id;
+
+ /* Increment reference count on atom. */
+ if (H5I_inc_ref(ret_value)<0)
+ HGOTO_ERROR (H5E_ATOM, H5E_CANTSET, FAIL, "incrementing file ID failed");
+
break;
case H5I_DATATYPE:
@@ -875,10 +879,6 @@ H5I_get_file_id(hid_t obj_id)
HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid object ID");
}
- /* Increment reference count on atom. */
- if (H5I_inc_ref(ret_value)<0)
- HGOTO_ERROR (H5E_ATOM, H5E_CANTSET, FAIL, "incrementing file ID failed");
-
done:
FUNC_LEAVE_NOAPI(ret_value);
}
diff --git a/src/H5Iprivate.h b/src/H5Iprivate.h
index 79819a5..42369e3 100644
--- a/src/H5Iprivate.h
+++ b/src/H5Iprivate.h
@@ -67,6 +67,7 @@ H5_DLL hid_t H5I_register(H5I_type_t grp, void *object);
H5_DLL void *H5I_object(hid_t id);
H5_DLL void *H5I_object_verify(hid_t id, H5I_type_t id_type);
H5_DLL H5I_type_t H5I_get_type(hid_t id);
+H5_DLL hid_t H5I_get_file_id(hid_t obj_id);
H5_DLL void *H5I_remove(hid_t id);
H5_DLL void *H5I_search(H5I_type_t grp, H5I_search_func_t func, void *key);
H5_DLL int H5I_inc_ref(hid_t id);