summaryrefslogtreecommitdiffstats
path: root/src/H5Flow.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5Flow.c')
-rw-r--r--src/H5Flow.c75
1 files changed, 44 insertions, 31 deletions
diff --git a/src/H5Flow.c b/src/H5Flow.c
index 55010bc..0dfd11c 100644
--- a/src/H5Flow.c
+++ b/src/H5Flow.c
@@ -21,6 +21,7 @@
#define PABLO_MASK H5F_low
static hbool_t interface_initialize_g = FALSE;
+#define INTERFACE_INIT NULL
/*-------------------------------------------------------------------------
@@ -72,7 +73,7 @@ H5F_low_open (const H5F_low_class_t *type, const char *name, uintn flags,
{
H5F_low_t *lf = NULL;
- FUNC_ENTER (H5F_low_open, NULL, NULL);
+ FUNC_ENTER (H5F_low_open, NULL);
assert (type && type->open);
assert (name && *name);
@@ -117,7 +118,7 @@ H5F_low_open (const H5F_low_class_t *type, const char *name, uintn flags,
H5F_low_t *
H5F_low_close (H5F_low_t *lf)
{
- FUNC_ENTER (H5F_low_close, NULL, NULL);
+ FUNC_ENTER (H5F_low_close, NULL);
if (lf) {
if ((lf->type->close)(lf)<0) {
@@ -163,7 +164,7 @@ H5F_low_read (H5F_low_t *lf, const haddr_t *addr, size_t size,
{
herr_t ret_value = FAIL;
- FUNC_ENTER (H5F_low_read, NULL, FAIL);
+ FUNC_ENTER (H5F_low_read, FAIL);
assert (lf && lf->type);
assert (addr && H5F_addr_defined (addr));
@@ -213,7 +214,7 @@ H5F_low_write (H5F_low_t *lf, const haddr_t *addr, size_t size,
herr_t ret_value = FAIL;
haddr_t tmp_addr;
- FUNC_ENTER (H5F_low_write, NULL, FAIL);
+ FUNC_ENTER (H5F_low_write, FAIL);
assert (lf && lf->type);
assert (addr && H5F_addr_defined (addr));
@@ -244,10 +245,14 @@ H5F_low_write (H5F_low_t *lf, const haddr_t *addr, size_t size,
* Function: H5F_low_flush
*
* Purpose: Flushes file buffers to disk. For instance, the stdio.h
- * driver would call fflush().
- *
- * If the subclass doesn't define a flush method then this
- * function doesn't do anything.
+ * driver would call fflush(). Flushing also insures that the
+ * file exists to the current logical EOF (the library maintains
+ * a notion of EOF which is independent of the physical EOF) by
+ * reading and writing the last byte. On some systems, this
+ * allocates a single block at the end of the file while on
+ * other systems it allocates all blocks up to the end of the
+ * file. Extending the physical file is necessary because
+ * H5F_open() checks for truncated files.
*
* Return: Success: SUCCEED
*
@@ -263,10 +268,24 @@ H5F_low_write (H5F_low_t *lf, const haddr_t *addr, size_t size,
herr_t
H5F_low_flush (H5F_low_t *lf)
{
- FUNC_ENTER (H5F_low_flush, NULL, FAIL);
+ haddr_t last_byte;
+ uint8 buf[1];
+
+ FUNC_ENTER (H5F_low_flush, FAIL);
assert (lf && lf->type);
+ /* Make sure the last block of the file has been allocated on disk */
+ H5F_addr_reset (&last_byte);
+ if (H5F_addr_defined (&(lf->eof)) && H5F_addr_gt (&(lf->eof), &last_byte)) {
+ last_byte = lf->eof;
+ last_byte.offset -= 1;
+ if (H5F_low_read (lf, &last_byte, 1, buf)>=0) {
+ H5F_low_write (lf, &last_byte, 1, buf);
+ }
+ }
+
+ /* Invoke the subclass the flush method */
if (lf->type->flush) {
if ((lf->type->flush)(lf)<0) {
/* Low level flush failed */
@@ -315,7 +334,7 @@ H5F_low_size (H5F_low_t *lf, haddr_t *eof/*out*/)
{
size_t size = (size_t)(-1); /*max possible size*/
- FUNC_ENTER (H5F_low_size, NULL, 0);
+ FUNC_ENTER (H5F_low_size, 0);
assert (lf && lf->type);
assert (eof);
@@ -368,7 +387,7 @@ H5F_low_access (const H5F_low_class_t *type, const char *name, int mode,
hbool_t ret_value;
struct stat sb;
- FUNC_ENTER (H5F_low_size, NULL, 0);
+ FUNC_ENTER (H5F_low_size, 0);
assert (type);
if (type->access) {
@@ -411,7 +430,7 @@ H5F_low_access (const H5F_low_class_t *type, const char *name, int mode,
herr_t
H5F_low_extend (H5F_low_t *lf, intn op, size_t size, haddr_t *addr/*out*/)
{
- FUNC_ENTER (H5F_low_alloc, NULL, FAIL);
+ FUNC_ENTER (H5F_low_alloc, FAIL);
assert (lf);
assert (size>0);
@@ -450,7 +469,7 @@ H5F_low_extend (H5F_low_t *lf, intn op, size_t size, haddr_t *addr/*out*/)
herr_t
H5F_low_seteof (H5F_low_t *lf, const haddr_t *addr)
{
- FUNC_ENTER (H5F_low_seteof, NULL, FAIL);
+ FUNC_ENTER (H5F_low_seteof, FAIL);
assert (lf);
assert (addr && H5F_addr_defined (addr));
@@ -482,7 +501,7 @@ H5F_low_seteof (H5F_low_t *lf, const haddr_t *addr)
intn
H5F_addr_cmp (const haddr_t *a1, const haddr_t *a2)
{
- FUNC_ENTER (H5F_addr_cmp, NULL, FAIL);
+ FUNC_ENTER (H5F_addr_cmp, FAIL);
assert (a1 && H5F_addr_defined (a1));
assert (a2 && H5F_addr_defined (a2));
@@ -493,7 +512,6 @@ H5F_addr_cmp (const haddr_t *a1, const haddr_t *a2)
FUNC_LEAVE (0);
}
-
/*-------------------------------------------------------------------------
* Function: H5F_addr_undef
@@ -510,8 +528,10 @@ H5F_addr_cmp (const haddr_t *a1, const haddr_t *a2)
*-------------------------------------------------------------------------
*/
void
-H5F_addr_undef (haddr_t *addr)
+H5F_addr_undef (haddr_t *addr/*out*/)
{
+ assert (addr);
+
addr->offset = -1;
}
@@ -535,11 +555,10 @@ H5F_addr_undef (haddr_t *addr)
hbool_t
H5F_addr_defined (const haddr_t *addr)
{
- FUNC_ENTER (H5F_addr_defined, NULL, FAIL);
+ FUNC_ENTER (H5F_addr_defined, FAIL);
FUNC_LEAVE (-1!=addr->offset && addr->offset>=0);
}
-
/*-------------------------------------------------------------------------
* Function: H5F_addr_reset
@@ -556,12 +575,12 @@ H5F_addr_defined (const haddr_t *addr)
*-------------------------------------------------------------------------
*/
void
-H5F_addr_reset (haddr_t *addr)
+H5F_addr_reset (haddr_t *addr/*out*/)
{
+ assert (addr);
addr->offset = 0;
}
-
/*-------------------------------------------------------------------------
* Function: H5F_addr_zerop
@@ -582,11 +601,10 @@ H5F_addr_reset (haddr_t *addr)
hbool_t
H5F_addr_zerop (const haddr_t *addr)
{
- FUNC_ENTER (H5F_addr_zerop, NULL, FAIL);
+ FUNC_ENTER (H5F_addr_zerop, FAIL);
FUNC_LEAVE (0==addr->offset);
}
-
/*-------------------------------------------------------------------------
* Function: H5F_addr_encode
@@ -616,20 +634,19 @@ H5F_addr_encode (H5F_t *f, uint8 **pp, const haddr_t *addr)
if (H5F_addr_defined (addr)) {
tmp = *addr;
- for (i=0; i<H5F_SIZEOF_OFFSET (f); i++) {
+ for (i=0; i<H5F_SIZEOF_ADDR (f); i++) {
*(*pp)++ = tmp.offset & 0xff;
tmp.offset >>= 8;
}
assert ("overflow" && 0==tmp.offset);
} else {
- for (i=0; i<H5F_SIZEOF_OFFSET (f); i++) {
+ for (i=0; i<H5F_SIZEOF_ADDR (f); i++) {
*(*pp)++ = 0xff;
}
}
}
-
/*-------------------------------------------------------------------------
* Function: H5F_addr_decode
@@ -663,7 +680,8 @@ H5F_addr_decode (H5F_t *f, const uint8 **pp, haddr_t *addr/*out*/)
assert (addr);
addr->offset = 0;
- for (i=0; i<H5F_SIZEOF_OFFSET (f); i++) {
+
+ for (i=0; i<H5F_SIZEOF_ADDR (f); i++) {
c = *(*pp)++;
if (c!=0xff) all_zero = FALSE;
@@ -678,7 +696,6 @@ H5F_addr_decode (H5F_t *f, const uint8 **pp, haddr_t *addr/*out*/)
if (all_zero) H5F_addr_undef (addr);
}
-
/*-------------------------------------------------------------------------
* Function: H5F_addr_print
@@ -723,7 +740,6 @@ H5F_addr_print (FILE *stream, const haddr_t *addr)
}
}
-
/*-------------------------------------------------------------------------
* Function: H5F_addr_pow2
@@ -750,7 +766,6 @@ H5F_addr_pow2 (uintn n, haddr_t *addr/*out*/)
addr->offset <<= n;
}
-
/*-------------------------------------------------------------------------
* Function: H5F_addr_inc
@@ -774,7 +789,6 @@ H5F_addr_inc (haddr_t *addr/*in,out*/, size_t inc)
addr->offset += inc;
}
-
/*-------------------------------------------------------------------------
* Function: H5F_addr_add
@@ -798,7 +812,6 @@ H5F_addr_add (haddr_t *a1/*in,out*/, const haddr_t *a2)
a1->offset += a2->offset;
}
-
/*-------------------------------------------------------------------------
* Function: H5F_addr_hash