diff options
Diffstat (limited to 'src/H5MF.c')
-rw-r--r-- | src/H5MF.c | 86 |
1 files changed, 86 insertions, 0 deletions
@@ -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); +} + + + |