summaryrefslogtreecommitdiffstats
path: root/src/H5Fefc.c
diff options
context:
space:
mode:
authorAllen Byrne <byrn@hdfgroup.org>2020-10-01 15:29:53 (GMT)
committerAllen Byrne <byrn@hdfgroup.org>2020-10-01 15:29:53 (GMT)
commitec8ad09125032c9c232878d02e90aa86df162841 (patch)
tree5d63105d3a0db7d5bbee41c5b74b097649a2115e /src/H5Fefc.c
parent453238e90e1574ef1c15e3c79f7fb3d77920e77c (diff)
downloadhdf5-ec8ad09125032c9c232878d02e90aa86df162841.zip
hdf5-ec8ad09125032c9c232878d02e90aa86df162841.tar.gz
hdf5-ec8ad09125032c9c232878d02e90aa86df162841.tar.bz2
Source formatted
Diffstat (limited to 'src/H5Fefc.c')
-rw-r--r--src/H5Fefc.c323
1 files changed, 155 insertions, 168 deletions
diff --git a/src/H5Fefc.c b/src/H5Fefc.c
index 46adfc7..b88cdeb 100644
--- a/src/H5Fefc.c
+++ b/src/H5Fefc.c
@@ -24,54 +24,52 @@
*-------------------------------------------------------------------------
*/
-#include "H5Fmodule.h" /* This source code file is part of the H5F module */
-
+#include "H5Fmodule.h" /* This source code file is part of the H5F module */
/* Packages needed by this file... */
-#include "H5private.h" /* Generic Functions */
-#include "H5Eprivate.h" /* Error handling */
-#include "H5Fpkg.h" /* File access */
-#include "H5MMprivate.h" /* Memory management */
-#include "H5Pprivate.h" /* Property lists */
+#include "H5private.h" /* Generic Functions */
+#include "H5Eprivate.h" /* Error handling */
+#include "H5Fpkg.h" /* File access */
+#include "H5MMprivate.h" /* Memory management */
+#include "H5Pprivate.h" /* Property lists */
/* Special values for the "tag" field below */
-#define H5F_EFC_TAG_DEFAULT -1
-#define H5F_EFC_TAG_LOCK -2
-#define H5F_EFC_TAG_CLOSE -3
-#define H5F_EFC_TAG_DONTCLOSE -4
+#define H5F_EFC_TAG_DEFAULT -1
+#define H5F_EFC_TAG_LOCK -2
+#define H5F_EFC_TAG_CLOSE -3
+#define H5F_EFC_TAG_DONTCLOSE -4
/* Structure for each entry in a file's external file cache */
typedef struct H5F_efc_ent_t {
- char *name; /* Name of the file */
- H5F_t *file; /* File object */
- struct H5F_efc_ent_t *LRU_next; /* Next item in LRU list */
- struct H5F_efc_ent_t *LRU_prev; /* Previous item in LRU list */
- unsigned nopen; /* Number of times this file is currently opened by an EFC client */
+ char * name; /* Name of the file */
+ H5F_t * file; /* File object */
+ struct H5F_efc_ent_t *LRU_next; /* Next item in LRU list */
+ struct H5F_efc_ent_t *LRU_prev; /* Previous item in LRU list */
+ unsigned nopen; /* Number of times this file is currently opened by an EFC client */
} H5F_efc_ent_t;
/* Structure for a shared file struct's external file cache */
struct H5F_efc_t {
- H5SL_t *slist; /* Skip list of cached external files */
- H5F_efc_ent_t *LRU_head; /* Head of LRU list. This is the least recently used file */
- H5F_efc_ent_t *LRU_tail; /* Tail of LRU list. This is the most recently used file */
- unsigned nfiles; /* Size of the external file cache */
- unsigned max_nfiles; /* Maximum size of the external file cache */
- unsigned nrefs; /* Number of times this file appears in another file's EFC */
- int tag; /* Temporary variable used by H5F__efc_try_close() */
- H5F_shared_t *tmp_next; /* Next file in temporary list used by H5F__efc_try_close() */
+ H5SL_t * slist; /* Skip list of cached external files */
+ H5F_efc_ent_t *LRU_head; /* Head of LRU list. This is the least recently used file */
+ H5F_efc_ent_t *LRU_tail; /* Tail of LRU list. This is the most recently used file */
+ unsigned nfiles; /* Size of the external file cache */
+ unsigned max_nfiles; /* Maximum size of the external file cache */
+ unsigned nrefs; /* Number of times this file appears in another file's EFC */
+ int tag; /* Temporary variable used by H5F__efc_try_close() */
+ H5F_shared_t * tmp_next; /* Next file in temporary list used by H5F__efc_try_close() */
};
/* Private prototypes */
static herr_t H5F__efc_release_real(H5F_efc_t *efc);
static herr_t H5F__efc_remove_ent(H5F_efc_t *efc, H5F_efc_ent_t *ent);
-static void H5F__efc_try_close_tag1(H5F_shared_t *sf, H5F_shared_t **tail);
-static void H5F__efc_try_close_tag2(H5F_shared_t *sf, H5F_shared_t **tail);
+static void H5F__efc_try_close_tag1(H5F_shared_t *sf, H5F_shared_t **tail);
+static void H5F__efc_try_close_tag2(H5F_shared_t *sf, H5F_shared_t **tail);
/* Free lists */
H5FL_DEFINE_STATIC(H5F_efc_ent_t);
H5FL_DEFINE_STATIC(H5F_efc_t);
-
/*-------------------------------------------------------------------------
* Function: H5F__efc_create
*
@@ -90,8 +88,8 @@ H5FL_DEFINE_STATIC(H5F_efc_t);
H5F_efc_t *
H5F__efc_create(unsigned max_nfiles)
{
- H5F_efc_t *efc = NULL; /* EFC object */
- H5F_efc_t *ret_value = NULL; /* Return value */
+ H5F_efc_t *efc = NULL; /* EFC object */
+ H5F_efc_t *ret_value = NULL; /* Return value */
FUNC_ENTER_PACKAGE
@@ -99,7 +97,7 @@ H5F__efc_create(unsigned max_nfiles)
HDassert(max_nfiles > 0);
/* Allocate EFC struct */
- if(NULL == (efc = H5FL_CALLOC(H5F_efc_t)))
+ if (NULL == (efc = H5FL_CALLOC(H5F_efc_t)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
/* Initialize maximum number of files */
@@ -112,13 +110,12 @@ H5F__efc_create(unsigned max_nfiles)
ret_value = efc;
done:
- if(ret_value == NULL && efc)
+ if (ret_value == NULL && efc)
efc = H5FL_FREE(H5F_efc_t, efc);
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5F__efc_create() */
-
/*-------------------------------------------------------------------------
* Function: H5F__efc_open
*
@@ -141,10 +138,10 @@ done:
H5F_t *
H5F__efc_open(H5F_t *parent, const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id)
{
- H5F_efc_t *efc = NULL; /* External file cache for parent file */
- H5F_efc_ent_t *ent = NULL; /* Entry for target file in efc */
- hbool_t open_file = FALSE; /* Whether ent->file needs to be closed in case of error */
- H5F_t *ret_value = NULL; /* Return value */
+ H5F_efc_t * efc = NULL; /* External file cache for parent file */
+ H5F_efc_ent_t *ent = NULL; /* Entry for target file in efc */
+ hbool_t open_file = FALSE; /* Whether ent->file needs to be closed in case of error */
+ H5F_t * ret_value = NULL; /* Return value */
FUNC_ENTER_PACKAGE
@@ -159,8 +156,8 @@ H5F__efc_open(H5F_t *parent, const char *name, unsigned flags, hid_t fcpl_id, hi
/* Check if the EFC exists. If it does not, just call H5F_open(). We
* support this so clients do not have to make 2 different calls depending
* on the state of the efc. */
- if(!efc) {
- if(NULL == (ret_value = H5F_open(name, flags, fcpl_id, fapl_id)))
+ if (!efc) {
+ if (NULL == (ret_value = H5F_open(name, flags, fcpl_id, fapl_id)))
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "can't open file")
/* Increment the number of open objects to prevent the file from being
@@ -174,31 +171,31 @@ H5F__efc_open(H5F_t *parent, const char *name, unsigned flags, hid_t fcpl_id, hi
/* Search the skip list for name if the skip list exists, create the skip
* list otherwise */
- if(efc->slist) {
- if(efc->nfiles > 0)
+ if (efc->slist) {
+ if (efc->nfiles > 0)
ent = (H5F_efc_ent_t *)H5SL_search(efc->slist, name);
} /* end if */
else {
HDassert(efc->nfiles == 0);
- if(NULL == (efc->slist = H5SL_create(H5SL_TYPE_STR, NULL)))
+ if (NULL == (efc->slist = H5SL_create(H5SL_TYPE_STR, NULL)))
HGOTO_ERROR(H5E_FILE, H5E_CANTCREATE, NULL, "can't create skip list")
} /* end else */
/* If we found the file update the LRU list and return the cached file,
* otherwise open the file and cache it */
- if(ent) {
+ if (ent) {
HDassert(efc->LRU_head);
HDassert(efc->LRU_tail);
/* Move ent to the head of the LRU list, if it is not already there */
- if(ent->LRU_prev) {
+ if (ent->LRU_prev) {
HDassert(efc->LRU_head != ent);
/* Remove from current position. Note that once we touch the LRU
* list we cannot revert to the previous state. Make sure there can
* be no errors between when we first touch the LRU list and when
* the cache is in a consistent state! */
- if(ent->LRU_next)
+ if (ent->LRU_next)
ent->LRU_next->LRU_prev = ent->LRU_prev;
else {
HDassert(efc->LRU_tail == ent);
@@ -207,10 +204,10 @@ H5F__efc_open(H5F_t *parent, const char *name, unsigned flags, hid_t fcpl_id, hi
ent->LRU_prev->LRU_next = ent->LRU_next;
/* Add to head of LRU list */
- ent->LRU_next = efc->LRU_head;
+ ent->LRU_next = efc->LRU_head;
ent->LRU_next->LRU_prev = ent;
- ent->LRU_prev = NULL;
- efc->LRU_head = ent;
+ ent->LRU_prev = NULL;
+ efc->LRU_head = ent;
} /* end if */
/* Mark the file as open */
@@ -218,21 +215,22 @@ H5F__efc_open(H5F_t *parent, const char *name, unsigned flags, hid_t fcpl_id, hi
} /* end if */
else {
/* Check if we need to evict something */
- if(efc->nfiles == efc->max_nfiles) {
+ if (efc->nfiles == efc->max_nfiles) {
/* Search for an unopened file from the tail */
- for(ent = efc->LRU_tail; ent && ent->nopen; ent = ent->LRU_prev);
+ for (ent = efc->LRU_tail; ent && ent->nopen; ent = ent->LRU_prev)
+ ;
/* Evict the file if found, otherwise just open the target file and
* do not add it to cache */
- if(ent) {
- if(H5F__efc_remove_ent(efc, ent) < 0)
+ if (ent) {
+ if (H5F__efc_remove_ent(efc, ent) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTREMOVE, NULL, "can't remove entry from external file cache")
/* Do not free ent, we will recycle it below */
} /* end if */
else {
/* Cannot cache file, just open file and return */
- if(NULL == (ret_value = H5F_open(name, flags, fcpl_id, fapl_id)))
+ if (NULL == (ret_value = H5F_open(name, flags, fcpl_id, fapl_id)))
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "can't open file")
/* Increment the number of open objects to prevent the file from
@@ -242,18 +240,18 @@ H5F__efc_open(H5F_t *parent, const char *name, unsigned flags, hid_t fcpl_id, hi
HGOTO_DONE(ret_value)
} /* end else */
- } /* end if */
+ } /* end if */
else
/* Allocate new entry */
- if(NULL == (ent = H5FL_MALLOC(H5F_efc_ent_t)))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+ if (NULL == (ent = H5FL_MALLOC(H5F_efc_ent_t)))
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
/* Build new entry */
- if(NULL == (ent->name = H5MM_strdup(name)))
+ if (NULL == (ent->name = H5MM_strdup(name)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
/* Open the file */
- if(NULL == (ent->file = H5F_open(name, flags, fcpl_id, fapl_id)))
+ if (NULL == (ent->file = H5F_open(name, flags, fcpl_id, fapl_id)))
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "can't open file")
open_file = TRUE;
@@ -263,16 +261,16 @@ H5F__efc_open(H5F_t *parent, const char *name, unsigned flags, hid_t fcpl_id, hi
/* Add the file to the cache */
/* Skip list */
- if(H5SL_insert(efc->slist, ent, ent->name) < 0)
+ if (H5SL_insert(efc->slist, ent, ent->name) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTINSERT, NULL, "can't insert entry into skip list")
/* Add to head of LRU list and update tail if necessary */
ent->LRU_next = efc->LRU_head;
- if(ent->LRU_next)
+ if (ent->LRU_next)
ent->LRU_next->LRU_prev = ent;
ent->LRU_prev = NULL;
efc->LRU_head = ent;
- if(!efc->LRU_tail) {
+ if (!efc->LRU_tail) {
HDassert(!ent->LRU_next);
efc->LRU_tail = ent;
} /* end if */
@@ -282,7 +280,7 @@ H5F__efc_open(H5F_t *parent, const char *name, unsigned flags, hid_t fcpl_id, hi
/* Update nfiles and nrefs */
efc->nfiles++;
- if(ent->file->shared->efc)
+ if (ent->file->shared->efc)
ent->file->shared->efc->nrefs++;
} /* end else */
@@ -295,21 +293,20 @@ H5F__efc_open(H5F_t *parent, const char *name, unsigned flags, hid_t fcpl_id, hi
ret_value = ent->file;
done:
- if(!ret_value)
- if(ent) {
- if(open_file) {
+ if (!ret_value)
+ if (ent) {
+ if (open_file) {
ent->file->nopen_objs--;
- if(H5F_try_close(ent->file, NULL) < 0)
+ if (H5F_try_close(ent->file, NULL) < 0)
HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, NULL, "can't close external file")
} /* end if */
ent->name = (char *)H5MM_xfree(ent->name);
- ent = H5FL_FREE(H5F_efc_ent_t, ent);
+ ent = H5FL_FREE(H5F_efc_ent_t, ent);
} /* end if */
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5F__efc_open() */
-
/*-------------------------------------------------------------------------
* Function: H5F_efc_close
*
@@ -328,9 +325,9 @@ done:
herr_t
H5F_efc_close(H5F_t *parent, H5F_t *file)
{
- H5F_efc_t *efc = NULL; /* External file cache for parent file */
- H5F_efc_ent_t *ent = NULL; /* Entry for target file in efc */
- herr_t ret_value = SUCCEED; /* Return value */
+ H5F_efc_t * efc = NULL; /* External file cache for parent file */
+ H5F_efc_ent_t *ent = NULL; /* Entry for target file in efc */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI_NOINIT
@@ -346,9 +343,9 @@ H5F_efc_close(H5F_t *parent, H5F_t *file)
/* Check if the EFC exists. If it does not, just call H5F_try_close(). We
* support this so clients do not have to make 2 different calls depending
* on the state of the efc. */
- if(!efc) {
+ if (!efc) {
file->nopen_objs--;
- if(H5F_try_close(file, NULL) < 0)
+ if (H5F_try_close(file, NULL) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close external file")
HGOTO_DONE(SUCCEED)
@@ -359,10 +356,11 @@ H5F_efc_close(H5F_t *parent, H5F_t *file)
* the head. In the unlikely case that the file is not found, just call
* H5F_try_close(). This could happen if the EFC was full of open files
* when the file was opened. */
- for(ent = efc->LRU_head; ent && ent->file != file; ent = ent->LRU_next);
- if(!ent) {
+ for (ent = efc->LRU_head; ent && ent->file != file; ent = ent->LRU_next)
+ ;
+ if (!ent) {
file->nopen_objs--;
- if(H5F_try_close(file, NULL) < 0)
+ if (H5F_try_close(file, NULL) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close external file")
} /* end if */
else
@@ -373,7 +371,6 @@ done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5F_efc_close() */
-
/*-------------------------------------------------------------------------
* Function: H5F__efc_max_nfiles
*
@@ -398,7 +395,6 @@ H5F__efc_max_nfiles(H5F_efc_t *efc)
FUNC_LEAVE_NOAPI(efc->max_nfiles)
} /* end H5F__efc_max_nfiles */
-
/*-------------------------------------------------------------------------
* Function: H5F__efc_release_real
*
@@ -417,9 +413,9 @@ H5F__efc_max_nfiles(H5F_efc_t *efc)
static herr_t
H5F__efc_release_real(H5F_efc_t *efc)
{
- H5F_efc_ent_t *ent = NULL; /* EFC entry */
- H5F_efc_ent_t *prev_ent = NULL; /* Previous EFC entry */
- herr_t ret_value = SUCCEED; /* Return value */
+ H5F_efc_ent_t *ent = NULL; /* EFC entry */
+ H5F_efc_ent_t *prev_ent = NULL; /* Previous EFC entry */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
@@ -431,21 +427,20 @@ H5F__efc_release_real(H5F_efc_t *efc)
* would require a cycle, a cycle would necessarily invoke
* H5F__efc_try_close(), and that function checks the status of the lock
* before calling this one. */
- HDassert((efc->tag == H5F_EFC_TAG_DEFAULT)
- || (efc->tag == H5F_EFC_TAG_CLOSE));
+ HDassert((efc->tag == H5F_EFC_TAG_DEFAULT) || (efc->tag == H5F_EFC_TAG_CLOSE));
efc->tag = H5F_EFC_TAG_LOCK;
/* Walk down the LRU list, releasing any files that are not opened by an EFC
* client */
ent = efc->LRU_head;
- while(ent)
- if(!ent->nopen) {
- if(H5F__efc_remove_ent(efc, ent) < 0)
+ while (ent)
+ if (!ent->nopen) {
+ if (H5F__efc_remove_ent(efc, ent) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTREMOVE, FAIL, "can't remove entry from external file cache")
/* Free the entry and move to next entry in LRU list */
prev_ent = ent;
- ent = ent->LRU_next;
+ ent = ent->LRU_next;
prev_ent = H5FL_FREE(H5F_efc_ent_t, prev_ent);
} /* end if */
else
@@ -460,7 +455,6 @@ done:
FUNC_LEAVE_NOAPI(ret_value);
} /* end H5F__efc_release_real() */
-
/*-------------------------------------------------------------------------
* Function: H5F__efc_release
*
@@ -479,7 +473,7 @@ done:
herr_t
H5F__efc_release(H5F_efc_t *efc)
{
- herr_t ret_value = SUCCEED; /* Return value */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_PACKAGE
@@ -487,14 +481,13 @@ H5F__efc_release(H5F_efc_t *efc)
HDassert(efc);
/* Call 'real' routine */
- if(H5F__efc_release_real(efc) < 0)
+ if (H5F__efc_release_real(efc) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't remove entry from external file cache")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5F_efc_release() */
-
/*-------------------------------------------------------------------------
* Function: H5F__efc_destroy
*
@@ -513,20 +506,20 @@ done:
herr_t
H5F__efc_destroy(H5F_efc_t *efc)
{
- herr_t ret_value = SUCCEED; /* Return value */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_PACKAGE
/* Sanity checks */
HDassert(efc);
- if(efc->nfiles > 0) {
+ if (efc->nfiles > 0) {
/* Release (clear) the efc */
- if(H5F__efc_release_real(efc) < 0)
+ if (H5F__efc_release_real(efc) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't release external file cache")
/* If there are still cached files, return an error */
- if(efc->nfiles > 0)
+ if (efc->nfiles > 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "can't destroy EFC after incomplete release")
} /* end if */
@@ -535,8 +528,8 @@ H5F__efc_destroy(H5F_efc_t *efc)
HDassert(efc->LRU_tail == NULL);
/* Close skip list */
- if(efc->slist)
- if(H5SL_close(efc->slist) < 0)
+ if (efc->slist)
+ if (H5SL_close(efc->slist) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "can't close skip list")
/* Free EFC object */
@@ -546,7 +539,6 @@ done:
FUNC_LEAVE_NOAPI(ret_value);
} /* end H5F__efc_destroy() */
-
/*-------------------------------------------------------------------------
* Function: H5F__efc_remove_ent
*
@@ -564,7 +556,7 @@ done:
static herr_t
H5F__efc_remove_ent(H5F_efc_t *efc, H5F_efc_ent_t *ent)
{
- herr_t ret_value = SUCCEED; /* Return value */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
@@ -574,17 +566,17 @@ H5F__efc_remove_ent(H5F_efc_t *efc, H5F_efc_ent_t *ent)
HDassert(ent);
/* Remove from skip list */
- if(ent != H5SL_remove(efc->slist, ent->name))
+ if (ent != H5SL_remove(efc->slist, ent->name))
HGOTO_ERROR(H5E_FILE, H5E_CANTDELETE, FAIL, "can't delete entry from skip list")
/* Remove from LRU list */
- if(ent->LRU_next)
+ if (ent->LRU_next)
ent->LRU_next->LRU_prev = ent->LRU_prev;
else {
HDassert(efc->LRU_tail == ent);
efc->LRU_tail = ent->LRU_prev;
} /* end else */
- if(ent->LRU_prev)
+ if (ent->LRU_prev)
ent->LRU_prev->LRU_next = ent->LRU_next;
else {
HDassert(efc->LRU_head == ent);
@@ -593,7 +585,7 @@ H5F__efc_remove_ent(H5F_efc_t *efc, H5F_efc_ent_t *ent)
/* Update nfiles and nrefs */
efc->nfiles--;
- if(ent->file->shared->efc)
+ if (ent->file->shared->efc)
ent->file->shared->efc->nrefs--;
/* Free the name */
@@ -604,7 +596,7 @@ H5F__efc_remove_ent(H5F_efc_t *efc, H5F_efc_ent_t *ent)
* However we must still manipulate the nopen_objs field to prevent the file
* from being closed out from under us. */
ent->file->nopen_objs--;
- if(H5F_try_close(ent->file, NULL) < 0)
+ if (H5F_try_close(ent->file, NULL) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close external file")
ent->file = NULL;
@@ -612,7 +604,6 @@ done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5F__efc_remove_ent() */
-
/*-------------------------------------------------------------------------
* Function: H5F__efc_try_close_tag1
*
@@ -630,8 +621,8 @@ done:
static void
H5F__efc_try_close_tag1(H5F_shared_t *sf, H5F_shared_t **tail)
{
- H5F_efc_ent_t *ent = NULL; /* EFC entry */
- H5F_shared_t *esf; /* Convenience pointer to ent->file->shared */
+ H5F_efc_ent_t *ent = NULL; /* EFC entry */
+ H5F_shared_t * esf; /* Convenience pointer to ent->file->shared */
FUNC_ENTER_STATIC_NOERR
@@ -644,17 +635,17 @@ H5F__efc_try_close_tag1(H5F_shared_t *sf, H5F_shared_t **tail)
HDassert(*tail);
/* Recurse into this file's cached files */
- for(ent = sf->efc->LRU_head; ent; ent = ent->LRU_next) {
+ for (ent = sf->efc->LRU_head; ent; ent = ent->LRU_next) {
esf = ent->file->shared;
- if(esf->efc) {
+ if (esf->efc) {
/* If tag were 0, that would mean there are more actual references
* than are counted by nrefs */
HDassert(esf->efc->tag != 0);
/* If tag has been set, we have already visited this file so just
* decrement tag and continue */
- if(esf->efc->tag > 0)
+ if (esf->efc->tag > 0)
esf->efc->tag--;
/* If there are references that are not from an EFC, it will never
* be possible to close the file. Just continue. Also continue if
@@ -662,8 +653,8 @@ H5F__efc_try_close_tag1(H5F_shared_t *sf, H5F_shared_t **tail)
* that the reference counts will never match for the root file, but
* that's ok because the root file will always have a tag and enter
* the branch above. */
- else if((esf->nrefs == esf->efc->nrefs)
- && (esf->efc->tag != H5F_EFC_TAG_LOCK) && !(ent->nopen)) {
+ else if ((esf->nrefs == esf->efc->nrefs) && (esf->efc->tag != H5F_EFC_TAG_LOCK) &&
+ !(ent->nopen)) {
/* If we get here, this file's "tmp_next" pointer must be NULL
*/
HDassert(esf->efc->tmp_next == NULL);
@@ -671,22 +662,21 @@ H5F__efc_try_close_tag1(H5F_shared_t *sf, H5F_shared_t **tail)
/* If nrefs > 1, Add this file to the list of files with nrefs >
* 1 and initialize tag to the number of references (except this
* one) */
- if(esf->nrefs > 1) {
+ if (esf->nrefs > 1) {
(*tail)->efc->tmp_next = esf;
- *tail = esf;
- esf->efc->tag = (int)esf->nrefs - 1;
+ *tail = esf;
+ esf->efc->tag = (int)esf->nrefs - 1;
} /* end if */
/* Recurse into the entry */
H5F__efc_try_close_tag1(ent->file->shared, tail);
} /* end if */
- } /* end if */
- } /* end for */
+ } /* end if */
+ } /* end for */
FUNC_LEAVE_NOAPI_VOID
} /* end H5F__efc_try_close_tag1() */
-
/*-------------------------------------------------------------------------
* Function: H5F__efc_try_close_tag2
*
@@ -704,8 +694,8 @@ H5F__efc_try_close_tag1(H5F_shared_t *sf, H5F_shared_t **tail)
static void
H5F__efc_try_close_tag2(H5F_shared_t *sf, H5F_shared_t **tail)
{
- H5F_efc_ent_t *ent = NULL; /* EFC entry */
- H5F_shared_t *esf; /* Convenience pointer to ent->file->shared */
+ H5F_efc_ent_t *ent = NULL; /* EFC entry */
+ H5F_shared_t * esf; /* Convenience pointer to ent->file->shared */
FUNC_ENTER_STATIC_NOERR
@@ -714,7 +704,7 @@ H5F__efc_try_close_tag2(H5F_shared_t *sf, H5F_shared_t **tail)
HDassert(sf->efc);
/* Recurse into this file's cached files */
- for(ent = sf->efc->LRU_head; ent; ent = ent->LRU_next) {
+ for (ent = sf->efc->LRU_head; ent; ent = ent->LRU_next) {
esf = ent->file->shared;
/* Only recurse if the file is tagged CLOSE or DEFAULT. If it is tagged
@@ -725,39 +715,36 @@ H5F__efc_try_close_tag2(H5F_shared_t *sf, H5F_shared_t **tail)
* make sure we do not go off into somewhere cb1 didn't touch. The
* root file should never be tagged DEFAULT here, so the reference check
* is still appropriate. */
- if((esf->efc) && ((esf->efc->tag == H5F_EFC_TAG_CLOSE)
- || ((esf->efc->tag == H5F_EFC_TAG_DEFAULT)
- && (esf->nrefs == esf->efc->nrefs) && !(ent->nopen)))) {
+ if ((esf->efc) &&
+ ((esf->efc->tag == H5F_EFC_TAG_CLOSE) ||
+ ((esf->efc->tag == H5F_EFC_TAG_DEFAULT) && (esf->nrefs == esf->efc->nrefs) && !(ent->nopen)))) {
/* tag should always be CLOSE is nrefs > 1 or DEFAULT if nrefs == 1
* here */
- HDassert(((esf->nrefs > 1)
- && ((esf->efc->tag == H5F_EFC_TAG_CLOSE)))
- || ((esf->nrefs == 1)
- && (esf->efc->tag == H5F_EFC_TAG_DEFAULT)));
+ HDassert(((esf->nrefs > 1) && ((esf->efc->tag == H5F_EFC_TAG_CLOSE))) ||
+ ((esf->nrefs == 1) && (esf->efc->tag == H5F_EFC_TAG_DEFAULT)));
/* If tag is set to DONTCLOSE, we have already visited this file
* *or* it will be the start point of another iteration so just
* continue */
- if(esf->efc->tag != H5F_EFC_TAG_DONTCLOSE) {
+ if (esf->efc->tag != H5F_EFC_TAG_DONTCLOSE) {
/* If tag is CLOSE, set to DONTCLOSE and add to the list of
* uncloseable files. */
- if(esf->efc->tag == H5F_EFC_TAG_CLOSE) {
- esf->efc->tag = H5F_EFC_TAG_DONTCLOSE;
- esf->efc->tmp_next = NULL;
+ if (esf->efc->tag == H5F_EFC_TAG_CLOSE) {
+ esf->efc->tag = H5F_EFC_TAG_DONTCLOSE;
+ esf->efc->tmp_next = NULL;
(*tail)->efc->tmp_next = esf;
- *tail = esf;
+ *tail = esf;
} /* end if */
/* Recurse into the entry */
H5F__efc_try_close_tag2(esf, tail);
} /* end if */
- } /* end if */
- } /* end for */
+ } /* end if */
+ } /* end for */
FUNC_LEAVE_NOAPI_VOID
} /* end H5F__efc_try_close_tag2() */
-
/*-------------------------------------------------------------------------
* Function: H5F__efc_try_close
*
@@ -811,12 +798,14 @@ H5F__efc_try_close_tag2(H5F_shared_t *sf, H5F_shared_t **tail)
herr_t
H5F__efc_try_close(H5F_t *f)
{
- H5F_shared_t *tail; /* Tail of linked list of found files. Head will be f->shared. */
- H5F_shared_t *uncloseable_head = NULL; /* Head of linked list of files found to be uncloseable by the first pass */
- H5F_shared_t *uncloseable_tail = NULL; /* Tail of linked list of files found to be uncloseable by the first pass */
- H5F_shared_t *sf; /* Temporary file pointer */
- H5F_shared_t *next; /* Temporary file pointer */
- herr_t ret_value = SUCCEED; /* Return value */
+ H5F_shared_t *tail; /* Tail of linked list of found files. Head will be f->shared. */
+ H5F_shared_t *uncloseable_head =
+ NULL; /* Head of linked list of files found to be uncloseable by the first pass */
+ H5F_shared_t *uncloseable_tail =
+ NULL; /* Tail of linked list of files found to be uncloseable by the first pass */
+ H5F_shared_t *sf; /* Temporary file pointer */
+ H5F_shared_t *next; /* Temporary file pointer */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_PACKAGE
@@ -828,12 +817,12 @@ H5F__efc_try_close(H5F_t *f)
HDassert(f->shared->nrefs > 1);
HDassert(f->shared->efc->tag < 0);
- if(f->shared->efc->tag == H5F_EFC_TAG_CLOSE) {
+ if (f->shared->efc->tag == H5F_EFC_TAG_CLOSE) {
/* We must have reentered this function, and we should close this file.
* In actuality, we just release the EFC, the recursion should
* eventually reduce this file's reference count to 1 (though possibly
* not from this call to H5F__efc_release_real()). */
- if(H5F__efc_release_real(f->shared->efc) < 0)
+ if (H5F__efc_release_real(f->shared->efc) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't release external file cache")
/* If we marked the file as closeable, there must be no open files in
@@ -859,9 +848,8 @@ H5F__efc_try_close(H5F_t *f)
* not close/release it */
/* If nfiles is 0, then there is nothing to do. Just return. This may also
* occur on reentry (for example if this file was previously released). */
- if((f->shared->nrefs != f->shared->efc->nrefs + 1)
- || (f->shared->efc->tag == H5F_EFC_TAG_DONTCLOSE)
- || (f->shared->efc->nfiles == 0))
+ if ((f->shared->nrefs != f->shared->efc->nrefs + 1) || (f->shared->efc->tag == H5F_EFC_TAG_DONTCLOSE) ||
+ (f->shared->efc->nfiles == 0))
/* We must have reentered this function, and we should not close this
* file. Just return. */
HGOTO_DONE(SUCCEED)
@@ -889,13 +877,13 @@ H5F__efc_try_close(H5F_t *f)
/* Check if f->shared->efc->tag dropped to 0. If it did not,
* we cannot close anything. Just reset temporary values and return. */
- if(f->shared->efc->tag > 0) {
+ if (f->shared->efc->tag > 0) {
sf = f->shared;
- while(sf) {
- next = sf->efc->tmp_next;
- sf->efc->tag = H5F_EFC_TAG_DEFAULT;
+ while (sf) {
+ next = sf->efc->tmp_next;
+ sf->efc->tag = H5F_EFC_TAG_DEFAULT;
sf->efc->tmp_next = NULL;
- sf = next;
+ sf = next;
} /* end while */
HGOTO_DONE(SUCCEED)
} /* end if */
@@ -903,19 +891,19 @@ H5F__efc_try_close(H5F_t *f)
/* Run through the linked list , separating into two lists, one with tag ==
* 0 and one with tag > 0. Mark them as either H5F_EFC_TAG_CLOSE or
* H5F_EFC_TAG_DONTCLOSE as appropriate. */
- sf = f->shared;
+ sf = f->shared;
tail = NULL;
- while(sf) {
+ while (sf) {
HDassert(sf->efc->tag >= 0);
next = sf->efc->tmp_next;
- if(sf->efc->tag > 0) {
+ if (sf->efc->tag > 0) {
/* Remove from main list */
HDassert(tail);
tail->efc->tmp_next = sf->efc->tmp_next;
- sf->efc->tmp_next = NULL;
+ sf->efc->tmp_next = NULL;
/* Add to uncloseable list */
- if(!uncloseable_head)
+ if (!uncloseable_head)
uncloseable_head = sf;
else
uncloseable_tail->efc->tmp_next = sf;
@@ -926,7 +914,7 @@ H5F__efc_try_close(H5F_t *f)
} /* end if */
else {
sf->efc->tag = H5F_EFC_TAG_CLOSE;
- tail = sf;
+ tail = sf;
} /* end else */
sf = next;
} /* end while */
@@ -939,20 +927,20 @@ H5F__efc_try_close(H5F_t *f)
* so we know when to stop. We do not need to keep track of the closeable
* list any more. */
sf = uncloseable_head;
- if(sf) {
+ if (sf) {
tail = uncloseable_tail;
HDassert(tail);
- while(sf != tail->efc->tmp_next) {
+ while (sf != tail->efc->tmp_next) {
H5F__efc_try_close_tag2(sf, &uncloseable_tail);
sf = sf->efc->tmp_next;
} /* end while */
- } /* end if */
+ } /* end if */
/* If the root file's tag is still H5F_EFC_TAG_CLOSE, release its EFC. This
* should start the recursive release that should close all closeable files.
* Also, see the top of this function. */
- if(f->shared->efc->tag == H5F_EFC_TAG_CLOSE) {
- if(H5F__efc_release_real(f->shared->efc) < 0)
+ if (f->shared->efc->tag == H5F_EFC_TAG_CLOSE) {
+ if (H5F__efc_release_real(f->shared->efc) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't release external file cache")
/* Make sure the file's reference count is now 1 and will be closed by
@@ -962,18 +950,17 @@ H5F__efc_try_close(H5F_t *f)
/* Clean up uncloseable files (reset tag and tmp_next). All closeable files
* should have been closed, and therefore do not need to be cleaned up. */
- if(uncloseable_head) {
+ if (uncloseable_head) {
sf = uncloseable_head;
- while(sf) {
+ while (sf) {
next = sf->efc->tmp_next;
HDassert(sf->efc->tag == H5F_EFC_TAG_DONTCLOSE);
- sf->efc->tag = H5F_EFC_TAG_DEFAULT;
+ sf->efc->tag = H5F_EFC_TAG_DEFAULT;
sf->efc->tmp_next = NULL;
- sf = next;
+ sf = next;
} /* end while */
- } /* end if */
+ } /* end if */
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5F__efc_try_close() */
-