diff options
Diffstat (limited to 'src/H5Flow.c')
-rw-r--r-- | src/H5Flow.c | 75 |
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 |