From 298276970f0324764feb920b3480f25c9e2b98a3 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Mon, 23 Apr 2001 15:04:30 -0500 Subject: [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) --- src/H5Dcontig.c | 44 +++++++++++++++++++++++++++++++++----------- src/H5Fcontig.c | 44 +++++++++++++++++++++++++++++++++----------- 2 files changed, 66 insertions(+), 22 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 (sizeshared->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) { diff --git a/src/H5Fcontig.c b/src/H5Fcontig.c index ce5d096..d24e086 100644 --- a/src/H5Fcontig.c +++ b/src/H5Fcontig.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 (sizeshared->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) { -- cgit v0.12