summaryrefslogtreecommitdiffstats
path: root/src/H5Flow.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5Flow.c')
-rw-r--r--src/H5Flow.c778
1 files changed, 0 insertions, 778 deletions
diff --git a/src/H5Flow.c b/src/H5Flow.c
deleted file mode 100644
index 4764388..0000000
--- a/src/H5Flow.c
+++ /dev/null
@@ -1,778 +0,0 @@
-/*
- * Copyright (C) 1997 NCSA
- * All rights reserved.
- *
- * Programmer: Robb Matzke <matzke@viper.llnl.gov>
- * Wednesday, October 22, 1997
- *
- * Purpose: This file contains virtual functions for the H5F_low
- * class. These are functions that operate on various kinds
- * of files at a level where the file is just a one-dimensional
- * array of bytes.
- */
-#include <H5private.h>
-#include <H5Eprivate.h>
-#include <H5Fprivate.h>
-#include <H5MMprivate.h>
-
-#define PABLO_MASK H5Flow_mask
-static intn interface_initialize_g = 0;
-#define INTERFACE_INIT NULL
-
-
-/*-------------------------------------------------------------------------
- * Function: H5F_low_class
- *
- * Purpose: Given a driver identifier return the class pointer for that
- * low-level driver.
- *
- * Return: Success: A low-level driver class pointer.
- *
- * Failure: NULL
- *
- * Programmer: Robb Matzke
- * Wednesday, February 18, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-const H5F_low_class_t *
-H5F_low_class (H5F_driver_t driver)
-{
- const H5F_low_class_t *type = NULL;
-
- FUNC_ENTER (H5F_low_class, NULL);
-
- switch (driver) {
- case H5F_LOW_STDIO:
- type = H5F_LOW_STDIO_g;
- break;
-
- case H5F_LOW_SEC2:
- type = H5F_LOW_SEC2_g;
- break;
-
- case H5F_LOW_CORE:
- type = H5F_LOW_CORE_g;
- break;
-
-#ifdef HAVE_PARALLEL
- case H5F_LOW_MPIO:
- type = H5F_LOW_MPIO_g;
- break;
-#endif
-
- case H5F_LOW_SPLIT:
- type = H5F_LOW_SPLIT_g;
- break;
-
- case H5F_LOW_FAMILY:
- type = H5F_LOW_FAMILY_g;
- break;
-
- default:
- HRETURN_ERROR (H5E_IO, H5E_UNSUPPORTED, NULL,
- "unknown low-level driver");
- }
-
- FUNC_LEAVE (type);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: H5F_low_open
- *
- * Purpose: Opens a file of type TYPE with name NAME according to the
- * field of bit flags FLAGS which are:
- *
- * H5F_ACC_WRITE: The file is open for read/write access.
- * Without this bit set, the file would be open
- * for read-only access.
- *
- * H5F_ACC_CREAT: The file is created if it doesn't already
- * exist. On unix, the file permissions are set
- * to 0666 modified by the umask.
- *
- * H5F_ACC_EXCL: This function will fail if the file already
- * exists.
- *
- * H5F_ACC_TRUNC: Truncate the file to a zero-length file as it
- * is opened. This allows existing files to be
- * overwritten.
- *
- * The KEY argument is initialized with data which is unique to
- * this file. Opening the same file (even by a different name)
- * should return the same key.
- *
- * This is a virtual function only; the actual open operation is
- * performed by the subclass. This function will fail if the
- * subclass hasn't defined an open method.
- *
- * Errors:
- * IO CANTOPENFILE Open failed.
- *
- * Return: Success: Pointer to the new file descriptor.
- *
- * Failure: NULL
- *
- * Programmer: Robb Matzke
- * Wednesday, October 22, 1997
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-H5F_low_t *
-H5F_low_open(const H5F_low_class_t *type, const char *name,
- const H5F_access_t *access_parms, uintn flags,
- H5F_search_t *key/*out*/)
-{
- H5F_low_t *lf = NULL;
-
- FUNC_ENTER(H5F_low_open, NULL);
-
- assert(type && type->open);
- assert(name && *name);
-
- if (NULL == (lf = (type->open) (name, access_parms, flags, key))) {
- HRETURN_ERROR(H5E_IO, H5E_CANTOPENFILE, NULL, "open failed");
- }
- lf->type = type;
-
- FUNC_LEAVE(lf);
-}
-
-/*-------------------------------------------------------------------------
- * Function: H5F_low_close
- *
- * Purpose: Closes a low-level file. The subclass should free all
- * resources used by the file descriptor but should not free the
- * file descriptor itself. The close method in the subclass is
- * optional; lack of a close method results in only the file
- * descriptor being freed.
- *
- * It is safe to call this function with a null pointer for the
- * file descriptor. This function returns a null pointer that
- * the caller can assign to the file descriptor pointer as it's
- * closed like `desc=H5F_low_close(desc)'.
- *
- * Errors:
- * IO CLOSEERROR Close failed.
- *
- * Return: Success: NULL
- *
- * Failure: NULL
- *
- * Programmer: Robb Matzke
- * Wednesday, October 22, 1997
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-H5F_low_t *
-H5F_low_close(H5F_low_t *lf, const H5F_access_t *access_parms)
-{
- FUNC_ENTER(H5F_low_close, NULL);
-
- if (lf) {
- if ((lf->type->close) (lf, access_parms) < 0) {
- H5MM_xfree(lf);
- HRETURN_ERROR(H5E_IO, H5E_CLOSEERROR, NULL, "close failed");
- }
- H5MM_xfree(lf);
- }
- FUNC_LEAVE(NULL);
-}
-
-/*-------------------------------------------------------------------------
- * Function: H5F_low_read
- *
- * Purpose: Reads SIZE bytes of data beginning at address ADDR of the
- * file LF and puts the result in BUF. Behavior when reading
- * past the logical or physical end of file is to return zeros
- * for that part of the request.
- *
- * This is only a virtual function; the subclass must define a
- * read method or this function will fail.
- *
- * Errors:
- * IO READERROR Read failed.
- * IO UNSUPPORTED No read method.
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Robb Matzke
- * Wednesday, October 22, 1997
- *
- * Modifications:
- * Albert Cheng, 1998-06-02
- * Added XFER_MODE argument.
- *
- * Robb Matzke, 1999-07-28
- * The ADDR argument is passed by value.
- *-------------------------------------------------------------------------
- */
-herr_t
-H5F_low_read(H5F_low_t *lf, const H5F_access_t *access_parms,
- const H5F_xfer_t *xfer_parms, haddr_t addr, size_t size,
- uint8_t *buf/*out*/)
-{
- herr_t ret_value = FAIL;
-
- FUNC_ENTER(H5F_low_read, FAIL);
-
- assert(lf && lf->type);
- assert(H5F_addr_defined(addr));
- assert(buf);
-
- if (lf->type->read) {
- if ((ret_value = (lf->type->read) (lf, access_parms, xfer_parms,
- addr, size, buf)) < 0) {
- HRETURN_ERROR(H5E_IO, H5E_READERROR, ret_value, "read failed");
- }
- } else {
- HRETURN_ERROR(H5E_IO, H5E_UNSUPPORTED, FAIL, "no read method");
- }
-
- FUNC_LEAVE(ret_value);
-}
-
-/*-------------------------------------------------------------------------
- * Function: H5F_low_write
- *
- * Purpose: Writes SIZE bytes of data from BUF into the file LF beginning
- * at address ADDR of the file. Writing past the logical or
- * physical end of file causes the file to be extended.
- *
- * This is a virtual function only; if the subclass doesn't
- * define a write method then this function will fail.
- *
- * Errors:
- * IO UNSUPPORTED No write method.
- * IO WRITEERROR Write failed.
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Robb Matzke
- * Wednesday, October 22, 1997
- *
- * Modifications:
- * Albert Cheng, 1998-06-02
- * Added XFER_MODE argument.
- *
- * rky, 1998-08-16
- * Accommodate fancy MPI derived datatype writes.
- *
- * rky, 1998-09-02
- * For non-block parallel writes, don't change value of lf->eof.
- *
- * Robb Matzke, 1999-07-28
- * The ADDR argument is passed by value.
- *-------------------------------------------------------------------------
- */
-herr_t
-H5F_low_write(H5F_low_t *lf, const H5F_access_t *access_parms,
- const H5F_xfer_t *xfer_parms, haddr_t addr, size_t size,
- const uint8_t *buf)
-{
- herr_t ret_value = FAIL;
- haddr_t tmp_addr;
-
- FUNC_ENTER(H5F_low_write, FAIL);
-
- assert(lf && lf->type);
- assert(H5F_addr_defined(addr));
- assert(buf);
-
- /* check for writing past the end of file marker */
- tmp_addr = addr + (hsize_t)size;
- if (H5F_addr_gt(tmp_addr, lf->eof))
- HRETURN_ERROR(H5E_IO, H5E_OVERFLOW, ret_value, "write past end of logical file");
-
- /* Check if the last byte of the logical file has been written */
- if (!lf->eof_written && H5F_addr_eq(tmp_addr, lf->eof))
- lf->eof_written=1;
-
- /* Write the data */
- if (lf->type->write) {
- if ((ret_value = (lf->type->write) (lf, access_parms, xfer_parms,
- addr, size, buf)) < 0) {
- HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, ret_value, "write failed");
- }
- } else {
- HRETURN_ERROR(H5E_IO, H5E_UNSUPPORTED, FAIL, "no write method");
- }
-
- FUNC_LEAVE(ret_value);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: H5F_low_flush
- *
- * Purpose: Flushes file buffers to disk. For instance, the stdio.h
- * 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: Non-negative on success/Negative on failure
- *
- * Programmer: Robb Matzke
- * Monday, November 10, 1997
- *
- * Modifications:
- * rky 980828 Only p0 writes metadata to disk.
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5F_low_flush(H5F_low_t *lf, const H5F_access_t *access_parms)
-{
- haddr_t last_byte;
- uint8_t 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 */
- last_byte = 0;
- if (!lf->eof_written && H5F_addr_defined(lf->eof) &&
- H5F_addr_gt(lf->eof, last_byte)) {
- last_byte = lf->eof;
- last_byte -= 1;
- if (H5F_low_read(lf, access_parms, &H5F_xfer_dflt, last_byte,
- 1, buf) >= 0) {
-#ifdef HAVE_PARALLEL
- H5F_mpio_tas_allsame( lf, TRUE ); /* only p0 will write */
-#endif /* HAVE_PARALLEL */
- H5F_low_write(lf, access_parms, &H5F_xfer_dflt, last_byte,
- 1, buf);
- }
- else
- HRETURN_ERROR(H5E_IO, H5E_READERROR, FAIL,
- "low level flush failed");
- }
- /* Invoke the subclass the flush method */
- if (lf->type->flush) {
- if ((lf->type->flush) (lf, access_parms) < 0) {
- HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, FAIL,
- "low level flush failed");
- }
- }
- FUNC_LEAVE(SUCCEED);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: H5F_low_size
- *
- * Purpose: Returns the current logical size of the file in bytes. This
- * may differ from the physical size of the file (most
- * subclasses extend the physical file size during the write
- * operation instead of the alloc operation).
- *
- * The next absolute file address is returned through the
- * EOF argument. This is the address of the logical end of
- * file (that is, the address of the first byte past the last
- * byte which is logically in the file).
- *
- * Warning: The return value type may not be large enough to represent
- * the true size of the file. In such cases, the maximum
- * possible size is returned. It is better to look at the EOF
- * output argument to determine the total size.
- *
- * Errors:
- * IO UNSUPPORTED No size method.
- *
- * Return: Success: Current size of file
- *
- * Failure: 0
- *
- * Programmer: Robb Matzke
- * Wednesday, October 22, 1997
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-hsize_t
-H5F_low_size(H5F_low_t *lf, haddr_t *eof_p/*out*/)
-{
- hsize_t size = (hsize_t)(-1); /*max possible size */
-
- FUNC_ENTER(H5F_low_size, 0);
-
- assert(lf && lf->type);
- assert(eof_p);
-
- *eof_p = lf->eof;
- if (*eof_p < size) size = *eof_p;
-
- FUNC_LEAVE(size);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: H5F_low_access
- *
- * Purpose: Determines if a file can be accessed in a particular way by a
- * particular subclass. The access modes for a file are the
- * same as those of access(2), namely
- *
- * F_OK: determines if the file (or all parts of a multi-part
- * file) exists.
- *
- * R_OK: determines if the file (or all parts of a multi-part
- * file) are readable.
- *
- * W_OK: determines if the file (or all parts of a multi-part
- * file) are writable.
- *
- * If a subclass doesn't define an access method, then we treat
- * the name as if it were a local Unix file and test
- * accessibility with the access(2) function. The KEY is
- * returned as a device number and i-node pair.
- *
- * Return: Success: TRUE or FALSE. If TRUE, then KEY is
- * initialized with data that makes this file
- * unique (same value as H5F_low_open).
- *
- * Failure: FAIL, KEY is undefined.
- *
- * Programmer: Robb Matzke
- * Friday, October 24, 1997
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-htri_t
-H5F_low_access(const H5F_low_class_t *type, const char *name,
- const H5F_access_t *access_parms, int mode,
- H5F_search_t *key/*out*/)
-{
- htri_t ret_value;
- struct stat sb;
-
- FUNC_ENTER(H5F_low_size, FAIL);
- assert(type);
-
- if (type->access) {
- ret_value = (type->access) (name, access_parms, mode, key /*out*/);
- } else {
- ret_value = (0 == HDaccess(name, mode) ? TRUE : FALSE);
- if (key) {
-
-#ifdef WIN32
-
- int fd;
- HFILE filehandle;
- struct _BY_HANDLE_FILE_INFORMATION fileinfo;
- int results;
-
-
- fd = HDopen(name,_O_RDONLY,0);
- filehandle = _get_osfhandle(fd);
- results = GetFileInformationByHandle(filehandle, &fileinfo);
-
- /*returns a 0 on failure*/
-
- if (!results) {
- ret_value = FALSE;
- }
-
- else {
- HDstat(name,&sb);
- key->dev = sb.st_dev;
- key->ino = 0;
- key->fileindexhi = fileinfo.nFileIndexHigh;
- key->fileindexlo = fileinfo.nFileIndexLow;
- }
-
- HDclose(fd);
-
-
-#else
- HDstat(name, &sb);
- key->dev = sb.st_dev;
- key->ino = sb.st_ino;
-#endif
- }
- }
-
- FUNC_LEAVE(ret_value);
-}
-
-/*-------------------------------------------------------------------------
- * Function: H5F_low_extend
- *
- * Purpose: Increases the logical size of a file by moving the logical
- * end of file marker. A subclass can override this function by
- * providing its own allocation method.
- *
- * Return: Success: Non-negative. The address of the old
- * end-of-file is returned through the ADDR_P
- * argument and the logical size of the file has
- * been extended by SIZE bytes.
- *
- * Failure: Negative.
- *
- * Programmer: Robb Matzke
- * Thursday, November 13, 1997
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5F_low_extend(H5F_low_t *lf, const H5F_access_t *access_parms, intn op,
- hsize_t size, haddr_t *addr_p/*out*/)
-{
- FUNC_ENTER(H5F_low_alloc, FAIL);
-
- assert(lf);
- assert(size > 0);
- assert(addr_p);
-
- /* Reset the EOF written flag */
- lf->eof_written=0;
-
- if (lf->type->extend) {
- if ((lf->type->extend) (lf, access_parms, op, size, addr_p/*out*/)<0) {
- HRETURN_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,
- "unable to extend file");
- }
- } else {
- *addr_p = lf->eof;
- lf->eof += size;
- }
-
- FUNC_LEAVE(SUCCEED);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: H5F_low_alloc
- *
- * Purpose: Determines if a free block BLK can satisfy a request for SIZE
- * bytes of memory from file F. If SIZE >= THRESH then the
- * memory must be aligned on an ALIGN-byte boundary. Alignment
- * is wrt the relative file addresses (that is, the size of the
- * user-defined block at the beginning of the file is subtracted
- * from the addresses before aligning them).
- *
- * Return: Success: Positive if the free block exactly satisfies
- * the request; zero if the free block
- * over-satisfies the request. In either case,
- * ADDR will be the address within the free
- * block where the request can be satisfied.
- *
- * Failure: Negative with the output value of ADDR_P
- * undefined.
- *
- * Programmer: Robb Matzke
- * Tuesday, June 9, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-intn
-H5F_low_alloc (H5F_low_t *lf, intn op, hsize_t alignment, hsize_t threshold,
- hsize_t size, H5MF_free_t *blk, haddr_t *addr_p/*out*/)
-{
- intn ret_value = FAIL;
- hsize_t wasted;
-
- FUNC_ENTER (H5F_low_alloc, FAIL);
- assert (lf);
- assert (alignment>0);
- assert (size>0);
- assert (blk);
- assert (addr_p);
-
- if (lf->type->alloc) {
- ret_value = (lf->type->alloc)(lf, op, alignment, threshold, size, blk,
- addr_p/*out*/);
- } else {
- if (size>=threshold) {
- wasted = blk->addr % alignment;
- } else {
- wasted = 0;
- }
- if (0==wasted && size==blk->size) {
- /* exact match */
- *addr_p = blk->addr;
- ret_value = 1;
- } else if (blk->size>wasted && blk->size-wasted>=size) {
- /* over-satisfied */
- *addr_p = blk->addr + wasted;
- ret_value = 0;
- }
- }
-
- FUNC_LEAVE (ret_value);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: H5F_low_seteof
- *
- * Purpose: Sets the logical end-of-file to the specified address.
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Robb Matzke
- * Thursday, November 13, 1997
- *
- * Modifications:
- * Robb Matzke, 1999-07-28
- * The ADDR argument is passed by value.
- *-------------------------------------------------------------------------
- */
-herr_t
-H5F_low_seteof(H5F_low_t *lf, haddr_t addr)
-{
- FUNC_ENTER(H5F_low_seteof, FAIL);
-
- assert(lf);
- assert(H5F_addr_defined(addr));
-
- lf->eof = addr;
-
- FUNC_LEAVE(SUCCEED);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: H5F_addr_encode
- *
- * Purpose: Encodes an address into the buffer pointed to by *PP and
- * then increments the pointer to the first byte after the
- * address. An undefined value is stored as all 1's.
- *
- * Return: void
- *
- * Programmer: Robb Matzke
- * Friday, November 7, 1997
- *
- * Modifications:
- * Robb Matzke, 1999-07-28
- * The ADDR argument is passed by value.
- *-------------------------------------------------------------------------
- */
-void
-H5F_addr_encode(H5F_t *f, uint8_t **pp/*in,out*/, haddr_t addr)
-{
- uintn i;
- haddr_t tmp;
-
- assert(f);
- assert(pp && *pp);
-
- if (H5F_addr_defined(addr)) {
- tmp = addr;
- for (i=0; i<H5F_SIZEOF_ADDR(f); i++) {
- *(*pp)++ = (uint8_t)(tmp & 0xff);
- tmp >>= 8;
- }
- assert("overflow" && 0 == tmp);
-
- } else {
- for (i=0; i<H5F_SIZEOF_ADDR(f); i++) {
- *(*pp)++ = 0xff;
- }
- }
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: H5F_addr_decode
- *
- * Purpose: Decodes an address from the buffer pointed to by *PP and
- * updates the pointer to point to the next byte after the
- * address.
- *
- * If the value read is all 1's then the address is returned
- * with an undefined value.
- *
- * Return: void
- *
- * Programmer: Robb Matzke
- * Friday, November 7, 1997
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void
-H5F_addr_decode(H5F_t *f, const uint8_t **pp/*in,out*/, haddr_t *addr_p/*out*/)
-{
- uintn i;
- haddr_t tmp;
- uint8_t c;
- hbool_t all_zero = TRUE;
-
- assert(f);
- assert(pp && *pp);
- assert(addr_p);
-
- *addr_p = 0;
-
- for (i=0; i<H5F_SIZEOF_ADDR(f); i++) {
- c = *(*pp)++;
- if (c != 0xff) all_zero = FALSE;
-
- if (i<sizeof(*addr_p)) {
- tmp = c;
- tmp <<= i * 8; /*use tmp to get casting right */
- *addr_p |= tmp;
- } else if (!all_zero) {
- assert(0 == **pp); /*overflow */
- }
- }
- if (all_zero) *addr_p = H5F_ADDR_UNDEF;
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: H5F_addr_pack
- *
- * Purpose: Converts a long[2] array (usually returned from H5G_get_objinfo)
- * back into a haddr_t
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Quincey Koziol
- * Tuesday, October 23, 1998
- *
- * Modifications:
- * Albert Cheng, Feb 18, 1999
- * Changed objno to unsigned long type to be consistent with
- * addr->offset and how it is being called.
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5F_addr_pack(H5F_t UNUSED *f, haddr_t *addr_p/*out*/,
- const unsigned long objno[2])
-{
- assert(f);
- assert(objno);
- assert(addr_p);
-
- *addr_p = objno[0];
-#if SIZEOF_LONG<SIZEOF_UINT64_T
- *addr_p |= ((uint64_t)objno[1]) << (8*sizeof(long));
-#endif
-
- return(SUCCEED);
-}