From 3bdb11694298551dd1124d36497ac3955c91ba98 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Thu, 24 Apr 2014 11:30:24 -0500 Subject: [svn-r25092] Description: More migration to using H5F_io_info_t pointers and away from using property list IDs internally. Also, clean up some compiler warnings in the cache code. Tested on: Mac OSX/64 10.9.2 (amazon) w/C++, FORTRAN & parallel (h5committest forthcoming) --- src/H5C.c | 58 ++++----- src/H5Cprivate.h | 16 +-- src/H5F.c | 17 ++- src/H5Faccum.c | 368 +++++++++++++++++++++++++++---------------------------- src/H5Fio.c | 8 +- src/H5Fpkg.h | 6 +- test/accum.c | 173 +++++++++++++------------- 7 files changed, 330 insertions(+), 316 deletions(-) diff --git a/src/H5C.c b/src/H5C.c index a63f98e..445e4bf 100644 --- a/src/H5C.c +++ b/src/H5C.c @@ -1240,8 +1240,8 @@ H5C_create(size_t max_cache_size, (cache_ptr->resize_ctl).max_increment = H5C__DEF_AR_MAX_INCREMENT; (cache_ptr->resize_ctl).flash_incr_mode = H5C_flash_incr__off; - (cache_ptr->resize_ctl).flash_multiple = 1.0; - (cache_ptr->resize_ctl).flash_threshold = 0.25; + (cache_ptr->resize_ctl).flash_multiple = 1.0f; + (cache_ptr->resize_ctl).flash_threshold = 0.25f; (cache_ptr->resize_ctl).decr_mode = H5C_decr__off; (cache_ptr->resize_ctl).upper_hr_threshold = H5C__DEF_AR_UPPER_THRESHHOLD; @@ -2392,7 +2392,7 @@ H5C_get_cache_hit_rate(H5C_t * cache_ptr, } else { - *hit_rate_ptr = 0.0; + *hit_rate_ptr = 0.0f; } done: @@ -4273,8 +4273,8 @@ H5C_set_cache_auto_resize_config(H5C_t *cache_ptr, break; case H5C_incr__threshold: - if ( ( config_ptr->lower_hr_threshold <= 0.0 ) || - ( config_ptr->increment <= 1.0 ) || + if ( ( config_ptr->lower_hr_threshold <= (double)0.0f ) || + ( config_ptr->increment <= (double)1.0f ) || ( ( config_ptr->apply_max_increment ) && ( config_ptr->max_increment <= 0 ) ) ) { @@ -4298,8 +4298,8 @@ H5C_set_cache_auto_resize_config(H5C_t *cache_ptr, break; case H5C_decr__threshold: - if ( ( config_ptr->upper_hr_threshold >= 1.0 ) || - ( config_ptr->decrement >= 1.0 ) || + if ( ( config_ptr->upper_hr_threshold >= (double)1.0f ) || + ( config_ptr->decrement >= (double)1.0f ) || ( ( config_ptr->apply_max_decrement ) && ( config_ptr->max_decrement <= 0 ) ) ) { @@ -4309,7 +4309,7 @@ H5C_set_cache_auto_resize_config(H5C_t *cache_ptr, case H5C_decr__age_out: if ( ( ( config_ptr->apply_empty_reserve ) && - ( config_ptr->empty_reserve >= 1.0 ) ) || + ( config_ptr->empty_reserve >= (double)1.0f ) ) || ( ( config_ptr->apply_max_decrement ) && ( config_ptr->max_decrement <= 0 ) ) ) { @@ -4319,10 +4319,10 @@ H5C_set_cache_auto_resize_config(H5C_t *cache_ptr, case H5C_decr__age_out_with_threshold: if ( ( ( config_ptr->apply_empty_reserve ) && - ( config_ptr->empty_reserve >= 1.0 ) ) || + ( config_ptr->empty_reserve >= (double)1.0f ) ) || ( ( config_ptr->apply_max_decrement ) && ( config_ptr->max_decrement <= 0 ) ) || - ( config_ptr->upper_hr_threshold >= 1.0 ) ) { + ( config_ptr->upper_hr_threshold >= (double)1.0f ) ) { cache_ptr->size_decrease_possible = FALSE; } @@ -5814,8 +5814,8 @@ H5C_validate_resize_config(H5C_auto_size_ctl_t * config_ptr, "initial_size must be in the interval [min_size, max_size]"); } - if ( ( config_ptr->min_clean_fraction < 0.0 ) || - ( config_ptr->min_clean_fraction > 1.0 ) ) { + if ( ( config_ptr->min_clean_fraction < (double)0.0f ) || + ( config_ptr->min_clean_fraction > (double)1.0f ) ) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ "min_clean_fraction must be in the interval [0.0, 1.0]"); @@ -5843,14 +5843,14 @@ H5C_validate_resize_config(H5C_auto_size_ctl_t * config_ptr, if ( config_ptr->incr_mode == H5C_incr__threshold ) { - if ( ( config_ptr->lower_hr_threshold < 0.0 ) || - ( config_ptr->lower_hr_threshold > 1.0 ) ) { + if ( ( config_ptr->lower_hr_threshold < (double)0.0f ) || + ( config_ptr->lower_hr_threshold > (double)1.0f ) ) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ "lower_hr_threshold must be in the range [0.0, 1.0]"); } - if ( config_ptr->increment < 1.0 ) { + if ( config_ptr->increment < (double)1.0f ) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ "increment must be greater than or equal to 1.0"); @@ -5875,15 +5875,15 @@ H5C_validate_resize_config(H5C_auto_size_ctl_t * config_ptr, break; case H5C_flash_incr__add_space: - if ( ( config_ptr->flash_multiple < 0.1 ) || - ( config_ptr->flash_multiple > 10.0 ) ) { + if ( ( config_ptr->flash_multiple < (double)0.1f ) || + ( config_ptr->flash_multiple > (double)10.0f ) ) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ "flash_multiple must be in the range [0.1, 10.0]"); } - if ( ( config_ptr->flash_threshold < 0.1 ) || - ( config_ptr->flash_threshold > 1.0 ) ) { + if ( ( config_ptr->flash_threshold < (double)0.1f ) || + ( config_ptr->flash_threshold > (double)1.0f ) ) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ "flash_threshold must be in the range [0.1, 1.0]"); @@ -5911,14 +5911,14 @@ H5C_validate_resize_config(H5C_auto_size_ctl_t * config_ptr, if ( config_ptr->decr_mode == H5C_decr__threshold ) { - if ( config_ptr->upper_hr_threshold > 1.0 ) { + if ( config_ptr->upper_hr_threshold > (double)1.0f ) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ "upper_hr_threshold must be <= 1.0"); } - if ( ( config_ptr->decrement > 1.0 ) || - ( config_ptr->decrement < 0.0 ) ) { + if ( ( config_ptr->decrement > (double)1.0f ) || + ( config_ptr->decrement < (double)0.0f ) ) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ "decrement must be in the interval [0.0, 1.0]"); @@ -5953,8 +5953,8 @@ H5C_validate_resize_config(H5C_auto_size_ctl_t * config_ptr, } if ( ( config_ptr->apply_empty_reserve ) && - ( ( config_ptr->empty_reserve > 1.0 ) || - ( config_ptr->empty_reserve < 0.0 ) ) ) { + ( ( config_ptr->empty_reserve > (double)1.0f ) || + ( config_ptr->empty_reserve < (double)0.0f ) ) ) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ "empty_reserve must be in the interval [0.0, 1.0]"); @@ -5967,8 +5967,8 @@ H5C_validate_resize_config(H5C_auto_size_ctl_t * config_ptr, if ( config_ptr->decr_mode == H5C_decr__age_out_with_threshold ) { - if ( ( config_ptr->upper_hr_threshold > 1.0 ) || - ( config_ptr->upper_hr_threshold < 0.0 ) ) { + if ( ( config_ptr->upper_hr_threshold > (double)1.0f ) || + ( config_ptr->upper_hr_threshold < (double)0.0f ) ) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ "upper_hr_threshold must be in the interval [0.0, 1.0]"); @@ -6399,8 +6399,8 @@ H5C__auto_adjust_cache_size(H5F_t * f, HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); HDassert( cache_ptr->cache_accesses >= (cache_ptr->resize_ctl).epoch_length ); - HDassert( 0.0 <= (cache_ptr->resize_ctl).min_clean_fraction ); - HDassert( (cache_ptr->resize_ctl).min_clean_fraction <= 100.0 ); + HDassert( (double)0.0f <= (cache_ptr->resize_ctl).min_clean_fraction ); + HDassert( (cache_ptr->resize_ctl).min_clean_fraction <= (double)100.0f ); if ( !cache_ptr->resize_enabled ) { @@ -6415,7 +6415,7 @@ H5C__auto_adjust_cache_size(H5F_t * f, HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't get hit rate.") } - HDassert( ( 0.0 <= hit_rate ) && ( hit_rate <= 1.0 ) ); + HDassert( ( (double)0.0f <= hit_rate ) && ( hit_rate <= (double)1.0f ) ); switch ( (cache_ptr->resize_ctl).incr_mode ) { diff --git a/src/H5Cprivate.h b/src/H5Cprivate.h index 7fde69b..433411f 100644 --- a/src/H5Cprivate.h +++ b/src/H5Cprivate.h @@ -905,20 +905,20 @@ typedef struct H5C_cache_entry_t #define H5C__MAX_EPOCH_MARKERS 10 -#define H5C__DEF_AR_UPPER_THRESHHOLD 0.9999 -#define H5C__DEF_AR_LOWER_THRESHHOLD 0.9 +#define H5C__DEF_AR_UPPER_THRESHHOLD 0.9999f +#define H5C__DEF_AR_LOWER_THRESHHOLD 0.9f #define H5C__DEF_AR_MAX_SIZE ((size_t)(16 * 1024 * 1024)) #define H5C__DEF_AR_INIT_SIZE ((size_t)( 1 * 1024 * 1024)) #define H5C__DEF_AR_MIN_SIZE ((size_t)( 1 * 1024 * 1024)) -#define H5C__DEF_AR_MIN_CLEAN_FRAC 0.5 -#define H5C__DEF_AR_INCREMENT 2.0 +#define H5C__DEF_AR_MIN_CLEAN_FRAC 0.5f +#define H5C__DEF_AR_INCREMENT 2.0f #define H5C__DEF_AR_MAX_INCREMENT ((size_t)( 2 * 1024 * 1024)) -#define H5C__DEF_AR_FLASH_MULTIPLE 1.0 -#define H5C__DEV_AR_FLASH_THRESHOLD 0.25 -#define H5C__DEF_AR_DECREMENT 0.9 +#define H5C__DEF_AR_FLASH_MULTIPLE 1.0f +#define H5C__DEV_AR_FLASH_THRESHOLD 0.25f +#define H5C__DEF_AR_DECREMENT 0.9f #define H5C__DEF_AR_MAX_DECREMENT ((size_t)( 1 * 1024 * 1024)) #define H5C__DEF_AR_EPCHS_B4_EVICT 3 -#define H5C__DEF_AR_EMPTY_RESERVE 0.05 +#define H5C__DEF_AR_EMPTY_RESERVE 0.05f #define H5C__MIN_AR_EPOCH_LENGTH 100 #define H5C__DEF_AR_EPOCH_LENGTH 50000 #define H5C__MAX_AR_EPOCH_LENGTH 1000000 diff --git a/src/H5F.c b/src/H5F.c index fb0133a..45ad208 100644 --- a/src/H5F.c +++ b/src/H5F.c @@ -1069,6 +1069,8 @@ H5F_dest(H5F_t *f, hid_t dxpl_id, hbool_t flush) HDassert(f->shared); if(1 == f->shared->nrefs) { + H5F_io_info_t fio_info; /* I/O info for operation */ + /* Flush at this point since the file will be closed. * Only try to flush the file if it was opened with write access, and if * the caller requested a flush. @@ -1138,8 +1140,13 @@ H5F_dest(H5F_t *f, hid_t dxpl_id, hbool_t flush) f->shared->root_grp = NULL; } /* end if */ + /* Set up I/O info for operation */ + fio_info.f = f; + if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(dxpl_id))) + HDONE_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list") + /* Destroy other components of the file */ - if(H5F_accum_reset(f, dxpl_id, TRUE) < 0) + if(H5F__accum_reset(&fio_info, TRUE) < 0) /* Push error, but keep going*/ HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "problems closing file") if(H5FO_dest(f) < 0) @@ -1749,6 +1756,7 @@ done: herr_t H5F_flush(H5F_t *f, hid_t dxpl_id, hbool_t closing) { + H5F_io_info_t fio_info; /* I/O info for operation */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(FAIL) @@ -1776,8 +1784,13 @@ H5F_flush(H5F_t *f, hid_t dxpl_id, hbool_t closing) /* Push error, but keep going*/ HDONE_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush metadata cache") + /* Set up I/O info for operation */ + fio_info.f = f; + if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(dxpl_id))) + HDONE_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list") + /* Flush out the metadata accumulator */ - if(H5F_accum_flush(f, dxpl_id) < 0) + if(H5F__accum_flush(&fio_info) < 0) /* Push error, but keep going*/ HDONE_ERROR(H5E_IO, H5E_CANTFLUSH, FAIL, "unable to flush metadata accumulator") diff --git a/src/H5Faccum.c b/src/H5Faccum.c index ce8c426..ba8c4da 100644 --- a/src/H5Faccum.c +++ b/src/H5Faccum.c @@ -270,7 +270,7 @@ done: /*------------------------------------------------------------------------- - * Function: H5F_accum_adjust + * Function: H5F__accum_adjust * * Purpose: Adjust accumulator size, if necessary * @@ -283,24 +283,19 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5F_accum_adjust(H5F_meta_accum_t *accum, H5FD_t *lf, hid_t dxpl_id, +H5F__accum_adjust(H5F_meta_accum_t *accum, const H5F_io_info_t *fio_info, H5F_accum_adjust_t adjust, size_t size) { - H5P_genplist_t *dxpl; /* DXPL object */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT + FUNC_ENTER_STATIC HDassert(accum); - HDassert(lf); + HDassert(fio_info); HDassert(H5F_ACCUM_APPEND == adjust || H5F_ACCUM_PREPEND == adjust); HDassert(size > 0); HDassert(size <= H5F_ACCUM_MAX_SIZE); - /* Get the DXPL plist object for DXPL ID */ - if(NULL == (dxpl = (H5P_genplist_t *)H5I_object(dxpl_id))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list") - /* Check if we need more buffer space */ if((size + accum->size) > accum->alloc_size) { size_t new_size; /* New size of accumulator */ @@ -354,7 +349,7 @@ H5F_accum_adjust(H5F_meta_accum_t *accum, H5FD_t *lf, hid_t dxpl_id, /* Check if the dirty region overlaps the region to eliminate from the accumulator */ if((accum->size - shrink_size) < (accum->dirty_off + accum->dirty_len)) { /* Write out the dirty region from the metadata accumulator, with dispatch to driver */ - if(H5FD_write(lf, dxpl, H5FD_MEM_DEFAULT, (accum->loc + accum->dirty_off), accum->dirty_len, (accum->buf + accum->dirty_off)) < 0) + if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, H5FD_MEM_DEFAULT, (accum->loc + accum->dirty_off), accum->dirty_len, (accum->buf + accum->dirty_off)) < 0) HGOTO_ERROR(H5E_FILE, H5E_WRITEERROR, FAIL, "file write failed") /* Reset accumulator dirty flag */ @@ -365,7 +360,7 @@ H5F_accum_adjust(H5F_meta_accum_t *accum, H5FD_t *lf, hid_t dxpl_id, /* Check if the dirty region overlaps the region to eliminate from the accumulator */ if(shrink_size > accum->dirty_off) { /* Write out the dirty region from the metadata accumulator, with dispatch to driver */ - if(H5FD_write(lf, dxpl, H5FD_MEM_DEFAULT, (accum->loc + accum->dirty_off), accum->dirty_len, (accum->buf + accum->dirty_off)) < 0) + if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, H5FD_MEM_DEFAULT, (accum->loc + accum->dirty_off), accum->dirty_len, (accum->buf + accum->dirty_off)) < 0) HGOTO_ERROR(H5E_FILE, H5E_WRITEERROR, FAIL, "file write failed") /* Reset accumulator dirty flag */ @@ -409,11 +404,11 @@ HDmemset(accum->buf + accum->size, 0, (accum->alloc_size - (accum->size + size)) done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5F_accum_adjust() */ +} /* end H5F__accum_adjust() */ /*------------------------------------------------------------------------- - * Function: H5F_accum_write + * Function: H5F__accum_write * * Purpose: Attempts to write some data to the metadata accumulator for * a file from a buffer. @@ -427,368 +422,367 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_accum_write(const H5F_t *f, hid_t dxpl_id, H5FD_mem_t type, haddr_t addr, +H5F__accum_write(const H5F_io_info_t *fio_info, H5FD_mem_t type, haddr_t addr, size_t size, const void *buf) { - H5P_genplist_t *dxpl; /* DXPL object */ H5FD_mem_t map_type; /* Mapped memory type */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(FAIL) - HDassert(f); - HDassert(f->shared); - HDassert(H5F_INTENT(f) & H5F_ACC_RDWR); + HDassert(fio_info); + HDassert(fio_info->f); + HDassert(H5F_INTENT(fio_info->f) & H5F_ACC_RDWR); + HDassert(fio_info->dxpl); HDassert(buf); /* Treat global heap as raw data */ map_type = (type == H5FD_MEM_GHEAP) ? H5FD_MEM_DRAW : type; - /* Get the DXPL plist object for DXPL ID */ - if(NULL == (dxpl = (H5P_genplist_t *)H5I_object(dxpl_id))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list") - /* Check for accumulating metadata */ - if((f->shared->feature_flags & H5FD_FEAT_ACCUMULATE_METADATA) && map_type != H5FD_MEM_DRAW) { + if((fio_info->f->shared->feature_flags & H5FD_FEAT_ACCUMULATE_METADATA) && map_type != H5FD_MEM_DRAW) { + H5F_meta_accum_t *accum; /* Alias for file's metadata accumulator */ + + /* Set up alias for file's metadata accumulator info */ + accum = &fio_info->f->shared->accum; + if(size < H5F_ACCUM_MAX_SIZE) { /* Sanity check */ - HDassert(!f->shared->accum.buf || (f->shared->accum.alloc_size >= f->shared->accum.size)); + HDassert(!accum->buf || (accum->alloc_size >= accum->size)); /* Check if there is already metadata in the accumulator */ - if(f->shared->accum.size > 0) { + if(accum->size > 0) { /* Check if the new metadata adjoins the beginning of the current accumulator */ - if((addr + size) == f->shared->accum.loc) { + if((addr + size) == accum->loc) { /* Check if we need to adjust accumulator size */ - if(H5F_accum_adjust(&f->shared->accum, f->shared->lf, dxpl_id, H5F_ACCUM_PREPEND, size) < 0) + if(H5F__accum_adjust(accum, fio_info, H5F_ACCUM_PREPEND, size) < 0) HGOTO_ERROR(H5E_IO, H5E_CANTRESIZE, FAIL, "can't adjust metadata accumulator") /* Move the existing metadata to the proper location */ - HDmemmove(f->shared->accum.buf + size, f->shared->accum.buf, f->shared->accum.size); + HDmemmove(accum->buf + size, accum->buf, accum->size); /* Copy the new metadata at the front */ - HDmemcpy(f->shared->accum.buf, buf, size); + HDmemcpy(accum->buf, buf, size); /* Set the new size & location of the metadata accumulator */ - f->shared->accum.loc = addr; - f->shared->accum.size += size; + accum->loc = addr; + accum->size += size; /* Adjust the dirty region and mark accumulator dirty */ - if(f->shared->accum.dirty) - f->shared->accum.dirty_len = size + f->shared->accum.dirty_off - + f->shared->accum.dirty_len; + if(accum->dirty) + accum->dirty_len = size + accum->dirty_off + accum->dirty_len; else { - f->shared->accum.dirty_len = size; - f->shared->accum.dirty = TRUE; + accum->dirty_len = size; + accum->dirty = TRUE; } /* end else */ - f->shared->accum.dirty_off = 0; + accum->dirty_off = 0; } /* end if */ /* Check if the new metadata adjoins the end of the current accumulator */ - else if(addr == (f->shared->accum.loc + f->shared->accum.size)) { + else if(addr == (accum->loc + accum->size)) { /* Check if we need to adjust accumulator size */ - if(H5F_accum_adjust(&f->shared->accum, f->shared->lf, dxpl_id, H5F_ACCUM_APPEND, size) < 0) + if(H5F__accum_adjust(accum, fio_info, H5F_ACCUM_APPEND, size) < 0) HGOTO_ERROR(H5E_IO, H5E_CANTRESIZE, FAIL, "can't adjust metadata accumulator") /* Copy the new metadata to the end */ - HDmemcpy(f->shared->accum.buf + f->shared->accum.size, buf, size); + HDmemcpy(accum->buf + accum->size, buf, size); /* Adjust the dirty region and mark accumulator dirty */ - if(f->shared->accum.dirty) - f->shared->accum.dirty_len = size + (f->shared->accum.size - - f->shared->accum.dirty_off); + if(accum->dirty) + accum->dirty_len = size + (accum->size - accum->dirty_off); else { - f->shared->accum.dirty_off = f->shared->accum.size; - f->shared->accum.dirty_len = size; - f->shared->accum.dirty = TRUE; + accum->dirty_off = accum->size; + accum->dirty_len = size; + accum->dirty = TRUE; } /* end else */ /* Set the new size of the metadata accumulator */ - f->shared->accum.size += size; + accum->size += size; } /* end if */ /* Check if the piece of metadata being written overlaps the metadata accumulator */ - else if(H5F_addr_overlap(addr, size, f->shared->accum.loc, f->shared->accum.size)) { + else if(H5F_addr_overlap(addr, size, accum->loc, accum->size)) { size_t add_size; /* New size of the accumulator buffer */ /* Check if the new metadata is entirely within the current accumulator */ - if(addr >= f->shared->accum.loc && (addr + size) <= (f->shared->accum.loc + f->shared->accum.size)) { - size_t dirty_off = (size_t)(addr - f->shared->accum.loc); + if(addr >= accum->loc && (addr + size) <= (accum->loc + accum->size)) { + size_t dirty_off = (size_t)(addr - accum->loc); /* Copy the new metadata to the proper location within the accumulator */ - HDmemcpy(f->shared->accum.buf + dirty_off, buf, size); + HDmemcpy(accum->buf + dirty_off, buf, size); /* Adjust the dirty region and mark accumulator dirty */ - if(f->shared->accum.dirty) { + if(accum->dirty) { /* Check for new metadata starting before current dirty region */ - if(dirty_off <= f->shared->accum.dirty_off) { - if((dirty_off + size) <= (f->shared->accum.dirty_off + f->shared->accum.dirty_len)) - f->shared->accum.dirty_len = (f->shared->accum.dirty_off + f->shared->accum.dirty_len) - dirty_off; + if(dirty_off <= accum->dirty_off) { + if((dirty_off + size) <= (accum->dirty_off + accum->dirty_len)) + accum->dirty_len = (accum->dirty_off + accum->dirty_len) - dirty_off; else - f->shared->accum.dirty_len = size; - f->shared->accum.dirty_off = dirty_off; + accum->dirty_len = size; + accum->dirty_off = dirty_off; } /* end if */ else { - if((dirty_off + size) <= (f->shared->accum.dirty_off + f->shared->accum.dirty_len)) - ; /* f->shared->accum.dirty_len doesn't change */ + if((dirty_off + size) <= (accum->dirty_off + accum->dirty_len)) + ; /* accum->dirty_len doesn't change */ else - f->shared->accum.dirty_len = (dirty_off + size) - f->shared->accum.dirty_off; + accum->dirty_len = (dirty_off + size) - accum->dirty_off; } /* end else */ } /* end if */ else { - f->shared->accum.dirty_off = dirty_off; - f->shared->accum.dirty_len = size; - f->shared->accum.dirty = TRUE; + accum->dirty_off = dirty_off; + accum->dirty_len = size; + accum->dirty = TRUE; } /* end else */ } /* end if */ /* Check if the new metadata overlaps the beginning of the current accumulator */ - else if(addr < f->shared->accum.loc && (addr + size) <= (f->shared->accum.loc + f->shared->accum.size)) { + else if(addr < accum->loc && (addr + size) <= (accum->loc + accum->size)) { size_t old_offset; /* Offset of old data within the accumulator buffer */ /* Calculate the amount we will need to add to the accumulator size, based on the amount of overlap */ - H5_ASSIGN_OVERFLOW(add_size, (f->shared->accum.loc - addr), hsize_t, size_t); + H5_ASSIGN_OVERFLOW(add_size, (accum->loc - addr), hsize_t, size_t); /* Check if we need to adjust accumulator size */ - if(H5F_accum_adjust(&f->shared->accum, f->shared->lf, dxpl_id, H5F_ACCUM_PREPEND, add_size) < 0) + if(H5F__accum_adjust(accum, fio_info, H5F_ACCUM_PREPEND, add_size) < 0) HGOTO_ERROR(H5E_IO, H5E_CANTRESIZE, FAIL, "can't adjust metadata accumulator") /* Calculate the proper offset of the existing metadata */ - H5_ASSIGN_OVERFLOW(old_offset, (addr + size) - f->shared->accum.loc, hsize_t, size_t); + H5_ASSIGN_OVERFLOW(old_offset, (addr + size) - accum->loc, hsize_t, size_t); /* Move the existing metadata to the proper location */ - HDmemmove(f->shared->accum.buf + size, f->shared->accum.buf + old_offset, (f->shared->accum.size - old_offset)); + HDmemmove(accum->buf + size, accum->buf + old_offset, (accum->size - old_offset)); /* Copy the new metadata at the front */ - HDmemcpy(f->shared->accum.buf, buf, size); + HDmemcpy(accum->buf, buf, size); /* Set the new size & location of the metadata accumulator */ - f->shared->accum.loc = addr; - f->shared->accum.size += add_size; + accum->loc = addr; + accum->size += add_size; /* Adjust the dirty region and mark accumulator dirty */ - if(f->shared->accum.dirty) { - size_t curr_dirty_end = add_size + f->shared->accum.dirty_off + f->shared->accum.dirty_len; + if(accum->dirty) { + size_t curr_dirty_end = add_size + accum->dirty_off + accum->dirty_len; - f->shared->accum.dirty_off = 0; + accum->dirty_off = 0; if(size <= curr_dirty_end) - f->shared->accum.dirty_len = curr_dirty_end; + accum->dirty_len = curr_dirty_end; else - f->shared->accum.dirty_len = size; + accum->dirty_len = size; } /* end if */ else { - f->shared->accum.dirty_off = 0; - f->shared->accum.dirty_len = size; - f->shared->accum.dirty = TRUE; + accum->dirty_off = 0; + accum->dirty_len = size; + accum->dirty = TRUE; } /* end else */ } /* end if */ /* Check if the new metadata overlaps the end of the current accumulator */ - else if(addr >= f->shared->accum.loc && (addr + size) > (f->shared->accum.loc + f->shared->accum.size)) { + else if(addr >= accum->loc && (addr + size) > (accum->loc + accum->size)) { size_t dirty_off; /* Offset of dirty region */ /* Calculate the amount we will need to add to the accumulator size, based on the amount of overlap */ - H5_ASSIGN_OVERFLOW(add_size, (addr + size) - (f->shared->accum.loc + f->shared->accum.size), hsize_t, size_t); + H5_ASSIGN_OVERFLOW(add_size, (addr + size) - (accum->loc + accum->size), hsize_t, size_t); /* Check if we need to adjust accumulator size */ - if(H5F_accum_adjust(&f->shared->accum, f->shared->lf, dxpl_id, H5F_ACCUM_APPEND, add_size) < 0) + if(H5F__accum_adjust(accum, fio_info, H5F_ACCUM_APPEND, add_size) < 0) HGOTO_ERROR(H5E_IO, H5E_CANTRESIZE, FAIL, "can't adjust metadata accumulator") /* Compute offset of dirty region (after adjusting accumulator) */ - dirty_off = (size_t)(addr - f->shared->accum.loc); + dirty_off = (size_t)(addr - accum->loc); /* Copy the new metadata to the end */ - HDmemcpy(f->shared->accum.buf + dirty_off, buf, size); + HDmemcpy(accum->buf + dirty_off, buf, size); /* Set the new size of the metadata accumulator */ - f->shared->accum.size += add_size; + accum->size += add_size; /* Adjust the dirty region and mark accumulator dirty */ - if(f->shared->accum.dirty) { + if(accum->dirty) { /* Check for new metadata starting before current dirty region */ - if(dirty_off <= f->shared->accum.dirty_off) { - f->shared->accum.dirty_off = dirty_off; - f->shared->accum.dirty_len = size; + if(dirty_off <= accum->dirty_off) { + accum->dirty_off = dirty_off; + accum->dirty_len = size; } /* end if */ else { - f->shared->accum.dirty_len = (dirty_off + size) - f->shared->accum.dirty_off; + accum->dirty_len = (dirty_off + size) - accum->dirty_off; } /* end else */ } /* end if */ else { - f->shared->accum.dirty_off = dirty_off; - f->shared->accum.dirty_len = size; - f->shared->accum.dirty = TRUE; + accum->dirty_off = dirty_off; + accum->dirty_len = size; + accum->dirty = TRUE; } /* end else */ } /* end if */ /* New metadata overlaps both ends of the current accumulator */ else { /* Check if we need more buffer space */ - if(size > f->shared->accum.alloc_size) { + if(size > accum->alloc_size) { size_t new_alloc_size; /* New size of accumulator */ /* Adjust the buffer size to be a power of 2 that is large enough to hold data */ new_alloc_size = (size_t)1 << (1 + H5VM_log2_gen((uint64_t)(size - 1))); /* Reallocate the metadata accumulator buffer */ - if(NULL == (f->shared->accum.buf = H5FL_BLK_REALLOC(meta_accum, f->shared->accum.buf, new_alloc_size))) + if(NULL == (accum->buf = H5FL_BLK_REALLOC(meta_accum, accum->buf, new_alloc_size))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate metadata accumulator buffer") /* Note the new buffer size */ - f->shared->accum.alloc_size = new_alloc_size; + accum->alloc_size = new_alloc_size; #ifdef H5_CLEAR_MEMORY -HDmemset(f->shared->accum.buf + size, 0, (f->shared->accum.alloc_size - size)); +HDmemset(accum->buf + size, 0, (accum->alloc_size - size)); #endif /* H5_CLEAR_MEMORY */ } /* end if */ /* Copy the new metadata to the buffer */ - HDmemcpy(f->shared->accum.buf, buf, size); + HDmemcpy(accum->buf, buf, size); /* Set the new size & location of the metadata accumulator */ - f->shared->accum.loc = addr; - f->shared->accum.size = size; + accum->loc = addr; + accum->size = size; /* Adjust the dirty region and mark accumulator dirty */ - f->shared->accum.dirty_off = 0; - f->shared->accum.dirty_len = size; - f->shared->accum.dirty = TRUE; + accum->dirty_off = 0; + accum->dirty_len = size; + accum->dirty = TRUE; } /* end else */ } /* end if */ /* New piece of metadata doesn't adjoin or overlap the existing accumulator */ else { /* Write out the existing metadata accumulator, with dispatch to driver */ - if(f->shared->accum.dirty) { - if(H5FD_write(f->shared->lf, dxpl, H5FD_MEM_DEFAULT, f->shared->accum.loc + f->shared->accum.dirty_off, f->shared->accum.dirty_len, f->shared->accum.buf + f->shared->accum.dirty_off) < 0) + if(accum->dirty) { + if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, H5FD_MEM_DEFAULT, accum->loc + accum->dirty_off, accum->dirty_len, accum->buf + accum->dirty_off) < 0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed") /* Reset accumulator dirty flag */ - f->shared->accum.dirty = FALSE; + accum->dirty = FALSE; } /* end if */ /* Cache the new piece of metadata */ /* Check if we need to resize the buffer */ - if(size > f->shared->accum.alloc_size) { + if(size > accum->alloc_size) { size_t new_size; /* New size of accumulator */ /* Adjust the buffer size to be a power of 2 that is large enough to hold data */ new_size = (size_t)1 << (1 + H5VM_log2_gen((uint64_t)(size - 1))); /* Grow the metadata accumulator buffer */ - if(NULL == (f->shared->accum.buf = H5FL_BLK_REALLOC(meta_accum, f->shared->accum.buf, new_size))) + if(NULL == (accum->buf = H5FL_BLK_REALLOC(meta_accum, accum->buf, new_size))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate metadata accumulator buffer") /* Note the new buffer size */ - f->shared->accum.alloc_size = new_size; + accum->alloc_size = new_size; #ifdef H5_CLEAR_MEMORY { -size_t clear_size = MAX(f->shared->accum.size, size); -HDmemset(f->shared->accum.buf + clear_size, 0, (f->shared->accum.alloc_size - clear_size)); +size_t clear_size = MAX(accum->size, size); +HDmemset(accum->buf + clear_size, 0, (accum->alloc_size - clear_size)); } #endif /* H5_CLEAR_MEMORY */ } /* end if */ else { /* Check if we should shrink the accumulator buffer */ - if(size < (f->shared->accum.alloc_size / H5F_ACCUM_THROTTLE) && - f->shared->accum.alloc_size > H5F_ACCUM_THRESHOLD) { - size_t tmp_size = (f->shared->accum.alloc_size / H5F_ACCUM_THROTTLE); /* New size of accumulator buffer */ + if(size < (accum->alloc_size / H5F_ACCUM_THROTTLE) && + accum->alloc_size > H5F_ACCUM_THRESHOLD) { + size_t tmp_size = (accum->alloc_size / H5F_ACCUM_THROTTLE); /* New size of accumulator buffer */ /* Shrink the accumulator buffer */ - if(NULL == (f->shared->accum.buf = H5FL_BLK_REALLOC(meta_accum, f->shared->accum.buf, tmp_size))) + if(NULL == (accum->buf = H5FL_BLK_REALLOC(meta_accum, accum->buf, tmp_size))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate metadata accumulator buffer") /* Note the new buffer size */ - f->shared->accum.alloc_size = tmp_size; + accum->alloc_size = tmp_size; } /* end if */ } /* end else */ /* Update the metadata accumulator information */ - f->shared->accum.loc = addr; - f->shared->accum.size = size; + accum->loc = addr; + accum->size = size; /* Store the piece of metadata in the accumulator */ - HDmemcpy(f->shared->accum.buf, buf, size); + HDmemcpy(accum->buf, buf, size); /* Adjust the dirty region and mark accumulator dirty */ - f->shared->accum.dirty_off = 0; - f->shared->accum.dirty_len = size; - f->shared->accum.dirty = TRUE; + accum->dirty_off = 0; + accum->dirty_len = size; + accum->dirty = TRUE; } /* end else */ } /* end if */ /* No metadata in the accumulator, grab this piece and keep it */ else { /* Check if we need to reallocate the buffer */ - if(size > f->shared->accum.alloc_size) { + if(size > accum->alloc_size) { size_t new_size; /* New size of accumulator */ /* Adjust the buffer size to be a power of 2 that is large enough to hold data */ new_size = (size_t)1 << (1 + H5VM_log2_gen((uint64_t)(size - 1))); /* Reallocate the metadata accumulator buffer */ - if(NULL == (f->shared->accum.buf = H5FL_BLK_REALLOC(meta_accum, f->shared->accum.buf, new_size))) + if(NULL == (accum->buf = H5FL_BLK_REALLOC(meta_accum, accum->buf, new_size))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate metadata accumulator buffer") /* Note the new buffer size */ - f->shared->accum.alloc_size = new_size; + accum->alloc_size = new_size; #ifdef H5_CLEAR_MEMORY -HDmemset(f->shared->accum.buf + size, 0, (f->shared->accum.alloc_size - size)); +HDmemset(accum->buf + size, 0, (accum->alloc_size - size)); #endif /* H5_CLEAR_MEMORY */ } /* end if */ /* Update the metadata accumulator information */ - f->shared->accum.loc = addr; - f->shared->accum.size = size; + accum->loc = addr; + accum->size = size; /* Store the piece of metadata in the accumulator */ - HDmemcpy(f->shared->accum.buf, buf, size); + HDmemcpy(accum->buf, buf, size); /* Adjust the dirty region and mark accumulator dirty */ - f->shared->accum.dirty_off = 0; - f->shared->accum.dirty_len = size; - f->shared->accum.dirty = TRUE; + accum->dirty_off = 0; + accum->dirty_len = size; + accum->dirty = TRUE; } /* end else */ } /* end if */ else { /* Write the data */ - if(H5FD_write(f->shared->lf, dxpl, map_type, addr, size, buf) < 0) + if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, map_type, addr, size, buf) < 0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed") /* Check for overlap w/accumulator */ /* (Note that this could be improved by updating the accumulator * with [some of] the information just read in. -QAK) */ - if(H5F_addr_overlap(addr, size, f->shared->accum.loc, f->shared->accum.size)) { + if(H5F_addr_overlap(addr, size, accum->loc, accum->size)) { /* Check for write starting before beginning of accumulator */ - if(H5F_addr_le(addr, f->shared->accum.loc)) { + if(H5F_addr_le(addr, accum->loc)) { /* Check for write ending within accumulator */ - if(H5F_addr_le(addr + size, f->shared->accum.loc + f->shared->accum.size)) { + if(H5F_addr_le(addr + size, accum->loc + accum->size)) { size_t overlap_size; /* Size of overlapping region */ /* Compute overlap size */ - overlap_size = (size_t)((addr + size) - f->shared->accum.loc); + overlap_size = (size_t)((addr + size) - accum->loc); /* Check for dirty region */ - if(f->shared->accum.dirty) { - haddr_t dirty_start = f->shared->accum.loc + f->shared->accum.dirty_off; /* File address of start of dirty region */ - haddr_t dirty_end = dirty_start + f->shared->accum.dirty_len; /* File address of end of dirty region */ + if(accum->dirty) { + haddr_t dirty_start = accum->loc + accum->dirty_off; /* File address of start of dirty region */ + haddr_t dirty_end = dirty_start + accum->dirty_len; /* File address of end of dirty region */ /* Check if entire dirty region is overwritten */ if(H5F_addr_le(dirty_end, addr + size)) { - f->shared->accum.dirty = FALSE; - f->shared->accum.dirty_len = 0; + accum->dirty = FALSE; + accum->dirty_len = 0; } /* end if */ else { /* Check for dirty region falling after write */ if(H5F_addr_le(addr + size, dirty_start)) - f->shared->accum.dirty_off = overlap_size; + accum->dirty_off = overlap_size; else { /* Dirty region overlaps w/written region */ - f->shared->accum.dirty_off = 0; - f->shared->accum.dirty_len -= (size_t)((addr + size) - dirty_start); + accum->dirty_off = 0; + accum->dirty_len -= (size_t)((addr + size) - dirty_start); } /* end else */ } /* end if */ } /* end if */ /* Trim bottom of accumulator off */ - f->shared->accum.loc += overlap_size; - f->shared->accum.size -= overlap_size; - HDmemmove(f->shared->accum.buf, f->shared->accum.buf + overlap_size, f->shared->accum.size); + accum->loc += overlap_size; + accum->size -= overlap_size; + HDmemmove(accum->buf, accum->buf + overlap_size, accum->size); } /* end if */ else { /* Access covers whole accumulator */ /* Reset accumulator, but don't flush */ - if(H5F_accum_reset(f, dxpl_id, FALSE) < 0) + if(H5F__accum_reset(fio_info, FALSE) < 0) HGOTO_ERROR(H5E_IO, H5E_CANTRESET, FAIL, "can't reset accumulator") } /* end else */ } /* end if */ @@ -796,45 +790,45 @@ HDmemset(f->shared->accum.buf + size, 0, (f->shared->accum.alloc_size - size)); size_t overlap_size; /* Size of overlapping region */ /* Sanity check */ - HDassert(H5F_addr_gt(addr + size, f->shared->accum.loc + f->shared->accum.size)); + HDassert(H5F_addr_gt(addr + size, accum->loc + accum->size)); /* Compute overlap size */ - overlap_size = (size_t)((f->shared->accum.loc + f->shared->accum.size) - addr); + overlap_size = (size_t)((accum->loc + accum->size) - addr); /* Check for dirty region */ - if(f->shared->accum.dirty) { - haddr_t dirty_start = f->shared->accum.loc + f->shared->accum.dirty_off; /* File address of start of dirty region */ - haddr_t dirty_end = dirty_start + f->shared->accum.dirty_len; /* File address of end of dirty region */ + if(accum->dirty) { + haddr_t dirty_start = accum->loc + accum->dirty_off; /* File address of start of dirty region */ + haddr_t dirty_end = dirty_start + accum->dirty_len; /* File address of end of dirty region */ /* Check if entire dirty region is overwritten */ if(H5F_addr_ge(dirty_start, addr)) { - f->shared->accum.dirty = FALSE; - f->shared->accum.dirty_len = 0; + accum->dirty = FALSE; + accum->dirty_len = 0; } /* end if */ else { /* Check for dirty region falling before write */ if(H5F_addr_le(dirty_end, addr)) ; /* noop */ else /* Dirty region overlaps w/written region */ - f->shared->accum.dirty_len = (size_t)(addr - dirty_start); + accum->dirty_len = (size_t)(addr - dirty_start); } /* end if */ } /* end if */ /* Trim top of accumulator off */ - f->shared->accum.size -= overlap_size; + accum->size -= overlap_size; } /* end else */ } /* end if */ } /* end else */ } /* end if */ else { /* Write the data */ - if(H5FD_write(f->shared->lf, dxpl, map_type, addr, size, buf) < 0) + if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, map_type, addr, size, buf) < 0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed") } /* end else */ done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5F_accum_write() */ +} /* end H5F__accum_write() */ /*------------------------------------------------------------------------- @@ -1002,7 +996,7 @@ done: /*------------------------------------------------------------------------- - * Function: H5F_accum_flush + * Function: H5F__accum_flush * * Purpose: Flush the metadata accumulator to the file * @@ -1015,38 +1009,33 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_accum_flush(const H5F_t *f, hid_t dxpl_id) +H5F__accum_flush(const H5F_io_info_t *fio_info) { herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(FAIL) - HDassert(f); - HDassert(f->shared); + HDassert(fio_info); + HDassert(fio_info->f); + HDassert(fio_info->dxpl); /* Check if we need to flush out the metadata accumulator */ - if((f->shared->feature_flags & H5FD_FEAT_ACCUMULATE_METADATA) && f->shared->accum.dirty) { - H5P_genplist_t *dxpl; /* DXPL object */ - - /* Get the DXPL plist object for DXPL ID */ - if(NULL == (dxpl = (H5P_genplist_t *)H5I_object(dxpl_id))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list") - + if((fio_info->f->shared->feature_flags & H5FD_FEAT_ACCUMULATE_METADATA) && fio_info->f->shared->accum.dirty) { /* Flush the metadata contents */ - if(H5FD_write(f->shared->lf, dxpl, H5FD_MEM_DEFAULT, f->shared->accum.loc + f->shared->accum.dirty_off, f->shared->accum.dirty_len, f->shared->accum.buf + f->shared->accum.dirty_off) < 0) + if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, H5FD_MEM_DEFAULT, fio_info->f->shared->accum.loc + fio_info->f->shared->accum.dirty_off, fio_info->f->shared->accum.dirty_len, fio_info->f->shared->accum.buf + fio_info->f->shared->accum.dirty_off) < 0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed") /* Reset the dirty flag */ - f->shared->accum.dirty = FALSE; + fio_info->f->shared->accum.dirty = FALSE; } /* end if */ done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5F_accum_flush() */ +} /* end H5F__accum_flush() */ /*------------------------------------------------------------------------- - * Function: H5F_accum_reset + * Function: H5F__accum_reset * * Purpose: Reset the metadata accumulator for the file * @@ -1059,37 +1048,38 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_accum_reset(const H5F_t *f, hid_t dxpl_id, hbool_t flush) +H5F__accum_reset(const H5F_io_info_t *fio_info, hbool_t flush) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE - HDassert(f); - HDassert(f->shared); + HDassert(fio_info); + HDassert(fio_info->f); + HDassert(fio_info->dxpl); /* Flush any dirty data in accumulator, if requested */ if(flush) - if(H5F_accum_flush(f, dxpl_id) < 0) + if(H5F__accum_flush(fio_info) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "can't flush metadata accumulator") /* Check if we need to reset the metadata accumulator information */ - if(f->shared->feature_flags & H5FD_FEAT_ACCUMULATE_METADATA) { + if(fio_info->f->shared->feature_flags & H5FD_FEAT_ACCUMULATE_METADATA) { /* Sanity check */ - HDassert(!f->closing || FALSE == f->shared->accum.dirty); + HDassert(!fio_info->f->closing || FALSE == fio_info->f->shared->accum.dirty); /* Free the buffer */ - if(f->shared->accum.buf) - f->shared->accum.buf = H5FL_BLK_FREE(meta_accum, f->shared->accum.buf); + if(fio_info->f->shared->accum.buf) + fio_info->f->shared->accum.buf = H5FL_BLK_FREE(meta_accum, fio_info->f->shared->accum.buf); /* Reset the buffer sizes & location */ - f->shared->accum.alloc_size = f->shared->accum.size = 0; - f->shared->accum.loc = HADDR_UNDEF; - f->shared->accum.dirty = FALSE; - f->shared->accum.dirty_len = 0; + fio_info->f->shared->accum.alloc_size = fio_info->f->shared->accum.size = 0; + fio_info->f->shared->accum.loc = HADDR_UNDEF; + fio_info->f->shared->accum.dirty = FALSE; + fio_info->f->shared->accum.dirty_len = 0; } /* end if */ done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5F_accum_reset() */ +} /* end H5F__accum_reset() */ diff --git a/src/H5Fio.c b/src/H5Fio.c index e9c5fb7..1d05cd0 100644 --- a/src/H5Fio.c +++ b/src/H5Fio.c @@ -143,6 +143,7 @@ herr_t H5F_block_write(const H5F_t *f, H5FD_mem_t type, haddr_t addr, size_t size, hid_t dxpl_id, const void *buf) { + H5F_io_info_t fio_info; /* I/O info for operation */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(FAIL) @@ -160,8 +161,13 @@ HDfprintf(stderr, "%s: write to addr = %a, size = %Zu\n", FUNC, addr, size); if(H5F_addr_le(f->shared->tmp_addr, (addr + size))) HGOTO_ERROR(H5E_IO, H5E_BADRANGE, FAIL, "attempting I/O in temporary file space") + /* Set up I/O info for operation */ + fio_info.f = f; + if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(dxpl_id))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list") + /* Pass through metadata accumulator layer */ - if(H5F_accum_write(f, dxpl_id, type, addr, size, buf) < 0) + if(H5F__accum_write(&fio_info, type, addr, size, buf) < 0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "write through metadata accumulator failed") done: diff --git a/src/H5Fpkg.h b/src/H5Fpkg.h index c35476b..9458223 100644 --- a/src/H5Fpkg.h +++ b/src/H5Fpkg.h @@ -320,12 +320,12 @@ H5_DLL herr_t H5F_super_ext_close(H5F_t *f, H5O_loc_t *ext_ptr, hid_t dxpl_id, /* Metadata accumulator routines */ H5_DLL herr_t H5F__accum_read(const H5F_io_info_t *fio_info, H5FD_mem_t type, haddr_t addr, size_t size, void *buf); -H5_DLL herr_t H5F_accum_write(const H5F_t *f, hid_t dxpl_id, H5FD_mem_t type, +H5_DLL herr_t H5F__accum_write(const H5F_io_info_t *fio_info, H5FD_mem_t type, haddr_t addr, size_t size, const void *buf); H5_DLL herr_t H5F_accum_free(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type, haddr_t addr, hsize_t size); -H5_DLL herr_t H5F_accum_flush(const H5F_t *f, hid_t dxpl_id); -H5_DLL herr_t H5F_accum_reset(const H5F_t *f, hid_t dxpl_id, hbool_t flush); +H5_DLL herr_t H5F__accum_flush(const H5F_io_info_t *fio_info); +H5_DLL herr_t H5F__accum_reset(const H5F_io_info_t *fio_info, hbool_t flush); /* Shared file list related routines */ H5_DLL herr_t H5F_sfile_add(H5F_file_t *shared); diff --git a/test/accum.c b/test/accum.c index e981b38..cf1402f 100644 --- a/test/accum.c +++ b/test/accum.c @@ -38,18 +38,18 @@ H5F_t * f = NULL; /* Function Prototypes */ -unsigned test_write_read(void); -unsigned test_write_read_nonacc_front(void); -unsigned test_write_read_nonacc_end(void); -unsigned test_accum_overlap(void); -unsigned test_accum_overlap_clean(void); -unsigned test_accum_overlap_size(void); -unsigned test_accum_non_overlap_size(void); -unsigned test_accum_adjust(void); -unsigned test_read_after(void); -unsigned test_free(void); -unsigned test_big(void); -unsigned test_random_write(void); +unsigned test_write_read(const H5F_io_info_t *fio_info); +unsigned test_write_read_nonacc_front(const H5F_io_info_t *fio_info); +unsigned test_write_read_nonacc_end(const H5F_io_info_t *fio_info); +unsigned test_accum_overlap(const H5F_io_info_t *fio_info); +unsigned test_accum_overlap_clean(const H5F_io_info_t *fio_info); +unsigned test_accum_overlap_size(const H5F_io_info_t *fio_info); +unsigned test_accum_non_overlap_size(const H5F_io_info_t *fio_info); +unsigned test_accum_adjust(const H5F_io_info_t *fio_info); +unsigned test_read_after(const H5F_io_info_t *fio_info); +unsigned test_free(const H5F_io_info_t *fio_info); +unsigned test_big(const H5F_io_info_t *fio_info); +unsigned test_random_write(const H5F_io_info_t *fio_info); /* Helper Function Prototypes */ void accum_printf(void); @@ -58,8 +58,8 @@ void accum_printf(void); #define accum_write(a,s,b) H5F_block_write(f, H5FD_MEM_DEFAULT, (haddr_t)(a), (size_t)(s), H5P_DATASET_XFER_DEFAULT, (b)) #define accum_read(a,s,b) H5F_block_read(f, H5FD_MEM_DEFAULT, (haddr_t)(a), (size_t)(s), H5P_DATASET_XFER_DEFAULT, (b)) #define accum_free(a,s) H5F_accum_free(f, H5P_DATASET_XFER_DEFAULT, H5FD_MEM_DEFAULT, (haddr_t)(a), (hsize_t)(s)) -#define accum_flush() H5F_accum_flush(f, H5P_DATASET_XFER_DEFAULT) -#define accum_reset() H5F_accum_reset(f, H5P_DATASET_XFER_DEFAULT, TRUE) +#define accum_flush(fio_info) H5F__accum_flush(fio_info) +#define accum_reset(fio_info) H5F__accum_reset(fio_info, TRUE) /* ================= */ /* Main Test Routine */ @@ -82,6 +82,7 @@ void accum_printf(void); int main(void) { + H5F_io_info_t fio_info; /* I/O info for operation */ unsigned nerrors = 0; /* track errors */ hid_t fid = -1; @@ -98,22 +99,26 @@ main(void) file a ways. 10MB should do. */ if(H5FD_set_eoa(f->shared->lf, H5FD_MEM_DEFAULT, (haddr_t)(1024*1024*10)) < 0) FAIL_STACK_ERROR + /* Set up I/O info for operation */ + fio_info.f = f; + if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(H5P_DATASET_XFER_DEFAULT))) FAIL_STACK_ERROR + /* Reset metadata accumulator for the file */ - if(accum_reset() < 0) FAIL_STACK_ERROR + if(accum_reset(&fio_info) < 0) FAIL_STACK_ERROR /* Test Functions */ - nerrors += test_write_read(); - nerrors += test_write_read_nonacc_front(); - nerrors += test_write_read_nonacc_end(); - nerrors += test_accum_overlap(); - nerrors += test_accum_overlap_clean(); - nerrors += test_accum_overlap_size(); - nerrors += test_accum_non_overlap_size(); - nerrors += test_accum_adjust(); - nerrors += test_read_after(); - nerrors += test_free(); - nerrors += test_big(); - nerrors += test_random_write(); + nerrors += test_write_read(&fio_info); + nerrors += test_write_read_nonacc_front(&fio_info); + nerrors += test_write_read_nonacc_end(&fio_info); + nerrors += test_accum_overlap(&fio_info); + nerrors += test_accum_overlap_clean(&fio_info); + nerrors += test_accum_overlap_size(&fio_info); + nerrors += test_accum_non_overlap_size(&fio_info); + nerrors += test_accum_adjust(&fio_info); + nerrors += test_read_after(&fio_info); + nerrors += test_free(&fio_info); + nerrors += test_big(&fio_info); + nerrors += test_random_write(&fio_info); /* End of test code, close and delete file */ if(H5Fclose(fid) < 0) TEST_ERROR @@ -149,7 +154,7 @@ error: *------------------------------------------------------------------------- */ unsigned -test_write_read(void) +test_write_read(const H5F_io_info_t *fio_info) { int i = 0; int *write_buf, *read_buf; @@ -172,7 +177,7 @@ test_write_read(void) if(accum_read(0, 1024, read_buf) < 0) FAIL_STACK_ERROR; if(HDmemcmp(write_buf, read_buf, 1024) != 0) TEST_ERROR; - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; PASSED(); @@ -205,7 +210,7 @@ error: *------------------------------------------------------------------------- */ unsigned -test_write_read_nonacc_front(void) +test_write_read_nonacc_front(const H5F_io_info_t *fio_info) { int i = 0; int *write_buf, *read_buf; @@ -225,13 +230,13 @@ test_write_read_nonacc_front(void) /* Do a simple write/read/verify of data */ /* Write 1KB at Address 0 */ if(accum_write(0, 1024, write_buf) < 0) FAIL_STACK_ERROR; - if(accum_flush() < 0) FAIL_STACK_ERROR; - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_flush(fio_info) < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; if(accum_write(1024, 1024, write_buf) < 0) FAIL_STACK_ERROR; if(accum_read(0, 1024, read_buf) < 0) FAIL_STACK_ERROR; if(HDmemcmp(write_buf, read_buf, 1024) != 0) TEST_ERROR; - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; PASSED(); @@ -264,7 +269,7 @@ error: *------------------------------------------------------------------------- */ unsigned -test_write_read_nonacc_end(void) +test_write_read_nonacc_end(const H5F_io_info_t *fio_info) { int i = 0; int *write_buf, *read_buf; @@ -284,13 +289,13 @@ test_write_read_nonacc_end(void) /* Do a simple write/read/verify of data */ /* Write 1KB at Address 0 */ if(accum_write(1024, 1024, write_buf) < 0) FAIL_STACK_ERROR; - if(accum_flush() < 0) FAIL_STACK_ERROR; - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_flush(fio_info) < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; if(accum_write(0, 1024, write_buf) < 0) FAIL_STACK_ERROR; if(accum_read(1024, 1024, read_buf) < 0) FAIL_STACK_ERROR; if(HDmemcmp(write_buf, read_buf, 1024) != 0) TEST_ERROR; - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; PASSED(); @@ -323,7 +328,7 @@ error: *------------------------------------------------------------------------- */ unsigned -test_free(void) +test_free(const H5F_io_info_t *fio_info) { int i = 0; int32_t *wbuf = NULL; @@ -390,7 +395,7 @@ test_free(void) * entirely before dirty section */ if(accum_write(64 * sizeof(int32_t), 128 * sizeof(int32_t), wbuf) < 0) FAIL_STACK_ERROR; HDmemcpy(expect + 64, wbuf, 128 * sizeof(int32_t)); - if(accum_flush() < 0) FAIL_STACK_ERROR; + if(accum_flush(fio_info) < 0) FAIL_STACK_ERROR; if(accum_write(68 * sizeof(int32_t), 4 * sizeof(int32_t), wbuf) < 0) FAIL_STACK_ERROR; HDmemcpy(expect + 68, wbuf, 4 * sizeof(int32_t)); if(accum_free(62 * sizeof(int32_t), 4 * sizeof(int32_t)) < 0) FAIL_STACK_ERROR; @@ -404,7 +409,7 @@ test_free(void) * completely contains dirty section */ if(accum_write(64 * sizeof(int32_t), 128 * sizeof(int32_t), wbuf) < 0) FAIL_STACK_ERROR; HDmemcpy(expect + 64, wbuf, 128 * sizeof(int32_t)); - if(accum_flush() < 0) FAIL_STACK_ERROR; + if(accum_flush(fio_info) < 0) FAIL_STACK_ERROR; if(accum_write(68 * sizeof(int32_t), 4 * sizeof(int32_t), wbuf) < 0) FAIL_STACK_ERROR; HDmemcpy(expect + 68, wbuf, 4 * sizeof(int32_t)); if(accum_free(62 * sizeof(int32_t), 16 * sizeof(int32_t)) < 0) FAIL_STACK_ERROR; @@ -418,7 +423,7 @@ test_free(void) * before dirty section */ if(accum_write(64 * sizeof(int32_t), 128 * sizeof(int32_t), wbuf) < 0) FAIL_STACK_ERROR; HDmemcpy(expect + 64, wbuf, 128 * sizeof(int32_t)); - if(accum_flush() < 0) FAIL_STACK_ERROR; + if(accum_flush(fio_info) < 0) FAIL_STACK_ERROR; if(accum_write(72 * sizeof(int32_t), 4 * sizeof(int32_t), wbuf) < 0) FAIL_STACK_ERROR; HDmemcpy(expect + 72, wbuf, 4 * sizeof(int32_t)); if(accum_free(66 * sizeof(int32_t), 4 * sizeof(int32_t)) < 0) FAIL_STACK_ERROR; @@ -432,7 +437,7 @@ test_free(void) * dirty section, and ends in dirty section */ if(accum_write(64 * sizeof(int32_t), 128 * sizeof(int32_t), wbuf) < 0) FAIL_STACK_ERROR; HDmemcpy(expect + 64, wbuf, 128 * sizeof(int32_t)); - if(accum_flush() < 0) FAIL_STACK_ERROR; + if(accum_flush(fio_info) < 0) FAIL_STACK_ERROR; if(accum_write(72 * sizeof(int32_t), 4 * sizeof(int32_t), wbuf) < 0) FAIL_STACK_ERROR; HDmemcpy(expect + 72, wbuf, 4 * sizeof(int32_t)); if(accum_free(70 * sizeof(int32_t), 4 * sizeof(int32_t)) < 0) FAIL_STACK_ERROR; @@ -446,7 +451,7 @@ test_free(void) * contains dirty section */ if(accum_write(64 * sizeof(int32_t), 128 * sizeof(int32_t), wbuf) < 0) FAIL_STACK_ERROR; HDmemcpy(expect + 64, wbuf, 128 * sizeof(int32_t)); - if(accum_flush() < 0) FAIL_STACK_ERROR; + if(accum_flush(fio_info) < 0) FAIL_STACK_ERROR; if(accum_write(72 * sizeof(int32_t), 4 * sizeof(int32_t), wbuf) < 0) FAIL_STACK_ERROR; HDmemcpy(expect + 72, wbuf, 4 * sizeof(int32_t)); if(accum_free(70 * sizeof(int32_t), 8 * sizeof(int32_t)) < 0) FAIL_STACK_ERROR; @@ -460,7 +465,7 @@ test_free(void) * of dirty section, and ends in dirty section */ if(accum_write(64 * sizeof(int32_t), 128 * sizeof(int32_t), wbuf) < 0) FAIL_STACK_ERROR; HDmemcpy(expect + 64, wbuf, 128 * sizeof(int32_t)); - if(accum_flush() < 0) FAIL_STACK_ERROR; + if(accum_flush(fio_info) < 0) FAIL_STACK_ERROR; if(accum_write(72 * sizeof(int32_t), 8 * sizeof(int32_t), wbuf) < 0) FAIL_STACK_ERROR; HDmemcpy(expect + 72, wbuf, 8 * sizeof(int32_t)); if(accum_free(72 * sizeof(int32_t), 4 * sizeof(int32_t)) < 0) FAIL_STACK_ERROR; @@ -476,7 +481,7 @@ test_free(void) HDfree(expect); expect = NULL; - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; PASSED(); @@ -510,7 +515,7 @@ error: *------------------------------------------------------------------------- */ unsigned -test_accum_overlap(void) +test_accum_overlap(const H5F_io_info_t *fio_info) { int i = 0; int32_t *wbuf, *rbuf; @@ -646,7 +651,7 @@ test_accum_overlap(void) if(accum_read(112, 6 * sizeof(int32_t), rbuf) < 0) FAIL_STACK_ERROR; if(HDmemcmp(wbuf, rbuf, 6 * sizeof(int32_t)) != 0) TEST_ERROR; - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; PASSED(); @@ -682,7 +687,7 @@ error: *------------------------------------------------------------------------- */ unsigned -test_accum_overlap_clean(void) +test_accum_overlap_clean(const H5F_io_info_t *fio_info) { int i = 0; int32_t *wbuf, *rbuf; @@ -708,7 +713,7 @@ test_accum_overlap_clean(void) /* Case 2: End of new piece aligns with start of clean accumulated data */ /* Write 5 2's at address 20 */ /* @0:| 222221111111111| */ - if(accum_flush() < 0) FAIL_STACK_ERROR; + if(accum_flush(fio_info) < 0) FAIL_STACK_ERROR; for(i = 0; i < 5; i++) wbuf[i] = 2; if(accum_write(20, 5 * sizeof(int32_t), wbuf) < 0) FAIL_STACK_ERROR; @@ -748,7 +753,7 @@ test_accum_overlap_clean(void) /* Case 6: New piece completely within clean accumulated data */ /* Write 3 6's at address 44 */ /* @0:| 333334666511111| */ - if(accum_flush() < 0) FAIL_STACK_ERROR; + if(accum_flush(fio_info) < 0) FAIL_STACK_ERROR; for(i = 0; i < 3; i++) wbuf[i] = 6; if(accum_write(44, 3 * sizeof(int32_t), wbuf) < 0) FAIL_STACK_ERROR; @@ -758,7 +763,7 @@ test_accum_overlap_clean(void) /* Case 7: New piece overlaps start of clean accumulated data */ /* Write 2 7's at address 16 */ /* @0:| 7733334666511111| */ - if(accum_flush() < 0) FAIL_STACK_ERROR; + if(accum_flush(fio_info) < 0) FAIL_STACK_ERROR; for(i = 0; i < 2; i++) wbuf[i] = 7; if(accum_write(16, 2 * sizeof(int32_t), wbuf) < 0) FAIL_STACK_ERROR; @@ -778,7 +783,7 @@ test_accum_overlap_clean(void) /* Case 9: Start of new piece aligns with end of clean accumulated data */ /* Write 3 9's at address 80 */ /* @0:| 88883334666511111999| */ - if(accum_flush() < 0) FAIL_STACK_ERROR; + if(accum_flush(fio_info) < 0) FAIL_STACK_ERROR; for(i = 0; i < 3; i++) wbuf[i] = 9; if(accum_write(80, 3 * sizeof(int32_t), wbuf) < 0) FAIL_STACK_ERROR; @@ -788,7 +793,7 @@ test_accum_overlap_clean(void) /* Case 10: New piece overlaps end of clean accumulated data */ /* Write 3 2's at address 88 */ /* @0:| 888833346665111119922| */ - if(accum_flush() < 0) FAIL_STACK_ERROR; + if(accum_flush(fio_info) < 0) FAIL_STACK_ERROR; for(i = 0; i < 2; i++) wbuf[i] = 2; if(accum_write(88, 2 * sizeof(int32_t), wbuf) < 0) FAIL_STACK_ERROR; @@ -826,7 +831,7 @@ test_accum_overlap_clean(void) if(accum_read(12, 22 * sizeof(int32_t), rbuf) < 0) FAIL_STACK_ERROR; if(HDmemcmp(wbuf, rbuf, 22 * sizeof(int32_t)) != 0) TEST_ERROR; - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; PASSED(); @@ -861,7 +866,7 @@ error: *------------------------------------------------------------------------- */ unsigned -test_accum_non_overlap_size(void) +test_accum_non_overlap_size(const H5F_io_info_t *fio_info) { int i = 0; int32_t *wbuf, *rbuf; @@ -893,7 +898,7 @@ test_accum_non_overlap_size(void) if(accum_read(0, 20 * sizeof(int32_t), rbuf) < 0) FAIL_STACK_ERROR; if(HDmemcmp(wbuf, rbuf, 20 * sizeof(int32_t)) != 0) TEST_ERROR; - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; PASSED(); @@ -928,7 +933,7 @@ error: *------------------------------------------------------------------------- */ unsigned -test_accum_overlap_size(void) +test_accum_overlap_size(const H5F_io_info_t *fio_info) { int i = 0; int32_t *wbuf, *rbuf; @@ -960,7 +965,7 @@ test_accum_overlap_size(void) if(accum_read(60, 72 * sizeof(int32_t), rbuf) < 0) FAIL_STACK_ERROR; if(HDmemcmp(wbuf, rbuf, 72 * sizeof(int32_t)) != 0) TEST_ERROR; - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; PASSED(); @@ -1006,7 +1011,7 @@ error: *------------------------------------------------------------------------- */ unsigned -test_accum_adjust(void) +test_accum_adjust(const H5F_io_info_t *fio_info) { int i = 0; int s = 1048576; /* size of buffer */ @@ -1052,7 +1057,7 @@ test_accum_adjust(void) if(HDmemcmp(wbuf, rbuf, 1024) != 0) TEST_ERROR; /* Reset accumulator for next case */ - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; /* ================================================================ */ /* Case 2: Prepending large block to large, fully dirty accumulator */ @@ -1081,7 +1086,7 @@ test_accum_adjust(void) if(HDmemcmp(wbuf, rbuf, 1048571) != 0) TEST_ERROR; /* Reset accumulator for next case */ - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; /* ========================================================= */ /* Case 3: Appending small block to large, clean accumulator */ @@ -1095,7 +1100,7 @@ test_accum_adjust(void) /* Flush the accumulator -- we want to test the case when accumulator contains clean data */ - if(accum_flush() < 0) FAIL_STACK_ERROR + if(accum_flush(fio_info) < 0) FAIL_STACK_ERROR /* Write a small (1KB) block to the end of the accumulator */ /* ==> Accumulator will need more buffer space */ @@ -1116,7 +1121,7 @@ test_accum_adjust(void) if(HDmemcmp(wbuf, rbuf, 1024) != 0) TEST_ERROR; /* Reset accumulator for next case */ - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; /* ==================================================================== */ /* Case 4: Appending small block to large, partially dirty accumulator, */ @@ -1130,7 +1135,7 @@ test_accum_adjust(void) if(accum_write(0, (1024 * 1024) - 5, wbuf) < 0) FAIL_STACK_ERROR; /* Flush the accumulator to clean it */ - if(accum_flush() < 0) FAIL_STACK_ERROR + if(accum_flush(fio_info) < 0) FAIL_STACK_ERROR /* write to part of the accumulator so just the start of it is dirty */ if(accum_write(0, 5, wbuf) < 0) FAIL_STACK_ERROR; @@ -1156,7 +1161,7 @@ test_accum_adjust(void) if(HDmemcmp(wbuf, rbuf, 349523) != 0) TEST_ERROR; /* Reset accumulator for next case */ - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; /* ==================================================================== */ /* Case 5: Appending small block to large, partially dirty accumulator, */ @@ -1167,7 +1172,7 @@ test_accum_adjust(void) if(accum_write(0, (1024 * 1024) - 5, wbuf) < 0) FAIL_STACK_ERROR; /* Flush the accumulator to clean it */ - if(accum_flush() < 0) FAIL_STACK_ERROR + if(accum_flush(fio_info) < 0) FAIL_STACK_ERROR /* write to part of the accumulator so it's dirty, but not entirely dirty */ /* (just the begging few bytes will be clean) */ @@ -1193,7 +1198,7 @@ test_accum_adjust(void) if(HDmemcmp(wbuf, rbuf, 10) != 0) TEST_ERROR; /* Reset accumulator for next case */ - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; /* ================================================================= */ /* Case 6: Appending small block to large, fully dirty accumulator */ @@ -1224,7 +1229,7 @@ test_accum_adjust(void) if(accum_read(1048571, 349523, rbuf) < 0) FAIL_STACK_ERROR; if(HDmemcmp(wbuf, rbuf, 349523) != 0) TEST_ERROR; - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; PASSED(); @@ -1262,7 +1267,7 @@ error: *------------------------------------------------------------------------- */ unsigned -test_read_after(void) +test_read_after(const H5F_io_info_t *fio_info) { int i = 0; int s = 128; /* size of buffer */ @@ -1307,7 +1312,7 @@ test_read_after(void) if(accum_read(512, 512, rbuf) < 0) FAIL_STACK_ERROR; if(HDmemcmp(wbuf, rbuf, 128) != 0) TEST_ERROR; - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; PASSED(); @@ -1341,7 +1346,7 @@ error: *------------------------------------------------------------------------- */ unsigned -test_big(void) +test_big(const H5F_io_info_t *fio_info) { uint8_t *wbuf, *wbuf2, *rbuf, *zbuf; /* Buffers for reading & writing, etc */ unsigned u; /* Local index variable */ @@ -1377,7 +1382,7 @@ test_big(void) /* Reset data in file back to zeros & reset the read buffer */ if(accum_write(0, BIG_BUF_SIZE, zbuf) < 0) FAIL_STACK_ERROR; HDmemset(rbuf, 0, BIG_BUF_SIZE); - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; /* Write small section to middle of accumulator */ @@ -1396,7 +1401,7 @@ test_big(void) /* Reset data in file back to zeros & reset the read buffer */ if(accum_write(1024, 1024, zbuf) < 0) FAIL_STACK_ERROR; HDmemset(rbuf, 0, BIG_BUF_SIZE); - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; /* Write small section to overlap with end of "big" region */ @@ -1414,7 +1419,7 @@ test_big(void) /* Reset data in file back to zeros & reset the read buffer */ if(accum_write(BIG_BUF_SIZE - 512, 1024, zbuf) < 0) FAIL_STACK_ERROR; HDmemset(rbuf, 0, BIG_BUF_SIZE); - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; /* Write small section to overlap with beginning of "big" region */ @@ -1432,7 +1437,7 @@ test_big(void) /* Reset data in file back to zeros & reset the read buffer */ if(accum_write(0, 1024, zbuf) < 0) FAIL_STACK_ERROR; HDmemset(rbuf, 0, BIG_BUF_SIZE); - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; /* Write small section to middle of accumulator */ @@ -1454,7 +1459,7 @@ test_big(void) /* Reset data in file back to zeros & reset the read buffer */ if(accum_write(0, BIG_BUF_SIZE, zbuf) < 0) FAIL_STACK_ERROR; HDmemset(rbuf, 0, BIG_BUF_SIZE); - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; /* Write small section to overlap with end of "big" region */ @@ -1477,7 +1482,7 @@ test_big(void) /* Reset data in file back to zeros & reset the read buffer */ if(accum_write(0, BIG_BUF_SIZE + 512, zbuf) < 0) FAIL_STACK_ERROR; HDmemset(rbuf, 0, BIG_BUF_SIZE + 512); - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; /* Write small section to be past "big" region */ @@ -1505,7 +1510,7 @@ test_big(void) /* Reset data in file back to zeros & reset the read buffer */ if(accum_write(0, BIG_BUF_SIZE + 1536, zbuf) < 0) FAIL_STACK_ERROR; HDmemset(rbuf, 0, BIG_BUF_SIZE + 1024); - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; /* Write small section to be past "big" region */ @@ -1533,7 +1538,7 @@ test_big(void) /* Reset data in file back to zeros & reset the read buffer */ if(accum_write(1536, BIG_BUF_SIZE, zbuf) < 0) FAIL_STACK_ERROR; HDmemset(rbuf, 0, BIG_BUF_SIZE + 1536); - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; /* Write small section before "big" region */ @@ -1560,7 +1565,7 @@ test_big(void) /* Reset data in file back to zeros & reset the read buffer */ if(accum_write(512, BIG_BUF_SIZE, zbuf) < 0) FAIL_STACK_ERROR; HDmemset(rbuf, 0, BIG_BUF_SIZE + 512); - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; /* Write small section before "big" region */ @@ -1588,7 +1593,7 @@ test_big(void) /* Reset data in file back to zeros & reset the read buffer */ if(accum_write(0, BIG_BUF_SIZE + 1536, zbuf) < 0) FAIL_STACK_ERROR; HDmemset(rbuf, 0, BIG_BUF_SIZE + 1536); - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; /* Write small section before "big" region */ @@ -1612,7 +1617,7 @@ test_big(void) if(HDmemcmp(wbuf2, rbuf + 512, BIG_BUF_SIZE) != 0) TEST_ERROR; - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; PASSED(); @@ -1649,7 +1654,7 @@ error: *------------------------------------------------------------------------- */ unsigned -test_random_write(void) +test_random_write(const H5F_io_info_t *fio_info) { uint8_t *wbuf, *rbuf; /* Buffers for reading & writing */ unsigned seed = 0; /* Random # seed */ @@ -1749,7 +1754,7 @@ HDfprintf(stderr, "Random # seed was: %u\n", seed); /* Verify data read back in */ if(HDmemcmp(wbuf, rbuf, RANDOM_BUF_SIZE) != 0) TEST_ERROR; - if(accum_reset() < 0) FAIL_STACK_ERROR; + if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR; PASSED(); -- cgit v0.12