diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2001-04-23 20:04:30 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2001-04-23 20:04:30 (GMT) |
commit | 298276970f0324764feb920b3480f25c9e2b98a3 (patch) | |
tree | afd1869dd7e53dceda08b8a775b09bf93f4ba6f3 /src/H5Dcontig.c | |
parent | bd994799c3ea1603a723ee01edc406bf8ace7e59 (diff) | |
download | hdf5-298276970f0324764feb920b3480f25c9e2b98a3.zip hdf5-298276970f0324764feb920b3480f25c9e2b98a3.tar.gz hdf5-298276970f0324764feb920b3480f25c9e2b98a3.tar.bz2 |
[svn-r3832] Purpose:
Bug Fix.
Description:
Setting a non-zero userblock size was causing raw data caching code to
break.
Solution:
Changed from using absolute end-of-address-space offsets in cache size
calculations to relative offsets.
Platforms tested:
FreeBSD 4.3 (hawkwind)
Diffstat (limited to 'src/H5Dcontig.c')
-rw-r--r-- | src/H5Dcontig.c | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/src/H5Dcontig.c b/src/H5Dcontig.c index ce5d096..d24e086 100644 --- a/src/H5Dcontig.c +++ b/src/H5Dcontig.c @@ -46,7 +46,8 @@ herr_t H5F_contig_read(H5F_t *f, H5FD_mem_t type, haddr_t addr, hsize_t size, hid_t dxpl_id, void *buf/*out*/) { - haddr_t eoa; /*end of file address */ + haddr_t abs_eoa; /* Absolute end of file address */ + haddr_t rel_eoa; /* Relative end of file address */ FUNC_ENTER(H5F_contig_read, FAIL); @@ -119,11 +120,16 @@ H5F_contig_read(H5F_t *f, H5FD_mem_t type, haddr_t addr, hsize_t size, hid_t dxp f->shared->sieve_loc=addr; /* Make certain we don't read off the end of the file */ - if (HADDR_UNDEF==(eoa=H5FD_get_eoa(f->shared->lf))) { + if (HADDR_UNDEF==(abs_eoa=H5FD_get_eoa(f->shared->lf))) { HRETURN_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to determine file size"); } - f->shared->sieve_size=MIN(eoa-addr,f->shared->sieve_buf_size); + + /* Adjust absolute EOA address to relative EOA address */ + rel_eoa=abs_eoa-f->shared->base_addr; + + /* Compute the size of the sieve buffer */ + f->shared->sieve_size=MIN(rel_eoa-addr,f->shared->sieve_buf_size); /* Read the new sieve buffer */ if (H5F_block_read(f, type, f->shared->sieve_loc, f->shared->sieve_size, dxpl_id, f->shared->sieve_buf)<0) { @@ -161,11 +167,16 @@ H5F_contig_read(H5F_t *f, H5FD_mem_t type, haddr_t addr, hsize_t size, hid_t dxp f->shared->sieve_loc=addr; /* Make certain we don't read off the end of the file */ - if (HADDR_UNDEF==(eoa=H5FD_get_eoa(f->shared->lf))) { + if (HADDR_UNDEF==(abs_eoa=H5FD_get_eoa(f->shared->lf))) { HRETURN_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to determine file size"); } - f->shared->sieve_size=MIN(eoa-addr,f->shared->sieve_buf_size); + + /* Adjust absolute EOA address to relative EOA address */ + rel_eoa=abs_eoa-f->shared->base_addr; + + /* Compute the size of the sieve buffer */ + f->shared->sieve_size=MIN(rel_eoa-addr,f->shared->sieve_buf_size); /* Read the new sieve buffer */ if (H5F_block_read(f, type, f->shared->sieve_loc, f->shared->sieve_size, dxpl_id, f->shared->sieve_buf)<0) { @@ -213,9 +224,10 @@ herr_t H5F_contig_write(H5F_t *f, H5FD_mem_t type, haddr_t addr, hsize_t size, hid_t dxpl_id, const void *buf) { - haddr_t eoa; /*end of file address */ + haddr_t abs_eoa; /* Absolute end of file address */ + haddr_t rel_eoa; /* Relative end of file address */ - FUNC_ENTER(H5F_block_write, FAIL); + FUNC_ENTER(H5F_contig_write, FAIL); assert (f); assert (size<SIZET_MAX); @@ -293,11 +305,16 @@ H5F_contig_write(H5F_t *f, H5FD_mem_t type, haddr_t addr, hsize_t size, f->shared->sieve_loc=addr; /* Make certain we don't read off the end of the file */ - if (HADDR_UNDEF==(eoa=H5FD_get_eoa(f->shared->lf))) { + if (HADDR_UNDEF==(abs_eoa=H5FD_get_eoa(f->shared->lf))) { HRETURN_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to determine file size"); } - f->shared->sieve_size=MIN(eoa-addr,f->shared->sieve_buf_size); + + /* Adjust absolute EOA address to relative EOA address */ + rel_eoa=abs_eoa-f->shared->base_addr; + + /* Compute the size of the sieve buffer */ + f->shared->sieve_size=MIN(rel_eoa-addr,f->shared->sieve_buf_size); /* Read the new sieve buffer */ if (H5F_block_read(f, type, f->shared->sieve_loc, f->shared->sieve_size, dxpl_id, f->shared->sieve_buf)<0) { @@ -336,11 +353,16 @@ H5F_contig_write(H5F_t *f, H5FD_mem_t type, haddr_t addr, hsize_t size, f->shared->sieve_loc=addr; /* Make certain we don't read off the end of the file */ - if (HADDR_UNDEF==(eoa=H5FD_get_eoa(f->shared->lf))) { + if (HADDR_UNDEF==(abs_eoa=H5FD_get_eoa(f->shared->lf))) { HRETURN_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to determine file size"); } - f->shared->sieve_size=MIN(eoa-addr,f->shared->sieve_buf_size); + + /* Adjust absolute EOA address to relative EOA address */ + rel_eoa=abs_eoa-f->shared->base_addr; + + /* Compute the size of the sieve buffer */ + f->shared->sieve_size=MIN(rel_eoa-addr,f->shared->sieve_buf_size); /* Read the new sieve buffer */ if (H5F_block_read(f, type, f->shared->sieve_loc, f->shared->sieve_size, dxpl_id, f->shared->sieve_buf)<0) { |