diff options
author | Allen Byrne <byrn@hdfgroup.org> | 2020-10-01 14:04:36 (GMT) |
---|---|---|
committer | Allen Byrne <byrn@hdfgroup.org> | 2020-10-01 14:04:36 (GMT) |
commit | f1ba03cea5b82699a984c80bd2deac14fdc8df18 (patch) | |
tree | ebe777c3e0b83f4c4cec9212731da9ebe0a0cfd3 /src/H5FDspace.c | |
parent | 10343c197906415388f2a4c8d292e21d25cf7381 (diff) | |
download | hdf5-f1ba03cea5b82699a984c80bd2deac14fdc8df18.zip hdf5-f1ba03cea5b82699a984c80bd2deac14fdc8df18.tar.gz hdf5-f1ba03cea5b82699a984c80bd2deac14fdc8df18.tar.bz2 |
Source formatted
Diffstat (limited to 'src/H5FDspace.c')
-rw-r--r-- | src/H5FDspace.c | 153 |
1 files changed, 69 insertions, 84 deletions
diff --git a/src/H5FDspace.c b/src/H5FDspace.c index 22d7e22..38a96fb 100644 --- a/src/H5FDspace.c +++ b/src/H5FDspace.c @@ -26,20 +26,18 @@ /* Module Setup */ /****************/ -#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ - +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ /***********/ /* Headers */ /***********/ -#include "H5private.h" /* Generic Functions */ -#include "H5CXprivate.h" /* API Contexts */ -#include "H5Eprivate.h" /* Error handling */ -#include "H5Fprivate.h" /* File access */ -#include "H5FDpkg.h" /* File Drivers */ -#include "H5FDmulti.h" /* Usage-partitioned file family */ -#include "H5FLprivate.h" /* Free lists */ - +#include "H5private.h" /* Generic Functions */ +#include "H5CXprivate.h" /* API Contexts */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Fprivate.h" /* File access */ +#include "H5FDpkg.h" /* File Drivers */ +#include "H5FDmulti.h" /* Usage-partitioned file family */ +#include "H5FLprivate.h" /* Free lists */ /****************/ /* Local Macros */ @@ -48,32 +46,26 @@ /* Define this to display information about file allocations */ /* #define H5FD_ALLOC_DEBUG */ - /******************/ /* Local Typedefs */ /******************/ - /********************/ /* Package Typedefs */ /********************/ - /********************/ /* Local Prototypes */ /********************/ - /*********************/ /* Package Variables */ /*********************/ - /*****************************/ /* Library Private Variables */ /*****************************/ - /*******************/ /* Local Variables */ /*******************/ @@ -81,8 +73,6 @@ /* Declare a free list to manage the H5FD_free_t struct */ H5FL_DEFINE(H5FD_free_t); - - /*------------------------------------------------------------------------- * Function: H5FD__extend * @@ -101,8 +91,8 @@ H5FL_DEFINE(H5FD_free_t); static haddr_t H5FD__extend(H5FD_t *file, H5FD_mem_t type, hsize_t size) { - haddr_t eoa; /* Address of end-of-allocated space */ - haddr_t ret_value = HADDR_UNDEF; /* Return value */ + haddr_t eoa; /* Address of end-of-allocated space */ + haddr_t ret_value = HADDR_UNDEF; /* Return value */ FUNC_ENTER_STATIC @@ -116,7 +106,7 @@ H5FD__extend(H5FD_t *file, H5FD_mem_t type, hsize_t size) eoa = file->cls->get_eoa(file, type); /* Check for overflow when extending */ - if(H5F_addr_overflow(eoa, size) || (eoa + size) > file->maxaddr) + if (H5F_addr_overflow(eoa, size) || (eoa + size) > file->maxaddr) HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, HADDR_UNDEF, "file allocation request failed") /* Set the [NOT aligned] address to return */ @@ -124,14 +114,13 @@ H5FD__extend(H5FD_t *file, H5FD_mem_t type, hsize_t size) /* Extend the end-of-allocated space address */ eoa += size; - if(file->cls->set_eoa(file, type, eoa) < 0) + if (file->cls->set_eoa(file, type, eoa) < 0) HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, HADDR_UNDEF, "file allocation request failed") done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD__extend() */ - /*------------------------------------------------------------------------- * Function: H5FD__alloc_real * @@ -148,19 +137,18 @@ done: *------------------------------------------------------------------------- */ haddr_t -H5FD__alloc_real(H5FD_t *file, H5FD_mem_t type, hsize_t size, haddr_t *frag_addr, - hsize_t *frag_size) +H5FD__alloc_real(H5FD_t *file, H5FD_mem_t type, hsize_t size, haddr_t *frag_addr, hsize_t *frag_size) { - hsize_t orig_size = size; /* Original allocation size */ - haddr_t eoa; /* Address of end-of-allocated space */ - hsize_t extra; /* Extra space to allocate, to align request */ - unsigned long flags = 0; /* Driver feature flags */ - hbool_t use_alloc_size; /* Just pass alloc size to the driver */ - haddr_t ret_value = HADDR_UNDEF; /* Return value */ + hsize_t orig_size = size; /* Original allocation size */ + haddr_t eoa; /* Address of end-of-allocated space */ + hsize_t extra; /* Extra space to allocate, to align request */ + unsigned long flags = 0; /* Driver feature flags */ + hbool_t use_alloc_size; /* Just pass alloc size to the driver */ + haddr_t ret_value = HADDR_UNDEF; /* Return value */ FUNC_ENTER_PACKAGE #ifdef H5FD_ALLOC_DEBUG -HDfprintf(stderr, "%s: type = %u, size = %Hu\n", FUNC, (unsigned)type, size); + HDfprintf(stderr, "%s: type = %u, size = %Hu\n", FUNC, (unsigned)type, size); #endif /* H5FD_ALLOC_DEBUG */ /* check args */ @@ -170,7 +158,7 @@ HDfprintf(stderr, "%s: type = %u, size = %Hu\n", FUNC, (unsigned)type, size); HDassert(size > 0); /* Check for query driver and call it */ - if(file->cls->query) + if (file->cls->query) (file->cls->query)(file, &flags); /* Check for the driver feature flag */ @@ -181,39 +169,41 @@ HDfprintf(stderr, "%s: type = %u, size = %Hu\n", FUNC, (unsigned)type, size); /* Compute extra space to allocate, if this should be aligned */ extra = 0; - if(!file->paged_aggr && file->alignment > 1 && orig_size >= file->threshold) { - hsize_t mis_align; /* Amount EOA is misaligned */ + if (!file->paged_aggr && file->alignment > 1 && orig_size >= file->threshold) { + hsize_t mis_align; /* Amount EOA is misaligned */ /* Check for EOA already aligned */ - if((mis_align = (eoa % file->alignment)) > 0) { + if ((mis_align = (eoa % file->alignment)) > 0) { extra = file->alignment - mis_align; - if(frag_addr) - *frag_addr = eoa - file->base_addr; /* adjust for file's base address */ - if(frag_size) + if (frag_addr) + *frag_addr = eoa - file->base_addr; /* adjust for file's base address */ + if (frag_size) *frag_size = extra; } /* end if */ - } /* end if */ + } /* end if */ /* Dispatch to driver `alloc' callback or extend the end-of-address marker */ - /* For the multi/split driver: the size passed down to the alloc callback is the original size from H5FD_alloc() */ - /* For all other drivers: the size passed down to the alloc callback is the size + [possibly] alignment size */ - if(file->cls->alloc) { + /* For the multi/split driver: the size passed down to the alloc callback is the original size from + * H5FD_alloc() */ + /* For all other drivers: the size passed down to the alloc callback is the size + [possibly] alignment + * size */ + if (file->cls->alloc) { ret_value = (file->cls->alloc)(file, type, H5CX_get_dxpl(), use_alloc_size ? size : size + extra); - if(!H5F_addr_defined(ret_value)) + if (!H5F_addr_defined(ret_value)) HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, HADDR_UNDEF, "driver allocation request failed") } /* end if */ else { ret_value = H5FD__extend(file, type, size + extra); - if(!H5F_addr_defined(ret_value)) + if (!H5F_addr_defined(ret_value)) HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, HADDR_UNDEF, "driver eoa update request failed") } /* end else */ /* Set the [possibly aligned] address to return */ - if(!use_alloc_size) + if (!use_alloc_size) ret_value += extra; /* Post-condition sanity check */ - if(!file->paged_aggr && file->alignment > 1 && orig_size >= file->threshold) + if (!file->paged_aggr && file->alignment > 1 && orig_size >= file->threshold) HDassert(!(ret_value % file->alignment)); /* Convert absolute file offset to relative address */ @@ -221,12 +211,11 @@ HDfprintf(stderr, "%s: type = %u, size = %Hu\n", FUNC, (unsigned)type, size); done: #ifdef H5FD_ALLOC_DEBUG -HDfprintf(stderr, "%s: ret_value = %a\n", FUNC, ret_value); + HDfprintf(stderr, "%s: ret_value = %a\n", FUNC, ret_value); #endif /* H5FD_ALLOC_DEBUG */ FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD__alloc_real() */ - /*------------------------------------------------------------------------- * Function: H5FD_alloc * @@ -246,10 +235,9 @@ HDfprintf(stderr, "%s: ret_value = %a\n", FUNC, ret_value); *------------------------------------------------------------------------- */ haddr_t -H5FD_alloc(H5FD_t *file, H5FD_mem_t type, H5F_t *f, hsize_t size, - haddr_t *frag_addr, hsize_t *frag_size) +H5FD_alloc(H5FD_t *file, H5FD_mem_t type, H5F_t *f, hsize_t size, haddr_t *frag_addr, hsize_t *frag_size) { - haddr_t ret_value = HADDR_UNDEF; /* Return value */ + haddr_t ret_value = HADDR_UNDEF; /* Return value */ FUNC_ENTER_NOAPI(HADDR_UNDEF) @@ -261,18 +249,17 @@ H5FD_alloc(H5FD_t *file, H5FD_mem_t type, H5F_t *f, hsize_t size, /* Call the real 'alloc' routine */ ret_value = H5FD__alloc_real(file, type, size, frag_addr, frag_size); - if(!H5F_addr_defined(ret_value)) + if (!H5F_addr_defined(ret_value)) HGOTO_ERROR(H5E_VFL, H5E_CANTALLOC, HADDR_UNDEF, "real 'alloc' request failed") /* Mark EOA info dirty in cache, so change will get encoded */ - if(H5F_eoa_dirty(f) < 0) + if (H5F_eoa_dirty(f) < 0) HGOTO_ERROR(H5E_VFL, H5E_CANTMARKDIRTY, HADDR_UNDEF, "unable to mark EOA info as dirty") done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD_alloc() */ - /*------------------------------------------------------------------------- * Function: H5FD__free_real * @@ -289,7 +276,7 @@ done: herr_t H5FD__free_real(H5FD_t *file, H5FD_mem_t type, haddr_t addr, hsize_t size) { - herr_t ret_value = SUCCEED; /* Return value */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_PACKAGE @@ -300,58 +287,58 @@ H5FD__free_real(H5FD_t *file, H5FD_mem_t type, haddr_t addr, hsize_t size) HDassert(size > 0); #ifdef H5FD_ALLOC_DEBUG -HDfprintf(stderr, "%s: type = %u, addr = %a, size = %Hu\n", FUNC, (unsigned)type, addr, size); + HDfprintf(stderr, "%s: type = %u, addr = %a, size = %Hu\n", FUNC, (unsigned)type, addr, size); #endif /* H5FD_ALLOC_DEBUG */ /* Sanity checking */ - if(!H5F_addr_defined(addr)) + if (!H5F_addr_defined(addr)) HGOTO_ERROR(H5E_VFL, H5E_BADVALUE, FAIL, "invalid file offset") /* Convert address to absolute file offset */ addr += file->base_addr; /* More sanity checking */ - if(addr > file->maxaddr || H5F_addr_overflow(addr, size) || (addr + size) > file->maxaddr) + if (addr > file->maxaddr || H5F_addr_overflow(addr, size) || (addr + size) > file->maxaddr) HGOTO_ERROR(H5E_VFL, H5E_BADVALUE, FAIL, "invalid file free space region to free") /* Check for file driver 'free' callback and call it if available */ - if(file->cls->free) { + if (file->cls->free) { #ifdef H5FD_ALLOC_DEBUG -HDfprintf(stderr, "%s: Letting VFD free space\n", FUNC); + HDfprintf(stderr, "%s: Letting VFD free space\n", FUNC); #endif /* H5FD_ALLOC_DEBUG */ - if((file->cls->free)(file, type, H5CX_get_dxpl(), addr, size) < 0) + if ((file->cls->free)(file, type, H5CX_get_dxpl(), addr, size) < 0) HGOTO_ERROR(H5E_VFL, H5E_CANTFREE, FAIL, "driver free request failed") } /* end if */ /* Check if this free block is at the end of file allocated space. * Truncate it if this is true. */ - else if(file->cls->get_eoa) { - haddr_t eoa; + else if (file->cls->get_eoa) { + haddr_t eoa; eoa = file->cls->get_eoa(file, type); #ifdef H5FD_ALLOC_DEBUG -HDfprintf(stderr, "%s: eoa = %a\n", FUNC, eoa); + HDfprintf(stderr, "%s: eoa = %a\n", FUNC, eoa); #endif /* H5FD_ALLOC_DEBUG */ - if(eoa == (addr + size)) { + if (eoa == (addr + size)) { #ifdef H5FD_ALLOC_DEBUG -HDfprintf(stderr, "%s: Reducing file size to = %a\n", FUNC, addr); + HDfprintf(stderr, "%s: Reducing file size to = %a\n", FUNC, addr); #endif /* H5FD_ALLOC_DEBUG */ - if(file->cls->set_eoa(file, type, addr) < 0) + if (file->cls->set_eoa(file, type, addr) < 0) HGOTO_ERROR(H5E_VFL, H5E_CANTSET, FAIL, "set end of space allocation request failed") } /* end if */ - } /* end else-if */ + } /* end else-if */ else { /* leak memory */ #ifdef H5FD_ALLOC_DEBUG -HDfprintf(stderr, "%s: LEAKED MEMORY!!! type = %u, addr = %a, size = %Hu\n", FUNC, (unsigned)type, addr, size); + HDfprintf(stderr, "%s: LEAKED MEMORY!!! type = %u, addr = %a, size = %Hu\n", FUNC, (unsigned)type, + addr, size); #endif /* H5FD_ALLOC_DEBUG */ - } /* end else */ + } /* end else */ done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD__free_real() */ - /*------------------------------------------------------------------------- * Function: H5FD_free * @@ -373,7 +360,7 @@ done: herr_t H5FD_free(H5FD_t *file, H5FD_mem_t type, H5F_t *f, haddr_t addr, hsize_t size) { - herr_t ret_value = SUCCEED; /* Return value */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(FAIL) @@ -384,18 +371,17 @@ H5FD_free(H5FD_t *file, H5FD_mem_t type, H5F_t *f, haddr_t addr, hsize_t size) HDassert(size > 0); /* Call the real 'free' routine */ - if(H5FD__free_real(file, type, addr, size) < 0) + if (H5FD__free_real(file, type, addr, size) < 0) HGOTO_ERROR(H5E_VFL, H5E_CANTFREE, FAIL, "real 'free' request failed") /* Mark EOA info dirty in cache, so change will get encoded */ - if(H5F_eoa_dirty(f) < 0) + if (H5F_eoa_dirty(f) < 0) HGOTO_ERROR(H5E_VFL, H5E_CANTMARKDIRTY, FAIL, "unable to mark EOA info as dirty") done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD_free() */ - /*------------------------------------------------------------------------- * Function: H5FD_try_extend * @@ -417,8 +403,8 @@ done: htri_t H5FD_try_extend(H5FD_t *file, H5FD_mem_t type, H5F_t *f, haddr_t blk_end, hsize_t extra_requested) { - haddr_t eoa; /* End of allocated space in file */ - htri_t ret_value = FALSE; /* Return value */ + haddr_t eoa; /* End of allocated space in file */ + htri_t ret_value = FALSE; /* Return value */ FUNC_ENTER_NOAPI(FAIL) @@ -430,20 +416,20 @@ H5FD_try_extend(H5FD_t *file, H5FD_mem_t type, H5F_t *f, haddr_t blk_end, hsize_ HDassert(f); /* Retrieve the end of the address space */ - if(HADDR_UNDEF == (eoa = file->cls->get_eoa(file, type))) - HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "driver get_eoa request failed") + if (HADDR_UNDEF == (eoa = file->cls->get_eoa(file, type))) + HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "driver get_eoa request failed") /* Adjust block end by base address of the file, to create absolute address */ blk_end += file->base_addr; /* Check if the block is exactly at the end of the file */ - if(H5F_addr_eq(blk_end, eoa)) { + if (H5F_addr_eq(blk_end, eoa)) { /* Extend the object by extending the underlying file */ - if(HADDR_UNDEF == H5FD__extend(file, type, extra_requested)) + if (HADDR_UNDEF == H5FD__extend(file, type, extra_requested)) HGOTO_ERROR(H5E_VFL, H5E_CANTEXTEND, FAIL, "driver extend request failed") /* Mark EOA info dirty in cache, so change will get encoded */ - if(H5F_eoa_dirty(f) < 0) + if (H5F_eoa_dirty(f) < 0) HGOTO_ERROR(H5E_VFL, H5E_CANTMARKDIRTY, FAIL, "unable to mark EOA info as dirty") /* Indicate success */ @@ -453,4 +439,3 @@ H5FD_try_extend(H5FD_t *file, H5FD_mem_t type, H5F_t *f, haddr_t blk_end, hsize_ done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD_try_extend() */ - |