summaryrefslogtreecommitdiffstats
path: root/src/H5MF.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5MF.c')
-rw-r--r--src/H5MF.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/H5MF.c b/src/H5MF.c
index 9d22c8a..fd5031b 100644
--- a/src/H5MF.c
+++ b/src/H5MF.c
@@ -128,3 +128,89 @@ H5MF_free(H5F_t __unused__ *f, const haddr_t *addr, hsize_t size)
FUNC_LEAVE(SUCCEED);
}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5MF_realloc
+ *
+ * Purpose: Changes the size of an allocated chunk, possibly moving it to
+ * a new address. The chunk to change is at address ORIG_ADDR
+ * and is exactly ORIG_SIZE bytes (if these are zero and undef
+ * then this function acts like H5MF_alloc). The new size will
+ * be NEW_SIZE and its address is returned though NEW_ADDR (if
+ * NEW_SIZE is zero then this function acts like H5MF_free and
+ * an undefined address is returned for NEW_ADDR).
+ *
+ * If the new size is less than the old size then the new
+ * address will be the same as the old address (except for the
+ * special case where the new size is zero).
+ *
+ * If the new size is more than the old size then most likely a
+ * new address will be returned. However, under certain
+ * circumstances the library may return the same address.
+ *
+ * Return: Success: SUCCEED
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Robb Matzke
+ * Thursday, April 16, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_realloc (H5F_t *f, intn op, hsize_t orig_size, const haddr_t *orig_addr,
+ hsize_t new_size, haddr_t *new_addr/*out*/)
+{
+ FUNC_ENTER (H5MF_realloc, FAIL);
+
+ if (0==orig_size) {
+ /* Degenerate to H5MF_alloc() */
+ assert (!H5F_addr_defined (orig_addr));
+ if (new_size>0) {
+ if (H5MF_alloc (f, op, new_size, new_addr/*out*/)<0) {
+ HRETURN_ERROR (H5E_RESOURCE, H5E_CANTINIT, FAIL,
+ "unable to allocate new file memory");
+ }
+ } else {
+ H5F_addr_undef (new_addr);
+ }
+
+ } else if (0==new_size) {
+ /* Degenerate to H5MF_free() */
+ assert (H5F_addr_defined (orig_addr));
+ if (H5MF_free (f, orig_addr, orig_size)<0) {
+ HRETURN_ERROR (H5E_RESOURCE, H5E_CANTINIT, FAIL,
+ "unable to free old file memory");
+ }
+ H5F_addr_undef (new_addr);
+
+ } else if (new_size > orig_size) {
+ /* Size is getting larger */
+ if (H5MF_alloc (f, op, new_size, new_addr/*out*/)<0) {
+ HRETURN_ERROR (H5E_RESOURCE, H5E_CANTINIT, FAIL,
+ "unable to allocate new file memory");
+ }
+ if (H5MF_free (f, orig_addr, orig_size)<0) {
+ HRETURN_ERROR (H5E_RESOURCE, H5E_CANTINIT, FAIL,
+ "unable to free old file memory");
+ }
+
+ } else {
+ /* New size is not larger */
+#ifdef H5MF_DEBUG
+ if (new_size<orig_size) {
+ HDfprintf (stderr, "H5MF: realloc lost %Hd bytes\n",
+ orig_size-new_size);
+ }
+#endif
+ *new_addr = *orig_addr;
+ }
+
+ FUNC_LEAVE (SUCCEED);
+}
+
+
+