summaryrefslogtreecommitdiffstats
path: root/src/H5Fcore.c
diff options
context:
space:
mode:
authorRobb Matzke <matzke@llnl.gov>1997-10-24 21:03:10 (GMT)
committerRobb Matzke <matzke@llnl.gov>1997-10-24 21:03:10 (GMT)
commit833e82fec5f654c1ed93a6e4e4266f280e20311c (patch)
tree4c1f5d776652cfef707455fbee246af0a5780a80 /src/H5Fcore.c
parente1e488bd4758a0e5b85a8e04052146a93c3e5751 (diff)
downloadhdf5-833e82fec5f654c1ed93a6e4e4266f280e20311c.zip
hdf5-833e82fec5f654c1ed93a6e4e4266f280e20311c.tar.gz
hdf5-833e82fec5f654c1ed93a6e4e4266f280e20311c.tar.bz2
[svn-r134] Changes since 19971023
---------------------- ./config/conclude.in Test work when `.' isn't in $PATH. ./src/H5F.c ./src/H5Fcore.c NEW ./src/H5Flow.c ./src/H5Fprivate.h ./src/H5Fsec2.c ./src/H5Fstdio.c ./src/Makefile.in ./MANIFEST Added the in-core temporary file driver as an exercise to clean up some of the H5F package. It speeds up `testhdf5 -o stab' by 25 percent! If you want to try it you'll need to recompile everything with `-DH5F_LOW_DFLT=H5F_LOW_CORE'. Don't expect testhdf5 to ever work since creating a file, closing it, and then opening it for read-only will fail.
Diffstat (limited to 'src/H5Fcore.c')
-rw-r--r--src/H5Fcore.c297
1 files changed, 297 insertions, 0 deletions
diff --git a/src/H5Fcore.c b/src/H5Fcore.c
new file mode 100644
index 0000000..b28a12a
--- /dev/null
+++ b/src/H5Fcore.c
@@ -0,0 +1,297 @@
+/*
+ * Copyright (C) 1997 NCSA
+ * All rights reserved.
+ *
+ * Programmer: Robb Matzke <matzke@llnl.gov>
+ * Wednesday, October 22, 1997
+ *
+ * Purpose: This file implements an in-core temporary file. It's intended
+ * for storing small temporary files such as wrappers generated
+ * on the fly.
+ *
+ * Note: This is mostly an exercise to help clean up parts of the H5F
+ * package since this driver is quite different than the other
+ * low level drivers we have so far.
+ *
+ */
+#include <H5private.h>
+#include <H5Eprivate.h>
+#include <H5Fprivate.h>
+#include <H5MMprivate.h>
+
+#define H5F_CORE_INC 10240 /*amount by which to grow file */
+#define H5F_CORE_DEV 0xffff /*pseudo dev for core until we fix things*/
+
+#define PABLO_MASK H5F_core
+static hbool_t interface_initialize_g = FALSE;
+
+static hbool_t H5F_core_access (const char *name, int mode, H5F_search_t *key);
+static H5F_low_t *H5F_core_open (const char *name, uintn flags, H5F_search_t*);
+static herr_t H5F_core_close (H5F_low_t *lf);
+static herr_t H5F_core_read (H5F_low_t *lf, haddr_t addr, size_t size,
+ uint8 *buf);
+static herr_t H5F_core_write (H5F_low_t *lf, haddr_t addr, size_t size,
+ const uint8 *buf);
+static herr_t H5F_core_flush (H5F_low_t *lf);
+static size_t H5F_core_size (H5F_low_t *lf);
+
+
+const H5F_low_class_t H5F_LOW_CORE[1] = {{
+ H5F_core_access, /* access method */
+ H5F_core_open, /* open method */
+ H5F_core_close, /* close method */
+ H5F_core_read, /* read method */
+ H5F_core_write, /* write method */
+ H5F_core_flush, /* flush method */
+ H5F_core_size, /* file size method */
+}};
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5F_core_access
+ *
+ * Purpose: Determines if the specified file already exists. This driver
+ * doesn't use names, so every call to H5F_core_open() would
+ * create a new file. Therefore, this function always returns
+ * false.
+ *
+ * Return: Success: FALSE
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Robb Matzke
+ * Friday, October 24, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+H5F_core_access (const char *name, int mode, H5F_search_t *key)
+{
+ FUNC_ENTER (H5F_core_access, NULL, FAIL);
+ FUNC_LEAVE (FALSE);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5F_core_open
+ *
+ * Purpose: Opens a temporary file which will exist only in memory. The
+ * NAME argument is unused. The FLAGS are a bit field with
+ * the possible values defined in H5F_low_open().
+ *
+ * Errors:
+ * IO CANTOPENFILE Must creat file with write access.
+ *
+ * Return: Success: Low-level file pointer
+ *
+ * Failure: NULL
+ *
+ * Programmer: Robb Matzke
+ * Wednesday, October 22, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5F_low_t *
+H5F_core_open (const char *name, uintn flags, H5F_search_t *key)
+{
+ H5F_low_t *lf = NULL;
+ static ino_t ino=0;
+
+ FUNC_ENTER (H5F_core_open, NULL, NULL);
+
+ if (0==(flags & H5F_ACC_WRITE) || 0==(flags & H5F_ACC_CREAT)) {
+ /* must creat file with write access */
+ HRETURN_ERROR (H5E_IO, H5E_CANTOPENFILE, NULL);
+ }
+
+ lf = H5MM_xcalloc (1, sizeof(H5F_low_t));
+ lf->u.core.mem = H5MM_xmalloc (H5F_CORE_INC);
+ lf->u.core.alloc = H5F_CORE_INC;
+ lf->u.core.size = 0;
+
+ if (key) {
+ key->dev = H5F_CORE_DEV;
+ key->ino = ino++;
+ }
+
+ FUNC_LEAVE (lf);
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5F_core_close
+ *
+ * Purpose: Closes a file.
+ *
+ * Errors:
+ *
+ * Return: Success: SUCCEED
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Robb Matzke
+ * Wednesday, October 22, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_core_close (H5F_low_t *lf)
+{
+ FUNC_ENTER (H5F_core_close, NULL, FAIL);
+
+ lf->u.core.mem = H5MM_xfree (lf->u.core.mem);
+ lf->u.core.size = 0;
+ lf->u.core.alloc = 0;
+
+ FUNC_LEAVE (SUCCEED);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5F_core_read
+ *
+ * Purpose: Reads SIZE bytes beginning at address ADDR in file LF and
+ * places them in buffer BUF. Reading past the end of the
+ * file returns zeros instead of failing.
+ *
+ * Errors:
+ *
+ * Return: Success: SUCCEED
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Robb Matzke
+ * Wednesday, October 22, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_core_read (H5F_low_t *lf, haddr_t addr, size_t size, uint8 *buf)
+{
+ size_t n;
+
+ FUNC_ENTER (H5F_core_read, NULL, FAIL);
+
+ if (addr>=lf->u.core.size) {
+ HDmemset (buf, 0, size);
+ } else {
+ n = MIN (size, lf->u.core.size - addr);
+ HDmemcpy (buf, lf->u.core.mem + addr, n);
+ HDmemset (buf+n, 0, size-n);
+ }
+
+ FUNC_LEAVE (SUCCEED);
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5F_core_write
+ *
+ * Purpose: Writes SIZE bytes from the beginning of BUF into file LF at
+ * file address ADDR.
+ *
+ * Errors:
+ *
+ * Return: Success: SUCCEED
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Robb Matzke
+ * Wednesday, October 22, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_core_write (H5F_low_t *lf, haddr_t addr, size_t size, const uint8 *buf)
+{
+ FUNC_ENTER (H5F_core_write, NULL, FAIL);
+
+ /* Allocate more space */
+ if (addr+size>lf->u.core.alloc) {
+ lf->u.core.alloc = lf->u.core.alloc + MAX (addr+size-lf->u.core.alloc,
+ H5F_CORE_INC);
+ lf->u.core.mem = H5MM_xrealloc (lf->u.core.mem, lf->u.core.alloc);
+ }
+
+ /* Move EOF marker */
+ if (addr+size>lf->u.core.size) {
+ lf->u.core.size = addr + size;
+ }
+
+ /* Copy data */
+ HDmemcpy (lf->u.core.mem+addr, buf, size);
+
+ FUNC_LEAVE (SUCCEED);
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5F_core_flush
+ *
+ * Purpose: Makes sure that all data is flushed. This doesn't apply to
+ * this driver.
+ *
+ * Errors:
+ *
+ * Return: Success: SUCCEED
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Robb Matzke
+ * Wednesday, October 22, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_core_flush (H5F_low_t *lf)
+{
+ FUNC_ENTER (H5F_core_flush, NULL, FAIL);
+
+ /* Not necessary with this driver */
+
+ FUNC_LEAVE (SUCCEED);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5F_core_size
+ *
+ * Purpose: Returns the current size of the file in bytes.
+ *
+ * Bugs: There is no way to determine if this function failed.
+ *
+ * Errors:
+ *
+ * Return: Success: Size of file in bytes
+ *
+ * Failure: 0
+ *
+ * Programmer: Robb Matzke
+ * Wednesday, October 22, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5F_core_size (H5F_low_t *lf)
+{
+ FUNC_ENTER (H5F_core_size, NULL, 0);
+
+ FUNC_LEAVE (lf->u.core.size);
+}