From 339a81a766d4d37e6535f0c8fad7c853b9a849e9 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Sat, 5 Jun 2004 14:04:49 -0500 Subject: [svn-r8613] Purpose: Refactor code Description: Move chunk and contiguous cached raw data from file information to dataset information. This simplifies a number of internal interfaces, aligns the code with it's purpose better and should allow more optimizations to the chunked data I/O performance. Platforms tested: Solaris 2.7 (arabica) FreeBSD 4.10 (sleipnir) h5committest Misc. update: --- src/H5.c | 3 + src/H5D.c | 230 +++++++----- src/H5Dcompact.c | 50 +-- src/H5Dcontig.c | 333 ++++++++++-------- src/H5Dio.c | 82 +++-- src/H5Distore.c | 1035 ++++++++++++++++++++++++++---------------------------- src/H5Dpkg.h | 54 +++ src/H5Dprivate.h | 55 ++- src/H5Dseq.c | 160 ++------- src/H5F.c | 384 +++++++++++++------- src/H5Fcompact.c | 50 +-- src/H5Fcontig.c | 333 ++++++++++-------- src/H5Fistore.c | 1035 ++++++++++++++++++++++++++---------------------------- src/H5Fpkg.h | 74 +--- src/H5Fprivate.h | 81 ++--- src/H5Fseq.c | 160 ++------- src/H5Olayout.c | 4 +- src/H5Smpio.c | 45 ++- src/H5Spkg.h | 16 +- src/H5Sprivate.h | 54 +-- src/H5Sselect.c | 40 +-- 21 files changed, 2146 insertions(+), 2132 deletions(-) diff --git a/src/H5.c b/src/H5.c index ee1c102..ee0bd18 100644 --- a/src/H5.c +++ b/src/H5.c @@ -260,6 +260,9 @@ H5_term_library(void) if (func) { fprintf(stderr, "HDF5: infinite loop closing library\n"); fprintf(stderr, " %s\n", loop); +#ifndef NDEBUG + HDabort(); +#endif /* NDEBUG */ } } diff --git a/src/H5D.c b/src/H5D.c index f5793b6..9f24811 100644 --- a/src/H5D.c +++ b/src/H5D.c @@ -39,27 +39,23 @@ static int interface_initialize_g = 0; /* Local functions */ static herr_t H5D_init_interface(void); static herr_t H5D_init_storage(H5D_t *dataset, hbool_t full_overwrite, hid_t dxpl_id); -static int H5D_crt_fill_value_cmp(const void *value1, const void *value2, size_t size); -static int H5D_crt_ext_file_list_cmp(const void *value1, const void *value2, size_t size); -static int H5D_crt_data_pipeline_cmp(const void *value1, const void *value2, size_t size); static H5D_t * H5D_new(hid_t dcpl_id, hbool_t creating, hbool_t vl_type); static H5D_t * H5D_create(H5G_entry_t *loc, const char *name, hid_t type_id, const H5S_t *space, hid_t dcpl_id, hid_t dxpl_id); static H5D_t * H5D_open_oid(const H5G_entry_t *ent, hid_t dxpl_id); -static herr_t H5D_get_space_status(const H5D_t *dset, H5D_space_status_t *allocation, hid_t dxpl_id); -static hsize_t H5D_get_storage_size(const H5D_t *dset, hid_t dxpl_id); +static herr_t H5D_get_space_status(H5D_t *dset, H5D_space_status_t *allocation, hid_t dxpl_id); +static hsize_t H5D_get_storage_size(H5D_t *dset, hid_t dxpl_id); static haddr_t H5D_get_offset(const H5D_t *dset); static herr_t H5D_extend(H5D_t *dataset, const hsize_t *size, hid_t dxpl_id); static herr_t H5D_set_extent(H5D_t *dataset, const hsize_t *size, hid_t dxpl_id); static herr_t H5D_close(H5D_t *dataset); - +static int H5D_crt_fill_value_cmp(const void *value1, const void *value2, size_t size); +static int H5D_crt_ext_file_list_cmp(const void *value1, const void *value2, size_t size); +static int H5D_crt_data_pipeline_cmp(const void *value1, const void *value2, size_t size); static herr_t H5D_xfer_xform_del(hid_t prop_id, const char* name, size_t size, void* value); static herr_t H5D_xfer_xform_copy(const char* name, size_t size, void* value); static herr_t H5D_xfer_xform_close(const char* name, size_t size, void* value); - - - /* Internal data structure for computing variable-length dataset's total size */ typedef struct { hid_t dataset_id; /* ID of the dataset we are working on */ @@ -80,6 +76,9 @@ H5FL_BLK_DEFINE_STATIC(vlen_vl_buf); /* Declare a free list to manage other blocks of VL data */ H5FL_BLK_DEFINE_STATIC(vlen_fl_buf); +/* Declare the external PQ free list for the sieve buffer information */ +H5FL_BLK_EXTERN(sieve_buf); + /* Define a static "default" dataset structure to use to initialize new datasets */ static H5D_t H5D_def_dset; @@ -1425,7 +1424,7 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5D_get_space_status(const H5D_t *dset, H5D_space_status_t *allocation, hid_t dxpl_id) +H5D_get_space_status(H5D_t *dset, H5D_space_status_t *allocation, hid_t dxpl_id) { H5S_t *space; /* Dataset's dataspace */ hsize_t space_allocated; /* The number of bytes allocated for chunks */ @@ -1963,7 +1962,7 @@ done: HDONE_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to unprotect dataset object header") FUNC_LEAVE_NOAPI(ret_value) -} +} /* end H5D_update_entry_info() */ /*------------------------------------------------------------------------- @@ -2035,6 +2034,7 @@ H5D_create(H5G_entry_t *loc, const char *name, hid_t type_id, const H5S_t *space unsigned chunk_ndims = 0; /* Dimensionality of chunk */ H5P_genplist_t *dc_plist=NULL; /* New Property list */ hbool_t has_vl_type=FALSE; /* Flag to indicate a VL-type for dataset */ + hbool_t chunk_init=FALSE; /* Flag to indicate that chunk information was initialized */ H5D_t *ret_value; /* Return value */ FUNC_ENTER_NOAPI(H5D_create, NULL) @@ -2238,6 +2238,13 @@ H5D_create(H5G_entry_t *loc, const char *name, hid_t type_id, const H5S_t *space /* Compute the total size of a chunk */ for (u=1, new_dset->layout.u.chunk.size=new_dset->layout.u.chunk.dim[0]; ulayout.u.chunk.ndims; u++) new_dset->layout.u.chunk.size *= new_dset->layout.u.chunk.dim[u]; + + /* Initialize the chunk cache for the dataset */ + if(H5D_istore_init(file,new_dset)<0) + HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, NULL, "can't initialize chunk cache") + + /* Indicate that the chunk information was initialized */ + chunk_init=TRUE; } /* end case */ break; @@ -2288,6 +2295,10 @@ H5D_create(H5G_entry_t *loc, const char *name, hid_t type_id, const H5S_t *space done: if (!ret_value && new_dset) { + if(new_dset->layout.type==H5D_CHUNKED && chunk_init) { + if(H5D_istore_dest(new_dset->ent.file,H5AC_dxpl_id,new_dset)<0) + HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, NULL, "unable to destroy chunk cache") + } /* end if */ if (new_dset->space) { if(H5S_close(new_dset->space)<0) HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, NULL, "unable to release dataspace") @@ -2313,7 +2324,7 @@ done: } FUNC_LEAVE_NOAPI(ret_value) -} +} /* end H5D_create() */ /*------------------------------------------------------------------------- @@ -2538,11 +2549,11 @@ H5D_open_oid(const H5G_entry_t *ent, hid_t dxpl_id) break; case H5D_CHUNKED: - /* - * Chunked storage. The creation plist's dimension is one less than - * the chunk dimension because the chunk includes a dimension for the - * individual bytes of the data type. - */ + /* + * Chunked storage. The creation plist's dimension is one less than + * the chunk dimension because the chunk includes a dimension for the + * individual bytes of the data type. + */ { unsigned chunk_ndims; /* Dimensionality of chunk */ @@ -2552,6 +2563,10 @@ H5D_open_oid(const H5G_entry_t *ent, hid_t dxpl_id) HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, NULL, "can't set chunk dimensions") if(H5P_set(plist, H5D_CRT_CHUNK_SIZE_NAME, dataset->layout.u.chunk.dim) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, NULL, "can't set chunk size") + + /* Initialize the chunk cache for the dataset */ + if(H5D_istore_init(dataset->ent.file,dataset)<0) + HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, NULL, "can't initialize chunk cache") } break; @@ -2711,6 +2726,46 @@ H5D_close(H5D_t *dataset) /* check args */ assert(dataset && dataset->ent.file); + /* Dump debugging info */ +#ifdef H5D_ISTORE_DEBUG + H5D_istore_stats(dataset, FALSE); +#endif /* H5F_ISTORE_DEBUG */ + + /* Free cached information for each kind of dataset */ + switch(dataset->layout.type) { + case H5D_CONTIGUOUS: + /* Free the data sieve buffer, if it's been allocated */ + if(dataset->cache.contig.sieve_buf) { + assert(dataset->cache.contig.sieve_dirty==0); /* The buffer had better be flushed... */ + dataset->cache.contig.sieve_buf = H5FL_BLK_FREE (sieve_buf,dataset->cache.contig.sieve_buf); + } /* end if */ + break; + + case H5D_CHUNKED: + /* Flush and destroy chunks in the cache */ + if(H5D_istore_dest(dataset->ent.file,H5AC_dxpl_id,dataset)<0) + HGOTO_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to destroy chunk cache") + break; + + case H5D_COMPACT: + /* Update header message of layout for compact dataset. */ + if(dataset->layout.u.compact.dirty) { + if(H5O_modify(&(dataset->ent), H5O_LAYOUT_ID, 0, 0, 1, &(dataset->layout), H5AC_dxpl_id)<0) + HGOTO_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to update layout message") + dataset->layout.u.compact.dirty = FALSE; + } /* end if */ + + /* Free the buffer for the raw data for compact datasets */ + dataset->layout.u.compact.buf=H5MM_xfree(dataset->layout.u.compact.buf); + break; + + default: + assert ("not implemented yet" && 0); +#ifdef NDEBUG + HGOTO_ERROR (H5E_IO, H5E_UNSUPPORTED, FAIL, "unsupported storage layout") +#endif /* NDEBUG */ + } /* end switch */ + /* * Release datatype, dataspace and creation property list -- there isn't * much we can do if one of these fails, so we just continue. @@ -2718,13 +2773,6 @@ H5D_close(H5D_t *dataset) free_failed=(H5T_close(dataset->type)<0 || H5S_close(dataset->space)<0 || H5I_dec_ref(dataset->dcpl_id) < 0); - /* Update header message of layout for compact dataset. */ - if(dataset->layout.type==H5D_COMPACT && dataset->layout.u.compact.dirty) { - if(H5O_modify(&(dataset->ent), H5O_LAYOUT_ID, 0, 0, 1, &(dataset->layout), H5AC_dxpl_id)<0) - HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update layout message") - dataset->layout.u.compact.dirty = FALSE; - } /* end if */ - /* Remove the dataset from the list of opened objects in the file */ if(H5FO_delete(dataset->ent.file, H5AC_dxpl_id, dataset->ent.header)<0) HGOTO_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "can't remove dataset from list of open objects") @@ -2741,9 +2789,7 @@ H5D_close(H5D_t *dataset) * above). */ dataset->ent.file = NULL; - /* Free the buffer for the raw data for compact datasets */ - if(dataset->layout.type==H5D_COMPACT) - dataset->layout.u.compact.buf=H5MM_xfree(dataset->layout.u.compact.buf); + H5FL_FREE(H5D_t,dataset); if (free_failed) @@ -2804,7 +2850,7 @@ H5D_extend (H5D_t *dataset, const hsize_t *size, hid_t dxpl_id) /* Update the index values for the cached chunks for this dataset */ if(H5D_CHUNKED == dataset->layout.type) - if(H5F_istore_update_cache(dataset->ent.file, dxpl_id, &dataset->layout, space) < 0) + if(H5D_istore_update_cache(dataset->ent.file, dxpl_id, dataset) < 0) HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to update cached chunk indices") /* Allocate space for the new parts of the dataset, if appropriate */ @@ -2948,7 +2994,7 @@ H5D_alloc_storage (H5F_t *f, hid_t dxpl_id, H5D_t *dset/*in,out*/, H5D_time_allo case H5D_CONTIGUOUS: if(layout->u.contig.addr==HADDR_UNDEF) { /* Reserve space in the file for the entire array */ - if (H5F_contig_create (f, dxpl_id, layout/*out*/)<0) + if (H5D_contig_create (f, dxpl_id, dset/*out*/)<0) HGOTO_ERROR (H5E_IO, H5E_CANTINIT, FAIL, "unable to initialize contiguous storage") /* Indicate that we set the storage addr */ @@ -2962,7 +3008,7 @@ H5D_alloc_storage (H5F_t *f, hid_t dxpl_id, H5D_t *dset/*in,out*/, H5D_time_allo case H5D_CHUNKED: if(layout->u.chunk.addr==HADDR_UNDEF) { /* Create the root of the B-tree that describes chunked storage */ - if (H5F_istore_create (f, dxpl_id, layout/*out*/)<0) + if (H5D_istore_create (f, dxpl_id, layout/*out*/)<0) HGOTO_ERROR (H5E_IO, H5E_CANTINIT, FAIL, "unable to initialize chunked storage") /* Indicate that we set the storage addr */ @@ -3076,42 +3122,40 @@ done: static herr_t H5D_init_storage(H5D_t *dset, hbool_t full_overwrite, hid_t dxpl_id) { - hssize_t snpoints; /* Number of points in space (for error checking) */ - size_t npoints; /* Number of points in space */ - H5S_t *space; /* Dataset's dataspace */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT(H5D_init_storage) assert(dset); - /* Get the dataset's dataspace */ - space=dset->space; - - /* Get the number of elements in the dataset's dataspace */ - snpoints = H5S_GET_SIMPLE_EXTENT_NPOINTS(space); - assert(snpoints>=0); - H5_ASSIGN_OVERFLOW(npoints,snpoints,hssize_t,size_t); - switch (dset->layout.type) { case H5D_COMPACT: - /* If we will be immediately overwriting the values, don't bother to clear them */ - if(!full_overwrite) { - /* If the fill value is defined, initialize the data buffer with it */ - if(dset->fill.buf) - /* Initialize the cached data buffer with the fill value */ - H5V_array_fill(dset->layout.u.compact.buf, dset->fill.buf, dset->fill.size, npoints); - else /* If the fill value is default, zero set data buf. */ - HDmemset(dset->layout.u.compact.buf, 0, dset->layout.u.compact.size); - } /* end if */ + { + hssize_t snpoints; /* Number of points in space (for error checking) */ + size_t npoints; /* Number of points in space */ + + /* Get the number of elements in the dataset's dataspace */ + snpoints = H5S_GET_SIMPLE_EXTENT_NPOINTS(dset->space); + assert(snpoints>=0); + H5_ASSIGN_OVERFLOW(npoints,snpoints,hssize_t,size_t); + + /* If we will be immediately overwriting the values, don't bother to clear them */ + if(!full_overwrite) { + /* If the fill value is defined, initialize the data buffer with it */ + if(dset->fill.buf) + /* Initialize the cached data buffer with the fill value */ + H5V_array_fill(dset->layout.u.compact.buf, dset->fill.buf, dset->fill.size, npoints); + else /* If the fill value is default, zero set data buf. */ + HDmemset(dset->layout.u.compact.buf, 0, dset->layout.u.compact.size); + } /* end if */ + } break; case H5D_CONTIGUOUS: /* Don't write default fill values to external files */ /* If we will be immediately overwriting the values, don't bother to clear them */ if((dset->efl.nused==0 || dset->fill.buf) && !full_overwrite) { - if (H5F_contig_fill(dset->ent.file, dxpl_id, &(dset->layout), - space, &dset->fill, H5T_get_size(dset->type))<0) + if (H5D_contig_fill(dset->ent.file, dxpl_id, dset)<0) HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to allocate all chunks of dataset") } /* end if */ break; @@ -3121,23 +3165,8 @@ H5D_init_storage(H5D_t *dset, hbool_t full_overwrite, hid_t dxpl_id) * Allocate file space * for all chunks now and initialize each chunk with the fill value. */ - { - H5P_genplist_t *plist; /* Property list */ - int ndims; - hsize_t dim[H5O_LAYOUT_NDIMS]; - - /* Get dataset's creation property list */ - if (NULL == (plist = H5I_object(dset->dcpl_id))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset creation property list") - - /* We only handle simple data spaces so far */ - if ((ndims=H5S_get_simple_extent_dims(space, dim, NULL))<0) - HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to get simple data space info") - dim[ndims] = dset->layout.u.chunk.dim[ndims]; - - if (H5F_istore_allocate(dset->ent.file, dxpl_id, &(dset->layout), dim, plist, full_overwrite)<0) - HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to allocate all chunks of dataset") - } /* end if */ + if (H5D_istore_allocate(dset->ent.file, dxpl_id, dset, full_overwrite)<0) + HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to allocate all chunks of dataset") break; default: @@ -3149,7 +3178,7 @@ H5D_init_storage(H5D_t *dset, hbool_t full_overwrite, hid_t dxpl_id) done: FUNC_LEAVE_NOAPI(ret_value) -} +} /* end H5D_init_storage() */ /*------------------------------------------------------------------------- @@ -3211,7 +3240,7 @@ done: *------------------------------------------------------------------------- */ static hsize_t -H5D_get_storage_size(const H5D_t *dset, hid_t dxpl_id) +H5D_get_storage_size(H5D_t *dset, hid_t dxpl_id) { hsize_t ret_value; @@ -3222,7 +3251,7 @@ H5D_get_storage_size(const H5D_t *dset, hid_t dxpl_id) if(dset->layout.u.chunk.addr == HADDR_UNDEF) ret_value=0; else - ret_value = H5F_istore_allocated(dset->ent.file, dxpl_id, &dset->layout); + ret_value = H5D_istore_allocated(dset->ent.file, dxpl_id, dset); break; case H5D_CONTIGUOUS: @@ -3808,7 +3837,7 @@ H5D_set_extent(H5D_t *dset, const hsize_t *size, hid_t dxpl_id) /* Update the index values for the cached chunks for this dataset */ if(H5D_CHUNKED == dset->layout.type) - if(H5F_istore_update_cache(dset->ent.file, dxpl_id, &dset->layout, space) < 0) + if(H5D_istore_update_cache(dset->ent.file, dxpl_id, dset) < 0) HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to update cached chunk indices") /* Allocate space for the new parts of the dataset, if appropriate */ @@ -3823,23 +3852,18 @@ H5D_set_extent(H5D_t *dset, const hsize_t *size, hid_t dxpl_id) *------------------------------------------------------------------------- */ if(shrink && H5D_CHUNKED == dset->layout.type) { - H5P_genplist_t *plist; H5D_dxpl_cache_t dxpl_cache; /* Cached data transfer properties */ - /* Get the dataset creation property list */ - if(NULL == (plist = H5I_object(dset->dcpl_id))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dset creation property list") - /* Fill the DXPL cache values for later use */ if (H5D_get_dxpl_cache(dxpl_id,&dxpl_cache)<0) HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache") /* Remove excess chunks */ - if(H5F_istore_prune_by_extent(dset->ent.file, &dxpl_cache, dxpl_id, &dset->layout, space) < 0) + if(H5D_istore_prune_by_extent(dset->ent.file, &dxpl_cache, dxpl_id, dset) < 0) HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to remove chunks ") /* Reset the elements outsize the new dimensions, but in existing chunks */ - if(H5F_istore_initialize_by_extent(dset->ent.file, &dxpl_cache, dxpl_id, &dset->layout, plist, space) < 0) + if(H5D_istore_initialize_by_extent(dset->ent.file, &dxpl_cache, dxpl_id, dset) < 0) HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to initialize chunks ") } /* end if */ } /* end if */ @@ -3869,7 +3893,7 @@ done: *------------------------------------------------------------------------- */ herr_t -H5D_flush(const H5F_t *f, hid_t dxpl_id) +H5D_flush(H5F_t *f, hid_t dxpl_id, unsigned flags) { int num_dsets; /* Number of datasets in file */ hid_t *id_list=NULL; /* list of dataset IDs */ @@ -3896,11 +3920,43 @@ H5D_flush(const H5F_t *f, hid_t dxpl_id) for(j=0; jlayout.type==H5D_COMPACT && dataset->layout.u.compact.dirty) { - if(H5O_modify(&(dataset->ent), H5O_LAYOUT_ID, 0, 0, 1, &(dataset->layout), dxpl_id)<0) - HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to update layout message") - dataset->layout.u.compact.dirty = FALSE; - } /* end if */ + + /* Flush cached information for each kind of dataset */ + switch(dataset->layout.type) { + case H5D_CONTIGUOUS: + /* flush the raw data buffer, if we have a dirty one */ + if (dataset->cache.contig.sieve_buf && dataset->cache.contig.sieve_dirty) { + /* Write dirty data sieve buffer to file */ + if (H5F_block_write(f, H5FD_MEM_DRAW, dataset->cache.contig.sieve_loc, + dataset->cache.contig.sieve_size, dxpl_id, dataset->cache.contig.sieve_buf) < 0) + HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "block write failed") + + /* Reset sieve buffer dirty flag */ + dataset->cache.contig.sieve_dirty=0; + } /* end if */ + break; + + case H5D_CHUNKED: + /* Flush the raw data cache */ + if (H5D_istore_flush(f, dxpl_id, dataset, flags & (H5F_FLUSH_INVALIDATE | H5F_FLUSH_CLEAR_ONLY)) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush raw data cache") + break; + + case H5D_COMPACT: + if(dataset->layout.u.compact.dirty) { + if(H5O_modify(&(dataset->ent), H5O_LAYOUT_ID, 0, 0, 1, &(dataset->layout), dxpl_id)<0) + HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to update layout message") + dataset->layout.u.compact.dirty = FALSE; + } /* end if */ + break; + + default: + assert ("not implemented yet" && 0); +#ifdef NDEBUG + HGOTO_ERROR (H5E_IO, H5E_UNSUPPORTED, FAIL, "unsupported storage layout") +#endif /* NDEBUG */ + } /* end switch */ + } } /* end if */ @@ -3943,7 +3999,7 @@ H5Ddebug(hid_t dset_id) /* Print B-tree information */ if (H5D_CHUNKED==dset->layout.type) { - (void)H5F_istore_dump_btree(dset->ent.file, H5AC_dxpl_id, stdout, dset->layout.u.chunk.ndims, dset->layout.u.chunk.addr); + (void)H5D_istore_dump_btree(dset->ent.file, H5AC_dxpl_id, stdout, dset->layout.u.chunk.ndims, dset->layout.u.chunk.addr); } else if (H5D_CONTIGUOUS==dset->layout.type) { HDfprintf(stdout, " %-10s %a\n", "Address:", dset->layout.u.contig.addr); } diff --git a/src/H5Dcompact.c b/src/H5Dcompact.c index 4f5b75e..3701221 100644 --- a/src/H5Dcompact.c +++ b/src/H5Dcompact.c @@ -17,21 +17,22 @@ * August 5, 2002 * * Purpose: Compact dataset I/O functions. These routines are similar - * H5F_contig_* and H5F_istore_*. + * H5D_contig_* and H5D_istore_*. */ -#define H5F_PACKAGE /*suppress error about including H5Fpkg */ +#define H5D_PACKAGE /*suppress error about including H5Dpkg */ /* Pablo information */ /* (Put before include files to avoid problems with inline functions) */ -#define PABLO_MASK H5Fcompact_mask +#define PABLO_MASK H5Dcompact_mask -#include "H5private.h" -#include "H5Eprivate.h" -#include "H5Fpkg.h" -#include "H5Oprivate.h" -#include "H5FDprivate.h" /*file driver */ -#include "H5FLprivate.h" /*Free Lists */ +#include "H5private.h" /* Generic Functions */ +#include "H5Dpkg.h" /* Dataset functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Fprivate.h" /* Files */ +#include "H5FDprivate.h" /* File drivers */ +#include "H5FLprivate.h" /* Free Lists */ +#include "H5Oprivate.h" /* Object headers */ #include "H5Vprivate.h" /* Vector and array functions */ /* Interface initialization */ @@ -40,7 +41,7 @@ static int interface_initialize_g = 0; /*------------------------------------------------------------------------- - * Function: H5F_compact_readvv + * Function: H5D_compact_readvv * * Purpose: Reads some data vectors from a dataset into a buffer. * The data is in compact dataset. The address is relative @@ -60,26 +61,28 @@ static int interface_initialize_g = 0; *------------------------------------------------------------------------- */ ssize_t -H5F_compact_readvv(H5F_t UNUSED *f, const H5O_layout_t *layout, +H5D_compact_readvv(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, const H5D_t *dset, size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_size_arr[], hsize_t dset_offset_arr[], size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_size_arr[], hsize_t mem_offset_arr[], - hid_t UNUSED dxpl_id, void *buf) + void *buf) { ssize_t ret_value; /* Return value */ - FUNC_ENTER_NOAPI(H5F_compact_readvv, FAIL); + FUNC_ENTER_NOAPI(H5D_compact_readvv, FAIL); + + assert(dset); /* Use the vectorized memory copy routine to do actual work */ - if((ret_value=H5V_memcpyvv(buf,mem_max_nseq,mem_curr_seq,mem_size_arr,mem_offset_arr,layout->u.compact.buf,dset_max_nseq,dset_curr_seq,dset_size_arr,dset_offset_arr))<0) + if((ret_value=H5V_memcpyvv(buf,mem_max_nseq,mem_curr_seq,mem_size_arr,mem_offset_arr,dset->layout.u.compact.buf,dset_max_nseq,dset_curr_seq,dset_size_arr,dset_offset_arr))<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "vectorized memcpy failed"); done: FUNC_LEAVE_NOAPI(ret_value); -} /* end H5F_compact_readvv() */ +} /* end H5D_compact_readvv() */ /*------------------------------------------------------------------------- - * Function: H5F_compact_writevv + * Function: H5D_compact_writevv * * Purpose: Writes some data vectors from a dataset into a buffer. * The data is in compact dataset. The address is relative @@ -102,22 +105,23 @@ done: *------------------------------------------------------------------------- */ ssize_t -H5F_compact_writevv(H5F_t UNUSED *f, H5O_layout_t *layout, +H5D_compact_writevv(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, H5D_t *dset, size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_size_arr[], hsize_t dset_offset_arr[], size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_size_arr[], hsize_t mem_offset_arr[], - hid_t UNUSED dxpl_id, const void *buf) + const void *buf) { ssize_t ret_value; /* Return value */ - FUNC_ENTER_NOAPI(H5F_compact_writevv, FAIL); + FUNC_ENTER_NOAPI(H5D_compact_writevv, FAIL); + + assert(dset); /* Use the vectorized memory copy routine to do actual work */ - if((ret_value=H5V_memcpyvv(layout->u.compact.buf,dset_max_nseq,dset_curr_seq,dset_size_arr,dset_offset_arr,buf,mem_max_nseq,mem_curr_seq,mem_size_arr,mem_offset_arr))<0) + if((ret_value=H5V_memcpyvv(dset->layout.u.compact.buf,dset_max_nseq,dset_curr_seq,dset_size_arr,dset_offset_arr,buf,mem_max_nseq,mem_curr_seq,mem_size_arr,mem_offset_arr))<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "vectorized memcpy failed"); - layout->u.compact.dirty = TRUE; + dset->layout.u.compact.dirty = TRUE; done: FUNC_LEAVE_NOAPI(ret_value); -} /* end H5F_compact_writevv() */ - +} /* end H5D_compact_writevv() */ diff --git a/src/H5Dcontig.c b/src/H5Dcontig.c index 1255922..3e0c163 100644 --- a/src/H5Dcontig.c +++ b/src/H5Dcontig.c @@ -18,20 +18,20 @@ * * Purpose: * Contiguous dataset I/O functions. These routines are similar to - * the H5F_istore_* routines and really only an abstract way of dealing - * with the data sieve buffer from H5F_seg_read/write. + * the H5D_istore_* routines and really only an abstract way of dealing + * with the data sieve buffer from H5F_seq_read/write. */ -#define H5F_PACKAGE /*suppress error about including H5Fpkg */ +#define H5D_PACKAGE /*suppress error about including H5Dpkg */ /* Pablo information */ /* (Put before include files to avoid problems with inline functions) */ -#define PABLO_MASK H5Fcontig_mask +#define PABLO_MASK H5Dcontig_mask #include "H5private.h" /* Generic Functions */ -#include "H5Dprivate.h" /* Dataset functions */ +#include "H5Dpkg.h" /* Dataset functions */ #include "H5Eprivate.h" /* Error handling */ -#include "H5Fpkg.h" /* Files */ +#include "H5Fprivate.h" /* Files */ #include "H5FDprivate.h" /* File drivers */ #include "H5FLprivate.h" /* Free Lists */ #include "H5MFprivate.h" /* File memory management */ @@ -41,8 +41,8 @@ #include "H5Vprivate.h" /* Vector and array functions */ /* Private prototypes */ -static herr_t H5F_contig_write(H5F_t *f, hsize_t max_data, haddr_t addr, - const size_t size, hid_t dxpl_id, const void *buf); +static herr_t H5D_contig_write(H5F_t *f, hid_t dxpl_id, H5D_t *dset, + hsize_t offset, size_t size, const void *buf); /* Interface initialization */ static int interface_initialize_g = 0; @@ -59,7 +59,7 @@ H5FL_BLK_DEFINE_STATIC(zero_fill); /*------------------------------------------------------------------------- - * Function: H5F_contig_create + * Function: H5D_contig_create * * Purpose: Allocate file space for a contiguously stored dataset * @@ -73,27 +73,27 @@ H5FL_BLK_DEFINE_STATIC(zero_fill); *------------------------------------------------------------------------- */ herr_t -H5F_contig_create(H5F_t *f, hid_t dxpl_id, struct H5O_layout_t *layout) +H5D_contig_create(H5F_t *f, hid_t dxpl_id, H5D_t *dset) { herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_contig_create, FAIL); + FUNC_ENTER_NOAPI(H5D_contig_create, FAIL); /* check args */ assert(f); - assert(layout); + assert(dset); /* Allocate space for the contiguous data */ - if (HADDR_UNDEF==(layout->u.contig.addr=H5MF_alloc(f, H5FD_MEM_DRAW, dxpl_id, layout->u.contig.size))) + if (HADDR_UNDEF==(dset->layout.u.contig.addr=H5MF_alloc(f, H5FD_MEM_DRAW, dxpl_id, dset->layout.u.contig.size))) HGOTO_ERROR (H5E_IO, H5E_NOSPACE, FAIL, "unable to reserve file space"); done: FUNC_LEAVE_NOAPI(ret_value); -} /* end H5F_contig_create */ +} /* end H5D_contig_create */ /*------------------------------------------------------------------------- - * Function: H5F_contig_fill + * Function: H5D_contig_fill * * Purpose: Write fill values to a contiguously stored dataset. * @@ -110,16 +110,15 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_contig_fill(H5F_t *f, hid_t dxpl_id, struct H5O_layout_t *layout, - const struct H5S_t *space, - const struct H5O_fill_t *fill, size_t elmt_size) +H5D_contig_fill(H5F_t *f, hid_t dxpl_id, H5D_t *dset) { hssize_t snpoints; /* Number of points in space (for error checking) */ size_t npoints; /* Number of points in space */ size_t ptsperbuf; /* Maximum # of points which fit in the buffer */ + size_t elmt_size; /* Size of each element */ size_t bufsize=64*1024; /* Size of buffer to write */ size_t size; /* Current # of points to write */ - haddr_t addr; /* Offset of dataset */ + hsize_t offset; /* Offset of dataset */ void *buf = NULL; /* Buffer for fill value writing */ #ifdef H5_HAVE_PARALLEL MPI_Comm mpi_comm=MPI_COMM_NULL; /* MPI communicator for file */ @@ -131,26 +130,25 @@ H5F_contig_fill(H5F_t *f, hid_t dxpl_id, struct H5O_layout_t *layout, int non_zero_fill_f=(-1); /* Indicate that a non-zero fill-value was used */ herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_contig_fill, FAIL); + FUNC_ENTER_NOAPI(H5D_contig_fill, FAIL); /* Check args */ assert(f); assert(TRUE==H5P_isa_class(dxpl_id,H5P_DATASET_XFER)); - assert(layout && H5D_CONTIGUOUS==layout->type); - assert(H5F_addr_defined(layout->u.contig.addr)); - assert(layout->u.contig.size>0); - assert(space); - assert(elmt_size>0); + assert(dset && H5D_CONTIGUOUS==dset->layout.type); + assert(H5F_addr_defined(dset->layout.u.contig.addr)); + assert(dset->layout.u.contig.size>0); + assert(dset->space); #ifdef H5_HAVE_PARALLEL /* Retrieve MPI parameters */ if(IS_H5FD_MPI(f)) { /* Get the MPI communicator */ - if (MPI_COMM_NULL == (mpi_comm=H5FD_mpi_get_comm(f->shared->lf))) + if (MPI_COMM_NULL == (mpi_comm=H5F_mpi_get_comm(f))) HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "Can't retrieve MPI communicator"); /* Get the MPI rank & size */ - if ((mpi_rank=H5FD_mpi_get_rank(f->shared->lf))<0) + if ((mpi_rank=H5F_mpi_get_rank(f))<0) HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "Can't retrieve MPI rank"); /* Set the MPI-capable file driver flag */ @@ -158,14 +156,18 @@ H5F_contig_fill(H5F_t *f, hid_t dxpl_id, struct H5O_layout_t *layout, } /* end if */ #endif /* H5_HAVE_PARALLEL */ + /* Get size of elements */ + elmt_size=H5T_get_size(dset->type); + assert(elmt_size>0); + /* Get the number of elements in the dataset's dataspace */ - snpoints = H5S_GET_SIMPLE_EXTENT_NPOINTS(space); + snpoints = H5S_GET_SIMPLE_EXTENT_NPOINTS(dset->space); assert(snpoints>=0); H5_ASSIGN_OVERFLOW(npoints,snpoints,hssize_t,size_t); /* If fill value is not library default, use it to set the element size */ - if(fill->buf) - elmt_size=fill->size; + if(dset->fill.buf) + elmt_size=dset->fill.size; /* * Fill the entire current extent with the fill value. We can do @@ -176,12 +178,12 @@ H5F_contig_fill(H5F_t *f, hid_t dxpl_id, struct H5O_layout_t *layout, bufsize = ptsperbuf*elmt_size; /* Fill the buffer with the user's fill value */ - if(fill->buf) { + if(dset->fill.buf) { /* Allocate temporary buffer */ if ((buf=H5FL_BLK_MALLOC(non_zero_fill,bufsize))==NULL) HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for fill buffer"); - H5V_array_fill(buf, fill->buf, elmt_size, ptsperbuf); + H5V_array_fill(buf, dset->fill.buf, elmt_size, ptsperbuf); /* Indicate that a non-zero fill buffer was used */ non_zero_fill_f=1; @@ -206,7 +208,7 @@ H5F_contig_fill(H5F_t *f, hid_t dxpl_id, struct H5O_layout_t *layout, } /* end else */ /* Start at the beginning of the dataset */ - addr = layout->u.contig.addr; + offset = 0; /* Loop through writing the fill value to the dataset */ while (npoints>0) { @@ -218,7 +220,7 @@ H5F_contig_fill(H5F_t *f, hid_t dxpl_id, struct H5O_layout_t *layout, /* Write the chunks out from only one process */ /* !! Use the internal "independent" DXPL!! -QAK */ if(H5_PAR_META_WRITE==mpi_rank) { - if (H5F_contig_write(f, (hsize_t)size, addr, size, H5AC_ind_dxpl_id, buf)<0) + if (H5D_contig_write(f, H5AC_ind_dxpl_id, dset, offset, size, buf)<0) HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to write fill value to dataset"); } /* end if */ @@ -228,14 +230,14 @@ H5F_contig_fill(H5F_t *f, hid_t dxpl_id, struct H5O_layout_t *layout, else { #endif /* H5_HAVE_PARALLEL */ H5_CHECK_OVERFLOW(size,size_t,hsize_t); - if (H5F_contig_write(f, (hsize_t)size, addr, size, dxpl_id, buf)<0) + if (H5D_contig_write(f, dxpl_id, dset, offset, size, buf)<0) HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to write fill value to dataset"); #ifdef H5_HAVE_PARALLEL } /* end else */ #endif /* H5_HAVE_PARALLEL */ npoints -= MIN(ptsperbuf, npoints); - addr += size; + offset += size; } /* end while */ #ifdef H5_HAVE_PARALLEL @@ -262,11 +264,11 @@ done: } /* end if */ FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_contig_fill() */ /*------------------------------------------------------------------------- - * Function: H5F_contig_delete + * Function: H5D_contig_delete * * Purpose: Delete the file space for a contiguously stored dataset * @@ -280,31 +282,60 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_contig_delete(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout) +H5D_contig_delete(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout) { herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_contig_delete, FAIL); + FUNC_ENTER_NOAPI(H5D_contig_delete, FAIL); /* check args */ assert(f); assert(layout); - /* Check for overlap with the sieve buffer and reset it */ - if (H5F_sieve_overlap_clear(f, dxpl_id, layout->u.contig.addr, layout->u.contig.size)<0) - HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to clear sieve buffer"); - /* Free the file space for the chunk */ if (H5MF_xfree(f, H5FD_MEM_DRAW, dxpl_id, layout->u.contig.addr, layout->u.contig.size)<0) HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free object header"); done: FUNC_LEAVE_NOAPI(ret_value); -} /* end H5F_contig_delete */ +} /* end H5D_contig_delete */ + + +/*------------------------------------------------------------------------- + * Function: H5D_contig_get_addr + * + * Purpose: Get the offset of the contiguous data on disk + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * June 2, 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +haddr_t +H5D_contig_get_addr(const H5D_t *dset) +{ + haddr_t ret_value; /* Return value */ + + FUNC_ENTER_NOAPI(H5D_contig_get_addr, HADDR_UNDEF); + + /* check args */ + assert(dset); + assert(dset->layout.type==H5D_CONTIGUOUS); + + /* Get the address */ + ret_value=dset->layout.u.contig.addr; + +done: + FUNC_LEAVE_NOAPI(ret_value); +} /* end H5D_contig_get_addr */ /*------------------------------------------------------------------------- - * Function: H5F_contig_write + * Function: H5D_contig_write * * Purpose: Writes some data from a dataset into a buffer. * The data is contiguous. The address is relative to the base @@ -321,32 +352,34 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5F_contig_write(H5F_t *f, hsize_t max_data, haddr_t addr, - const size_t size, hid_t dxpl_id, const void *buf) +H5D_contig_write(H5F_t *f, hid_t dxpl_id, H5D_t *dset, + hsize_t offset, size_t size, const void *buf) { - hsize_t dset_off=0; /* Offset in dataset */ - hsize_t mem_off=0; /* Offset in memory */ + hsize_t dset_off=offset; /* Offset in dataset */ size_t dset_len=size; /* Length in dataset */ + size_t dset_curr_seq=0; /* "Current sequence" in dataset */ + hsize_t mem_off=0; /* Offset in memory */ size_t mem_len=size; /* Length in memory */ size_t mem_curr_seq=0; /* "Current sequence" in memory */ - size_t dset_curr_seq=0; /* "Current sequence" in dataset */ herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_contig_write, FAIL); + FUNC_ENTER_NOAPI(H5D_contig_write, FAIL); assert (f); + assert (dset); assert (buf); - if (H5F_contig_writevv(f, max_data, addr, 1, &dset_curr_seq, &dset_len, &dset_off, 1, &mem_curr_seq, &mem_len, &mem_off, dxpl_id, buf)<0) + if (H5D_contig_writevv(f, dxpl_id, dset, dset->layout.u.contig.addr, dset->layout.u.contig.size, + 1, &dset_curr_seq, &dset_len, &dset_off, 1, &mem_curr_seq, &mem_len, &mem_off, buf)<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "vector write failed"); done: FUNC_LEAVE_NOAPI(ret_value); -} /* end H5F_contig_write() */ +} /* end H5D_contig_write() */ /*------------------------------------------------------------------------- - * Function: H5F_contig_readvv + * Function: H5D_contig_readvv * * Purpose: Reads some data vectors from a dataset into a buffer. * The data is contiguous. The address is the start of the dataset, @@ -366,10 +399,11 @@ done: *------------------------------------------------------------------------- */ ssize_t -H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, +H5D_contig_readvv(H5F_t *f, hid_t dxpl_id, H5D_t *dset, + haddr_t dset_addr, hsize_t dset_size, size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[], size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], - hid_t dxpl_id, void *_buf) + void *_buf) { unsigned char *buf=(unsigned char *)_buf; /* Pointer to buffer to fill */ haddr_t abs_eoa; /* Absolute end of file address */ @@ -381,14 +415,15 @@ H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, size_t v; /* Counting variable */ ssize_t ret_value=0; /* Return value */ - FUNC_ENTER_NOAPI(H5F_contig_readvv, FAIL); + FUNC_ENTER_NOAPI(H5D_contig_readvv, FAIL); /* Check args */ assert(f); + assert(dset); assert(buf); /* Check if data sieving is enabled */ - if(f->shared->lf->feature_flags&H5FD_FEAT_DATA_SIEVE) { + if(H5F_HAS_FEATURE(f,H5FD_FEAT_DATA_SIEVE)) { haddr_t sieve_start, sieve_end; /* Start & end locations of sieve buffer */ haddr_t contig_end; /* End locations of block to write */ size_t sieve_size; /* size of sieve buffer */ @@ -398,7 +433,7 @@ H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, v=*mem_curr_seq; /* No data sieve buffer yet, go allocate one */ - if(f->shared->sieve_buf==NULL) { + if(dset->cache.contig.sieve_buf==NULL) { /* Choose smallest buffer to write */ if(mem_len_arr[v]f->shared->sieve_buf_size) { + if(size>dset->cache.contig.sieve_buf_size) { if (H5F_block_read(f, H5FD_MEM_DRAW, addr, size, dxpl_id, buf)<0) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "block read failed"); } /* end if */ else { /* Allocate room for the data sieve buffer */ - if (NULL==(f->shared->sieve_buf=H5FL_BLK_MALLOC(sieve_buf,f->shared->sieve_buf_size))) + if (NULL==(dset->cache.contig.sieve_buf=H5FL_BLK_MALLOC(sieve_buf,dset->cache.contig.sieve_buf_size))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed"); /* Determine the new sieve buffer size & location */ - f->shared->sieve_loc=addr; + dset->cache.contig.sieve_loc=addr; /* Make certain we don't read off the end of the file */ - if (HADDR_UNDEF==(abs_eoa=H5FD_get_eoa(f->shared->lf))) + if (HADDR_UNDEF==(abs_eoa=H5F_get_eoa(f))) HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to determine file size"); /* Adjust absolute EOA address to relative EOA address */ - rel_eoa=abs_eoa-f->shared->base_addr; + rel_eoa=abs_eoa-H5F_get_base_addr(f); /* Compute the size of the sieve buffer */ - H5_ASSIGN_OVERFLOW(f->shared->sieve_size,MIN(rel_eoa-f->shared->sieve_loc,MIN(max_data,f->shared->sieve_buf_size)),hsize_t,size_t); + H5_ASSIGN_OVERFLOW(dset->cache.contig.sieve_size,MIN3(rel_eoa-dset->cache.contig.sieve_loc,max_data,dset->cache.contig.sieve_buf_size),hsize_t,size_t); /* Read the new sieve buffer */ - if (H5F_block_read(f, H5FD_MEM_DRAW, f->shared->sieve_loc, f->shared->sieve_size, dxpl_id, f->shared->sieve_buf)<0) + if (H5F_block_read(f, H5FD_MEM_DRAW, dset->cache.contig.sieve_loc, dset->cache.contig.sieve_size, dxpl_id, dset->cache.contig.sieve_buf)<0) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "block read failed"); /* Grab the data out of the buffer (must be first piece of data in buffer ) */ - HDmemcpy(buf,f->shared->sieve_buf,size); + HDmemcpy(buf,dset->cache.contig.sieve_buf,size); /* Reset sieve buffer dirty flag */ - f->shared->sieve_dirty=0; + dset->cache.contig.sieve_dirty=0; } /* end else */ /* Update memory information */ @@ -465,8 +500,8 @@ H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, } /* end if */ /* Stash local copies of these value */ - sieve_start=f->shared->sieve_loc; - sieve_size=f->shared->sieve_size; + sieve_start=dset->cache.contig.sieve_loc; + sieve_size=dset->cache.contig.sieve_size; sieve_end=sieve_start+sieve_size; /* Works through sequences as fast as possible */ @@ -478,7 +513,7 @@ H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, size=dset_len_arr[u]; /* Compute offset on disk */ - addr=_addr+dset_offset_arr[u]; + addr=dset_addr+dset_offset_arr[u]; /* Compute offset in memory */ buf = (unsigned char *)_buf + mem_offset_arr[v]; @@ -488,7 +523,7 @@ H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, /* If entire read is within the sieve buffer, read it from the buffer */ if(addr>=sieve_start && contig_endshared->sieve_buf+(addr-sieve_start); + unsigned char *base_sieve_buf=dset->cache.contig.sieve_buf+(addr-sieve_start); /* Grab the data out of the buffer */ HDmemcpy(buf,base_sieve_buf,size); @@ -496,18 +531,18 @@ H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, /* Entire request is not within this data sieve buffer */ else { /* Check if we can actually hold the I/O request in the sieve buffer */ - if(size>f->shared->sieve_buf_size) { + if(size>dset->cache.contig.sieve_buf_size) { /* Check for any overlap with the current sieve buffer */ if((sieve_start>=addr && sieve_start<(contig_end+1)) || ((sieve_end-1)>=addr && (sieve_end-1)<(contig_end+1))) { /* Flush the sieve buffer, if it's dirty */ - if(f->shared->sieve_dirty) { + if(dset->cache.contig.sieve_dirty) { /* Write to file */ - if (H5F_block_write(f, H5FD_MEM_DRAW, sieve_start, sieve_size, dxpl_id, f->shared->sieve_buf)<0) + if (H5F_block_write(f, H5FD_MEM_DRAW, sieve_start, sieve_size, dxpl_id, dset->cache.contig.sieve_buf)<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "block write failed"); /* Reset sieve buffer dirty flag */ - f->shared->sieve_dirty=0; + dset->cache.contig.sieve_dirty=0; } /* end if */ } /* end if */ @@ -518,46 +553,46 @@ H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, /* Element size fits within the buffer size */ else { /* Flush the sieve buffer if it's dirty */ - if(f->shared->sieve_dirty) { + if(dset->cache.contig.sieve_dirty) { /* Write to file */ - if (H5F_block_write(f, H5FD_MEM_DRAW, sieve_start, sieve_size, dxpl_id, f->shared->sieve_buf)<0) + if (H5F_block_write(f, H5FD_MEM_DRAW, sieve_start, sieve_size, dxpl_id, dset->cache.contig.sieve_buf)<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "block write failed"); /* Reset sieve buffer dirty flag */ - f->shared->sieve_dirty=0; + dset->cache.contig.sieve_dirty=0; } /* end if */ /* Determine the new sieve buffer size & location */ - f->shared->sieve_loc=addr; + dset->cache.contig.sieve_loc=addr; /* Make certain we don't read off the end of the file */ - if (HADDR_UNDEF==(abs_eoa=H5FD_get_eoa(f->shared->lf))) + if (HADDR_UNDEF==(abs_eoa=H5F_get_eoa(f))) HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to determine file size"); /* Adjust absolute EOA address to relative EOA address */ - rel_eoa=abs_eoa-f->shared->base_addr; + rel_eoa=abs_eoa-H5F_get_base_addr(f); /* Only need this when resizing sieve buffer */ - max_data=_max_data-dset_offset_arr[u]; + max_data=dset_size-dset_offset_arr[u]; /* Compute the size of the sieve buffer */ /* Don't read off the end of the file, don't read past the end of the data element and don't read more than the buffer size */ - H5_ASSIGN_OVERFLOW(f->shared->sieve_size,MIN(rel_eoa-f->shared->sieve_loc,MIN(max_data,f->shared->sieve_buf_size)),hsize_t,size_t); + H5_ASSIGN_OVERFLOW(dset->cache.contig.sieve_size,MIN3(rel_eoa-dset->cache.contig.sieve_loc,max_data,dset->cache.contig.sieve_buf_size),hsize_t,size_t); /* Update local copies of sieve information */ - sieve_start=f->shared->sieve_loc; - sieve_size=f->shared->sieve_size; + sieve_start=dset->cache.contig.sieve_loc; + sieve_size=dset->cache.contig.sieve_size; sieve_end=sieve_start+sieve_size; /* Read the new sieve buffer */ - if (H5F_block_read(f, H5FD_MEM_DRAW, f->shared->sieve_loc, f->shared->sieve_size, dxpl_id, f->shared->sieve_buf)<0) + if (H5F_block_read(f, H5FD_MEM_DRAW, dset->cache.contig.sieve_loc, dset->cache.contig.sieve_size, dxpl_id, dset->cache.contig.sieve_buf)<0) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "block read failed"); /* Grab the data out of the buffer (must be first piece of data in buffer ) */ - HDmemcpy(buf,f->shared->sieve_buf,size); + HDmemcpy(buf,dset->cache.contig.sieve_buf,size); /* Reset sieve buffer dirty flag */ - f->shared->sieve_dirty=0; + dset->cache.contig.sieve_dirty=0; } /* end else */ } /* end else */ @@ -587,7 +622,7 @@ H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, size=dset_len_arr[u]; /* Compute offset on disk */ - addr=_addr+dset_offset_arr[u]; + addr=dset_addr+dset_offset_arr[u]; /* Compute offset in memory */ buf = (unsigned char *)_buf + mem_offset_arr[v]; @@ -619,11 +654,11 @@ H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, done: FUNC_LEAVE_NOAPI(ret_value); -} /* end H5F_contig_readvv() */ +} /* end H5D_contig_readvv() */ /*------------------------------------------------------------------------- - * Function: H5F_contig_writevv + * Function: H5D_contig_writevv * * Purpose: Writes some data vectors into a dataset from vectors into a * buffer. The address is the start of the dataset, @@ -643,10 +678,11 @@ done: *------------------------------------------------------------------------- */ ssize_t -H5F_contig_writevv(H5F_t *f, hsize_t _max_data, haddr_t _addr, +H5D_contig_writevv(H5F_t *f, hid_t dxpl_id, H5D_t *dset, + haddr_t dset_addr, hsize_t dset_size, size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[], size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], - hid_t dxpl_id, const void *_buf) + const void *_buf) { const unsigned char *buf=_buf; /* Pointer to buffer to fill */ haddr_t abs_eoa; /* Absolute end of file address */ @@ -658,14 +694,15 @@ H5F_contig_writevv(H5F_t *f, hsize_t _max_data, haddr_t _addr, size_t v; /* Counting variable */ ssize_t ret_value=0; /* Return value */ - FUNC_ENTER_NOAPI(H5F_contig_writevv, FAIL); + FUNC_ENTER_NOAPI(H5D_contig_writevv, FAIL); /* Check args */ assert(f); + assert(dset); assert(buf); /* Check if data sieving is enabled */ - if(f->shared->lf->feature_flags&H5FD_FEAT_DATA_SIEVE) { + if(H5F_HAS_FEATURE(f,H5FD_FEAT_DATA_SIEVE)) { haddr_t sieve_start, sieve_end; /* Start & end locations of sieve buffer */ haddr_t contig_end; /* End locations of block to write */ size_t sieve_size; /* size of sieve buffer */ @@ -675,7 +712,7 @@ H5F_contig_writevv(H5F_t *f, hsize_t _max_data, haddr_t _addr, v=*mem_curr_seq; /* No data sieve buffer yet, go allocate one */ - if(f->shared->sieve_buf==NULL) { + if(dset->cache.contig.sieve_buf==NULL) { /* Choose smallest buffer to write */ if(mem_len_arr[v]f->shared->sieve_buf_size) { + if(size>dset->cache.contig.sieve_buf_size) { if (H5F_block_write(f, H5FD_MEM_DRAW, addr, size, dxpl_id, buf)<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "block write failed"); } /* end if */ else { /* Allocate room for the data sieve buffer */ - if (NULL==(f->shared->sieve_buf=H5FL_BLK_MALLOC(sieve_buf,f->shared->sieve_buf_size))) + if (NULL==(dset->cache.contig.sieve_buf=H5FL_BLK_MALLOC(sieve_buf,dset->cache.contig.sieve_buf_size))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed"); /* Determine the new sieve buffer size & location */ - f->shared->sieve_loc=addr; + dset->cache.contig.sieve_loc=addr; /* Make certain we don't read off the end of the file */ - if (HADDR_UNDEF==(abs_eoa=H5FD_get_eoa(f->shared->lf))) + if (HADDR_UNDEF==(abs_eoa=H5F_get_eoa(f))) HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to determine file size"); /* Adjust absolute EOA address to relative EOA address */ - rel_eoa=abs_eoa-f->shared->base_addr; + rel_eoa=abs_eoa-H5F_get_base_addr(f); /* Compute the size of the sieve buffer */ - H5_ASSIGN_OVERFLOW(f->shared->sieve_size,MIN(rel_eoa-f->shared->sieve_loc,MIN(max_data,f->shared->sieve_buf_size)),hsize_t,size_t); + H5_ASSIGN_OVERFLOW(dset->cache.contig.sieve_size,MIN3(rel_eoa-dset->cache.contig.sieve_loc,max_data,dset->cache.contig.sieve_buf_size),hsize_t,size_t); /* Check if there is any point in reading the data from the file */ - if(f->shared->sieve_size>size) { + if(dset->cache.contig.sieve_size>size) { /* Read the new sieve buffer */ - if (H5F_block_read(f, H5FD_MEM_DRAW, f->shared->sieve_loc, f->shared->sieve_size, dxpl_id, f->shared->sieve_buf)<0) + if (H5F_block_read(f, H5FD_MEM_DRAW, dset->cache.contig.sieve_loc, dset->cache.contig.sieve_size, dxpl_id, dset->cache.contig.sieve_buf)<0) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "block read failed"); } /* end if */ /* Grab the data out of the buffer (must be first piece of data in buffer ) */ - HDmemcpy(f->shared->sieve_buf,buf,size); + HDmemcpy(dset->cache.contig.sieve_buf,buf,size); /* Set sieve buffer dirty flag */ - f->shared->sieve_dirty=1; + dset->cache.contig.sieve_dirty=1; } /* end else */ /* Update memory information */ @@ -745,8 +782,8 @@ H5F_contig_writevv(H5F_t *f, hsize_t _max_data, haddr_t _addr, } /* end if */ /* Stash local copies of these value */ - sieve_start=f->shared->sieve_loc; - sieve_size=f->shared->sieve_size; + sieve_start=dset->cache.contig.sieve_loc; + sieve_size=dset->cache.contig.sieve_size; sieve_end=sieve_start+sieve_size; /* Works through sequences as fast as possible */ @@ -758,7 +795,7 @@ H5F_contig_writevv(H5F_t *f, hsize_t _max_data, haddr_t _addr, size=dset_len_arr[u]; /* Compute offset on disk */ - addr=_addr+dset_offset_arr[u]; + addr=dset_addr+dset_offset_arr[u]; /* Compute offset in memory */ buf = (const unsigned char *)_buf + mem_offset_arr[v]; @@ -768,35 +805,35 @@ H5F_contig_writevv(H5F_t *f, hsize_t _max_data, haddr_t _addr, /* If entire write is within the sieve buffer, write it to the buffer */ if(addr>=sieve_start && contig_endshared->sieve_buf+(addr-sieve_start); + unsigned char *base_sieve_buf=dset->cache.contig.sieve_buf+(addr-sieve_start); /* Put the data into the sieve buffer */ HDmemcpy(base_sieve_buf,buf,size); /* Set sieve buffer dirty flag */ - f->shared->sieve_dirty=1; + dset->cache.contig.sieve_dirty=1; } /* end if */ /* Entire request is not within this data sieve buffer */ else { /* Check if we can actually hold the I/O request in the sieve buffer */ - if(size>f->shared->sieve_buf_size) { + if(size>dset->cache.contig.sieve_buf_size) { /* Check for any overlap with the current sieve buffer */ if((sieve_start>=addr && sieve_start<(contig_end+1)) || ((sieve_end-1)>=addr && (sieve_end-1)<(contig_end+1))) { /* Flush the sieve buffer, if it's dirty */ - if(f->shared->sieve_dirty) { + if(dset->cache.contig.sieve_dirty) { /* Write to file */ - if (H5F_block_write(f, H5FD_MEM_DRAW, sieve_start, sieve_size, dxpl_id, f->shared->sieve_buf)<0) + if (H5F_block_write(f, H5FD_MEM_DRAW, sieve_start, sieve_size, dxpl_id, dset->cache.contig.sieve_buf)<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "block write failed"); /* Reset sieve buffer dirty flag */ - f->shared->sieve_dirty=0; + dset->cache.contig.sieve_dirty=0; } /* end if */ /* Force the sieve buffer to be re-read the next time */ - f->shared->sieve_loc=HADDR_UNDEF; - f->shared->sieve_size=0; + dset->cache.contig.sieve_loc=HADDR_UNDEF; + dset->cache.contig.sieve_size=0; } /* end if */ /* Write directly from the user's buffer */ @@ -807,81 +844,81 @@ H5F_contig_writevv(H5F_t *f, hsize_t _max_data, haddr_t _addr, else { /* Check if it is possible to (exactly) prepend or append to existing (dirty) sieve buffer */ if(((addr+size)==sieve_start || addr==sieve_end) && - (size+sieve_size)<=f->shared->sieve_buf_size && - f->shared->sieve_dirty) { + (size+sieve_size)<=dset->cache.contig.sieve_buf_size && + dset->cache.contig.sieve_dirty) { /* Prepend to existing sieve buffer */ if((addr+size)==sieve_start) { /* Move existing sieve information to correct location */ - HDmemmove(f->shared->sieve_buf+size,f->shared->sieve_buf,sieve_size); + HDmemmove(dset->cache.contig.sieve_buf+size,dset->cache.contig.sieve_buf,sieve_size); /* Copy in new information (must be first in sieve buffer) */ - HDmemcpy(f->shared->sieve_buf,buf,size); + HDmemcpy(dset->cache.contig.sieve_buf,buf,size); /* Adjust sieve location */ - f->shared->sieve_loc=addr; + dset->cache.contig.sieve_loc=addr; } /* end if */ /* Append to existing sieve buffer */ else { /* Copy in new information */ - HDmemcpy(f->shared->sieve_buf+sieve_size,buf,size); + HDmemcpy(dset->cache.contig.sieve_buf+sieve_size,buf,size); } /* end else */ /* Adjust sieve size */ - f->shared->sieve_size += size; + dset->cache.contig.sieve_size += size; /* Update local copies of sieve information */ - sieve_start=f->shared->sieve_loc; - sieve_size=f->shared->sieve_size; + sieve_start=dset->cache.contig.sieve_loc; + sieve_size=dset->cache.contig.sieve_size; sieve_end=sieve_start+sieve_size; } /* end if */ /* Can't add the new data onto the existing sieve buffer */ else { /* Flush the sieve buffer if it's dirty */ - if(f->shared->sieve_dirty) { + if(dset->cache.contig.sieve_dirty) { /* Write to file */ - if (H5F_block_write(f, H5FD_MEM_DRAW, sieve_start, sieve_size, dxpl_id, f->shared->sieve_buf)<0) + if (H5F_block_write(f, H5FD_MEM_DRAW, sieve_start, sieve_size, dxpl_id, dset->cache.contig.sieve_buf)<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "block write failed"); /* Reset sieve buffer dirty flag */ - f->shared->sieve_dirty=0; + dset->cache.contig.sieve_dirty=0; } /* end if */ /* Determine the new sieve buffer size & location */ - f->shared->sieve_loc=addr; + dset->cache.contig.sieve_loc=addr; /* Make certain we don't read off the end of the file */ - if (HADDR_UNDEF==(abs_eoa=H5FD_get_eoa(f->shared->lf))) + if (HADDR_UNDEF==(abs_eoa=H5F_get_eoa(f))) HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to determine file size"); /* Adjust absolute EOA address to relative EOA address */ - rel_eoa=abs_eoa-f->shared->base_addr; + rel_eoa=abs_eoa-H5F_get_base_addr(f); /* Only need this when resizing sieve buffer */ - max_data=_max_data-dset_offset_arr[u]; + max_data=dset_size-dset_offset_arr[u]; /* Compute the size of the sieve buffer */ /* Don't read off the end of the file, don't read past the end of the data element and don't read more than the buffer size */ - H5_ASSIGN_OVERFLOW(f->shared->sieve_size,MIN(rel_eoa-f->shared->sieve_loc,MIN(max_data,f->shared->sieve_buf_size)),hsize_t,size_t); + H5_ASSIGN_OVERFLOW(dset->cache.contig.sieve_size,MIN3(rel_eoa-dset->cache.contig.sieve_loc,max_data,dset->cache.contig.sieve_buf_size),hsize_t,size_t); /* Update local copies of sieve information */ - sieve_start=f->shared->sieve_loc; - sieve_size=f->shared->sieve_size; + sieve_start=dset->cache.contig.sieve_loc; + sieve_size=dset->cache.contig.sieve_size; sieve_end=sieve_start+sieve_size; /* Check if there is any point in reading the data from the file */ - if(f->shared->sieve_size>size) { + if(dset->cache.contig.sieve_size>size) { /* Read the new sieve buffer */ - if (H5F_block_read(f, H5FD_MEM_DRAW, f->shared->sieve_loc, f->shared->sieve_size, dxpl_id, f->shared->sieve_buf)<0) + if (H5F_block_read(f, H5FD_MEM_DRAW, dset->cache.contig.sieve_loc, dset->cache.contig.sieve_size, dxpl_id, dset->cache.contig.sieve_buf)<0) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "block read failed"); } /* end if */ /* Grab the data out of the buffer (must be first piece of data in buffer ) */ - HDmemcpy(f->shared->sieve_buf,buf,size); + HDmemcpy(dset->cache.contig.sieve_buf,buf,size); /* Set sieve buffer dirty flag */ - f->shared->sieve_dirty=1; + dset->cache.contig.sieve_dirty=1; } /* end else */ } /* end else */ @@ -913,7 +950,7 @@ H5F_contig_writevv(H5F_t *f, hsize_t _max_data, haddr_t _addr, size=dset_len_arr[u]; /* Compute offset on disk */ - addr=_addr+dset_offset_arr[u]; + addr=dset_addr+dset_offset_arr[u]; /* Compute offset in memory */ buf = (const unsigned char *)_buf + mem_offset_arr[v]; @@ -945,5 +982,5 @@ H5F_contig_writevv(H5F_t *f, hsize_t _max_data, haddr_t _addr, done: FUNC_LEAVE_NOAPI(ret_value); -} /* end H5F_contig_writevv() */ +} /* end H5D_contig_writevv() */ diff --git a/src/H5Dio.c b/src/H5Dio.c index 2d6d016..77b9926 100644 --- a/src/H5Dio.c +++ b/src/H5Dio.c @@ -1088,9 +1088,11 @@ H5D_contig_read(hsize_t nelmts, H5D_t *dataset, const H5T_t *mem_type, H5S_NULL == H5S_GET_SIMPLE_EXTENT_TYPE(file_space) || dataset->layout.type==H5D_COMPACT); H5_CHECK_OVERFLOW(nelmts,hsize_t,size_t); - status = (sconv->read)(dataset->ent.file, &(dataset->layout), - &dataset->dcpl_cache, (H5D_storage_t *)&(dataset->efl), (size_t)nelmts, H5T_get_size(dataset->type), - file_space, mem_space, dxpl_cache, dxpl_id, buf/*out*/); + status = (sconv->read)(dataset->ent.file, dxpl_cache, dxpl_id, + dataset, (H5D_storage_t *)&(dataset->efl), + (size_t)nelmts, H5T_get_size(dataset->type), + file_space, mem_space, + buf/*out*/); #ifdef H5S_DEBUG H5_timer_end(&(sconv->stats[1].read_timer), &timer); sconv->stats[1].read_nbytes += nelmts * H5T_get_size(dataset->type); @@ -1185,9 +1187,10 @@ H5D_contig_read(hsize_t nelmts, H5D_t *dataset, const H5T_t *mem_type, || (dataset->layout.type==H5D_CHUNKED && H5F_addr_defined(dataset->layout.u.chunk.addr))) || dataset->efl.nused>0 || dataset->layout.type==H5D_COMPACT); - n = H5S_select_fgath(dataset->ent.file, &(dataset->layout), - &dataset->dcpl_cache, (H5D_storage_t *)&(dataset->efl), file_space, - &file_iter, smine_nelmts, dxpl_cache, dxpl_id, tconv_buf/*out*/); + n = H5S_select_fgath(dataset->ent.file, dxpl_cache, dxpl_id, + dataset, (H5D_storage_t *)&(dataset->efl), + file_space, &file_iter, smine_nelmts, + tconv_buf/*out*/); #ifdef H5S_DEBUG H5_timer_end(&(sconv->stats[1].gath_timer), &timer); @@ -1220,11 +1223,8 @@ H5D_contig_read(hsize_t nelmts, H5D_t *dataset, const H5T_t *mem_type, /* Do the data transform after the conversion (since we're using type mem_type) */ if(!H5Z_xform_noop(dxpl_cache->data_xform_prop)) - { if( H5Z_xform_eval(dxpl_cache->data_xform_prop, tconv_buf, smine_nelmts, mem_type) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Error performing data transform") - } - /* end of LA additions */ /* * Scatter the data into memory. @@ -1313,7 +1313,7 @@ H5D_contig_write(hsize_t nelmts, H5D_t *dataset, const H5T_t *mem_type, const H5 hsize_t smine_start; /*strip mine start loc */ hsize_t n, smine_nelmts; /*elements per strip */ herr_t ret_value = SUCCEED; /*return value */ - + FUNC_ENTER_NOAPI_NOINIT(H5D_contig_write) /* @@ -1325,9 +1325,11 @@ H5D_contig_write(hsize_t nelmts, H5D_t *dataset, const H5T_t *mem_type, const H5 H5_timer_begin(&timer); #endif H5_CHECK_OVERFLOW(nelmts,hsize_t,size_t); - status = (sconv->write)(dataset->ent.file, &(dataset->layout), - &dataset->dcpl_cache, (H5D_storage_t *)&(dataset->efl), (size_t)nelmts, H5T_get_size(dataset->type), - file_space, mem_space, dxpl_cache, dxpl_id, buf); + status = (sconv->write)(dataset->ent.file, dxpl_cache, dxpl_id, + dataset, (H5D_storage_t *)&(dataset->efl), + (size_t)nelmts, H5T_get_size(dataset->type), + file_space, mem_space, + buf); #ifdef H5S_DEBUG H5_timer_end(&(sconv->stats[0].write_timer), &timer); sconv->stats[0].write_nbytes += nelmts * H5T_get_size(mem_type); @@ -1435,9 +1437,10 @@ H5D_contig_write(hsize_t nelmts, H5D_t *dataset, const H5T_t *mem_type, const H5 #ifdef H5S_DEBUG H5_timer_begin(&timer); #endif - n = H5S_select_fgath(dataset->ent.file, &(dataset->layout), - &dataset->dcpl_cache, (H5D_storage_t *)&(dataset->efl), file_space, - &bkg_iter, smine_nelmts, dxpl_cache, dxpl_id, bkg_buf/*out*/); + n = H5S_select_fgath(dataset->ent.file, dxpl_cache, dxpl_id, + dataset, (H5D_storage_t *)&(dataset->efl), + file_space, &bkg_iter, smine_nelmts, + bkg_buf/*out*/); #ifdef H5S_DEBUG H5_timer_end(&(sconv->stats[0].bkg_timer), &timer); @@ -1456,11 +1459,8 @@ H5D_contig_write(hsize_t nelmts, H5D_t *dataset, const H5T_t *mem_type, const H5 /* Do the data transform after the type conversion (since we're using dataset->type). */ if(!H5Z_xform_noop(dxpl_cache->data_xform_prop)) - { if( H5Z_xform_eval(dxpl_cache->data_xform_prop, tconv_buf, smine_nelmts, dataset->type) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Error performing data transform") - } - /* End of LA modifications */ /* * Scatter the data out to the file. @@ -1468,9 +1468,10 @@ H5D_contig_write(hsize_t nelmts, H5D_t *dataset, const H5T_t *mem_type, const H5 #ifdef H5S_DEBUG H5_timer_begin(&timer); #endif - status = H5S_select_fscat(dataset->ent.file, &(dataset->layout), - &dataset->dcpl_cache, (H5D_storage_t *)&(dataset->efl), file_space, &file_iter, - smine_nelmts, dxpl_cache, dxpl_id, tconv_buf); + status = H5S_select_fscat(dataset->ent.file, dxpl_cache, dxpl_id, + dataset, (H5D_storage_t *)&(dataset->efl), + file_space, &file_iter, smine_nelmts, + tconv_buf); #ifdef H5S_DEBUG H5_timer_end(&(sconv->stats[0].scat_timer), &timer); sconv->stats[0].scat_nbytes += smine_nelmts * dst_type_size; @@ -1591,9 +1592,11 @@ UNUSED store.chunk.index = chunk_info->index; /* Perform the actual read operation */ - status = (sconv->read)(dataset->ent.file, &(dataset->layout), - &dataset->dcpl_cache, &store, chunk_info->chunk_points, H5T_get_size(dataset->type), - chunk_info->fspace, chunk_info->mspace, dxpl_cache, dxpl_id, buf); + status = (sconv->read)(dataset->ent.file, dxpl_cache, dxpl_id, + dataset, &store, + chunk_info->chunk_points, H5T_get_size(dataset->type), + chunk_info->fspace, chunk_info->mspace, + buf); /* Check return value from optimized read */ if (status<0) @@ -1707,9 +1710,10 @@ UNUSED assert(((dataset->layout.type==H5D_CONTIGUOUS && H5F_addr_defined(dataset->layout.u.contig.addr)) || (dataset->layout.type==H5D_CHUNKED && H5F_addr_defined(dataset->layout.u.chunk.addr))) || dataset->efl.nused>0 || dataset->layout.type==H5D_COMPACT); - n = H5S_select_fgath(dataset->ent.file, &(dataset->layout), - &dataset->dcpl_cache, &store, chunk_info->fspace, - &file_iter, smine_nelmts, dxpl_cache, dxpl_id, tconv_buf/*out*/); + n = H5S_select_fgath(dataset->ent.file, dxpl_cache, dxpl_id, + dataset, &store, + chunk_info->fspace, &file_iter, smine_nelmts, + tconv_buf/*out*/); #ifdef H5S_DEBUG H5_timer_end(&(sconv->stats[1].gath_timer), &timer); @@ -1921,9 +1925,11 @@ nelmts, H5D_t *dataset, const H5T_t *mem_type, const H5S_t *mem_space, store.chunk.index = chunk_info->index; /* Perform the actual write operation */ - status = (sconv->write)(dataset->ent.file, &(dataset->layout), - &dataset->dcpl_cache, &store, chunk_info->chunk_points, H5T_get_size(dataset->type), - chunk_info->fspace, chunk_info->mspace, dxpl_cache, dxpl_id, buf); + status = (sconv->write)(dataset->ent.file, dxpl_cache, dxpl_id, + dataset, &store, + chunk_info->chunk_points, H5T_get_size(dataset->type), + chunk_info->fspace, chunk_info->mspace, + buf); /* Check return value from optimized write */ if (status<0) @@ -2068,9 +2074,10 @@ nelmts, H5D_t *dataset, const H5T_t *mem_type, const H5S_t *mem_space, #ifdef H5S_DEBUG H5_timer_begin(&timer); #endif - n = H5S_select_fgath(dataset->ent.file, &(dataset->layout), - &dataset->dcpl_cache, &store, chunk_info->fspace, - &bkg_iter, smine_nelmts, dxpl_cache, dxpl_id, bkg_buf/*out*/); + n = H5S_select_fgath(dataset->ent.file, dxpl_cache, dxpl_id, + dataset, &store, + chunk_info->fspace, &bkg_iter, smine_nelmts, + bkg_buf/*out*/); #ifdef H5S_DEBUG H5_timer_end(&(sconv->stats[0].bkg_timer), &timer); @@ -2099,9 +2106,10 @@ nelmts, H5D_t *dataset, const H5T_t *mem_type, const H5S_t *mem_space, #ifdef H5S_DEBUG H5_timer_begin(&timer); #endif - status = H5S_select_fscat(dataset->ent.file, &(dataset->layout), - &dataset->dcpl_cache, &store, chunk_info->fspace, - &file_iter, smine_nelmts, dxpl_cache, dxpl_id, tconv_buf); + status = H5S_select_fscat(dataset->ent.file, dxpl_cache, dxpl_id, + dataset, &store, + chunk_info->fspace, &file_iter, smine_nelmts, + tconv_buf); #ifdef H5S_DEBUG H5_timer_end(&(sconv->stats[0].scat_timer), &timer); diff --git a/src/H5Distore.c b/src/H5Distore.c index a5aeb70..032a776 100644 --- a/src/H5Distore.c +++ b/src/H5Distore.c @@ -41,17 +41,17 @@ */ #define H5B_PACKAGE /*suppress error about including H5Bpkg */ -#define H5F_PACKAGE /*suppress error about including H5Fpkg */ +#define H5D_PACKAGE /*suppress error about including H5Dpkg */ /* Pablo information */ /* (Put before include files to avoid problems with inline functions) */ -#define PABLO_MASK H5Fistore_mask +#define PABLO_MASK H5Distore_mask #include "H5private.h" /* Generic Functions */ #include "H5Bpkg.h" /* B-link trees */ -#include "H5Dprivate.h" /* Datasets */ +#include "H5Dpkg.h" /* Datasets */ #include "H5Eprivate.h" /* Error handling */ -#include "H5Fpkg.h" /* Files */ +#include "H5Fprivate.h" /* Files */ #include "H5FDprivate.h" /* File drivers */ #include "H5FLprivate.h" /* Free Lists */ #include "H5Iprivate.h" /* IDs */ @@ -86,7 +86,7 @@ * and the operating system can also eliminate a read operation. */ -/*#define H5F_ISTORE_DEBUG */ +/*#define H5D_ISTORE_DEBUG */ /* Interface initialization */ static int interface_initialize_g = 0; @@ -96,14 +96,12 @@ static int interface_initialize_g = 0; * Given a B-tree node return the dimensionality of the chunks pointed to by * that node. */ -#define H5F_ISTORE_NDIMS(X) ((int)(((X)->sizeof_rkey-8)/8)) +#define H5D_ISTORE_NDIMS(X) ((int)(((X)->sizeof_rkey-8)/8)) /* Raw data chunks are cached. Each entry in the cache is: */ -typedef struct H5F_rdcc_ent_t { +typedef struct H5D_rdcc_ent_t { hbool_t locked; /*entry is locked in cache */ hbool_t dirty; /*needs to be written to disk? */ - H5O_layout_t layout; /*the layout message */ - H5O_pline_t pline; /*filter pipeline message */ hssize_t offset[H5O_LAYOUT_NDIMS]; /*chunk name */ size_t rd_count; /*bytes remaining to be read */ size_t wr_count; /*bytes remaining to be written */ @@ -111,10 +109,10 @@ typedef struct H5F_rdcc_ent_t { size_t alloc_size; /*amount allocated for the chunk */ uint8_t *chunk; /*the unfiltered chunk data */ unsigned idx; /*index in hash table */ - struct H5F_rdcc_ent_t *next;/*next item in doubly-linked list */ - struct H5F_rdcc_ent_t *prev;/*previous item in doubly-linked list */ -} H5F_rdcc_ent_t; -typedef H5F_rdcc_ent_t *H5F_rdcc_ent_ptr_t; /* For free lists */ + struct H5D_rdcc_ent_t *next;/*next item in doubly-linked list */ + struct H5D_rdcc_ent_t *prev;/*previous item in doubly-linked list */ +} H5D_rdcc_ent_t; +typedef H5D_rdcc_ent_t *H5D_rdcc_ent_ptr_t; /* For free lists */ /* * B-tree key. A key contains the minimum logical N-dimensional address and @@ -130,97 +128,94 @@ typedef H5F_rdcc_ent_t *H5F_rdcc_ent_ptr_t; /* For free lists */ * * The chunk's file address is part of the B-tree and not part of the key. */ -typedef struct H5F_istore_key_t { +typedef struct H5D_istore_key_t { size_t nbytes; /*size of stored data */ hssize_t offset[H5O_LAYOUT_NDIMS]; /*logical offset to start*/ unsigned filter_mask; /*excluded filters */ -} H5F_istore_key_t; +} H5D_istore_key_t; -typedef struct H5F_istore_ud1_t { - H5F_istore_key_t key; /*key values */ +typedef struct H5D_istore_ud1_t { + H5D_istore_key_t key; /*key values */ haddr_t addr; /*file address of chunk */ H5O_layout_t mesg; /*layout message */ hsize_t total_storage; /*output from iterator */ FILE *stream; /*debug output stream */ hsize_t *dims; /*dataset dimensions */ -} H5F_istore_ud1_t; +} H5D_istore_ud1_t; -#define H5F_HASH_DIVISOR 1 /* Attempt to spread out the hashing */ - /* This should be the same size as the alignment of */ - /* of the smallest file format object written to the file. */ -#define H5F_HASH(F,ADDR) H5F_addr_hash((ADDR/H5F_HASH_DIVISOR),(F)->shared->rdcc.nslots) +#define H5D_HASH(D,ADDR) H5F_addr_hash(ADDR,(D)->cache.chunk.nslots) /* Private prototypes */ -static haddr_t H5F_istore_get_addr(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, - const hssize_t offset[], H5F_istore_ud1_t *_udata); -static void *H5F_istore_chunk_alloc(size_t size, const H5O_pline_t *pline); -static void *H5F_istore_chunk_xfree(void *chk, const H5O_pline_t *pline); +static haddr_t H5D_istore_get_addr(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, + const hssize_t offset[], H5D_istore_ud1_t *_udata); +static void *H5D_istore_chunk_alloc(size_t size, const H5O_pline_t *pline); +static void *H5D_istore_chunk_xfree(void *chk, const H5O_pline_t *pline); /* B-tree iterator callbacks */ -static int H5F_istore_iter_allocated(H5F_t *f, hid_t dxpl_id, void *left_key, haddr_t addr, +static int H5D_istore_iter_allocated(H5F_t *f, hid_t dxpl_id, void *left_key, haddr_t addr, void *right_key, void *_udata); -static int H5F_istore_iter_dump(H5F_t *f, hid_t dxpl_id, void *left_key, haddr_t addr, +static int H5D_istore_iter_dump(H5F_t *f, hid_t dxpl_id, void *left_key, haddr_t addr, void *right_key, void *_udata); -static int H5F_istore_prune_extent(H5F_t *f, hid_t dxpl_id, void *_lt_key, haddr_t addr, +static int H5D_istore_prune_extent(H5F_t *f, hid_t dxpl_id, void *_lt_key, haddr_t addr, void *_rt_key, void *_udata); /* B-tree callbacks */ -static size_t H5F_istore_sizeof_rkey(H5F_t *f, const void *_udata); -static herr_t H5F_istore_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t, void *_lt_key, +static size_t H5D_istore_sizeof_rkey(H5F_t *f, const void *_udata); +static herr_t H5D_istore_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t, void *_lt_key, void *_udata, void *_rt_key, haddr_t *addr_p /*out*/); -static int H5F_istore_cmp2(H5F_t *f, hid_t dxpl_id, void *_lt_key, void *_udata, +static int H5D_istore_cmp2(H5F_t *f, hid_t dxpl_id, void *_lt_key, void *_udata, void *_rt_key); -static int H5F_istore_cmp3(H5F_t *f, hid_t dxpl_id, void *_lt_key, void *_udata, +static int H5D_istore_cmp3(H5F_t *f, hid_t dxpl_id, void *_lt_key, void *_udata, void *_rt_key); -static herr_t H5F_istore_found(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_lt_key, +static herr_t H5D_istore_found(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_lt_key, void *_udata, const void *_rt_key); -static H5B_ins_t H5F_istore_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key, +static H5B_ins_t H5D_istore_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key, hbool_t *lt_key_changed, void *_md_key, void *_udata, void *_rt_key, hbool_t *rt_key_changed, haddr_t *new_node/*out*/); -static H5B_ins_t H5F_istore_remove( H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key, +static H5B_ins_t H5D_istore_remove( H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key, hbool_t *lt_key_changed, void *_udata, void *_rt_key, hbool_t *rt_key_changed); -static herr_t H5F_istore_decode_key(H5F_t *f, H5B_t *bt, uint8_t *raw, +static herr_t H5D_istore_decode_key(H5F_t *f, H5B_t *bt, uint8_t *raw, void *_key); -static herr_t H5F_istore_encode_key(H5F_t *f, H5B_t *bt, uint8_t *raw, +static herr_t H5D_istore_encode_key(H5F_t *f, H5B_t *bt, uint8_t *raw, void *_key); -static herr_t H5F_istore_debug_key(FILE *stream, H5F_t *f, hid_t dxpl_id, +static herr_t H5D_istore_debug_key(FILE *stream, H5F_t *f, hid_t dxpl_id, int indent, int fwidth, const void *key, const void *udata); /* inherits B-tree like properties from H5B */ H5B_class_t H5B_ISTORE[1] = {{ H5B_ISTORE_ID, /*id */ - sizeof(H5F_istore_key_t), /*sizeof_nkey */ - H5F_istore_sizeof_rkey, /*get_sizeof_rkey */ - H5F_istore_new_node, /*new */ - H5F_istore_cmp2, /*cmp2 */ - H5F_istore_cmp3, /*cmp3 */ - H5F_istore_found, /*found */ - H5F_istore_insert, /*insert */ + sizeof(H5D_istore_key_t), /*sizeof_nkey */ + H5D_istore_sizeof_rkey, /*get_sizeof_rkey */ + H5D_istore_new_node, /*new */ + H5D_istore_cmp2, /*cmp2 */ + H5D_istore_cmp3, /*cmp3 */ + H5D_istore_found, /*found */ + H5D_istore_insert, /*insert */ FALSE, /*follow min branch? */ FALSE, /*follow max branch? */ - H5F_istore_remove, /*remove */ - H5F_istore_decode_key, /*decode */ - H5F_istore_encode_key, /*encode */ - H5F_istore_debug_key, /*debug */ + H5D_istore_remove, /*remove */ + H5D_istore_decode_key, /*decode */ + H5D_istore_encode_key, /*encode */ + H5D_istore_debug_key, /*debug */ }}; /* Declare a free list to manage H5F_rdcc_ent_t objects */ -H5FL_DEFINE_STATIC(H5F_rdcc_ent_t); +H5FL_DEFINE_STATIC(H5D_rdcc_ent_t); /* Declare a free list to manage the H5F_rdcc_ent_ptr_t sequence information */ -H5FL_SEQ_DEFINE_STATIC(H5F_rdcc_ent_ptr_t); +H5FL_SEQ_DEFINE_STATIC(H5D_rdcc_ent_ptr_t); /* Declare a free list to manage the chunk sequence information */ H5FL_BLK_DEFINE_STATIC(chunk); /*------------------------------------------------------------------------- - * Function: H5F_istore_sizeof_rkey + * Function: H5D_istore_sizeof_rkey * * Purpose: Returns the size of a raw key for the specified UDATA. The * size of the key is dependent on the number of dimensions for @@ -239,13 +234,13 @@ H5FL_BLK_DEFINE_STATIC(chunk); *------------------------------------------------------------------------- */ static size_t -H5F_istore_sizeof_rkey(H5F_t UNUSED *f, const void *_udata) +H5D_istore_sizeof_rkey(H5F_t UNUSED *f, const void *_udata) { - const H5F_istore_ud1_t *udata = (const H5F_istore_ud1_t *) _udata; + const H5D_istore_ud1_t *udata = (const H5D_istore_ud1_t *) _udata; size_t nbytes; /* Use FUNC_ENTER_NOAPI_NOINIT_NOFUNC here to avoid performance issues */ - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_istore_sizeof_rkey); + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5D_istore_sizeof_rkey); assert(udata); assert(udata->mesg.u.chunk.ndims > 0 && udata->mesg.u.chunk.ndims <= H5O_LAYOUT_NDIMS); @@ -255,11 +250,11 @@ H5F_istore_sizeof_rkey(H5F_t UNUSED *f, const void *_udata) udata->mesg.u.chunk.ndims*8; /*dimension indices */ FUNC_LEAVE_NOAPI(nbytes); -} +} /* end H5D_istore_sizeof_rkey() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_decode_key + * Function: H5D_istore_decode_key * * Purpose: Decodes a raw key into a native key for the B-tree * @@ -273,14 +268,14 @@ H5F_istore_sizeof_rkey(H5F_t UNUSED *f, const void *_udata) *------------------------------------------------------------------------- */ static herr_t -H5F_istore_decode_key(H5F_t UNUSED *f, H5B_t *bt, uint8_t *raw, void *_key) +H5D_istore_decode_key(H5F_t UNUSED *f, H5B_t *bt, uint8_t *raw, void *_key) { - H5F_istore_key_t *key = (H5F_istore_key_t *) _key; + H5D_istore_key_t *key = (H5D_istore_key_t *) _key; int i; - int ndims = H5F_ISTORE_NDIMS(bt); + int ndims = H5D_ISTORE_NDIMS(bt); herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_decode_key, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_decode_key, FAIL); /* check args */ assert(f); @@ -297,11 +292,11 @@ H5F_istore_decode_key(H5F_t UNUSED *f, H5B_t *bt, uint8_t *raw, void *_key) done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_decode_key() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_encode_key + * Function: H5D_istore_encode_key * * Purpose: Encode a key from native format to raw format. * @@ -315,14 +310,14 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5F_istore_encode_key(H5F_t UNUSED *f, H5B_t *bt, uint8_t *raw, void *_key) +H5D_istore_encode_key(H5F_t UNUSED *f, H5B_t *bt, uint8_t *raw, void *_key) { - H5F_istore_key_t *key = (H5F_istore_key_t *) _key; - int ndims = H5F_ISTORE_NDIMS(bt); + H5D_istore_key_t *key = (H5D_istore_key_t *) _key; + int ndims = H5D_ISTORE_NDIMS(bt); int i; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_encode_key, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_encode_key, FAIL); /* check args */ assert(f); @@ -339,11 +334,11 @@ H5F_istore_encode_key(H5F_t UNUSED *f, H5B_t *bt, uint8_t *raw, void *_key) done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_encode_key() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_debug_key + * Function: H5D_istore_debug_key * * Purpose: Prints a key. * @@ -357,15 +352,15 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5F_istore_debug_key (FILE *stream, H5F_t UNUSED *f, hid_t UNUSED dxpl_id, int indent, int fwidth, +H5D_istore_debug_key (FILE *stream, H5F_t UNUSED *f, hid_t UNUSED dxpl_id, int indent, int fwidth, const void *_key, const void *_udata) { - const H5F_istore_key_t *key = (const H5F_istore_key_t *)_key; - const H5F_istore_ud1_t *udata = (const H5F_istore_ud1_t *)_udata; + const H5D_istore_key_t *key = (const H5D_istore_key_t *)_key; + const H5D_istore_ud1_t *udata = (const H5D_istore_ud1_t *)_udata; unsigned u; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_debug_key, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_debug_key, FAIL); assert (key); @@ -381,11 +376,11 @@ H5F_istore_debug_key (FILE *stream, H5F_t UNUSED *f, hid_t UNUSED dxpl_id, int i done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_debug_key() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_cmp2 + * Function: H5D_istore_cmp2 * * Purpose: Compares two keys sort of like strcmp(). The UDATA pointer * is only to supply extra information not carried in the keys @@ -406,15 +401,15 @@ done: *------------------------------------------------------------------------- */ static int -H5F_istore_cmp2(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, void *_udata, +H5D_istore_cmp2(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, void *_udata, void *_rt_key) { - H5F_istore_key_t *lt_key = (H5F_istore_key_t *) _lt_key; - H5F_istore_key_t *rt_key = (H5F_istore_key_t *) _rt_key; - H5F_istore_ud1_t *udata = (H5F_istore_ud1_t *) _udata; + H5D_istore_key_t *lt_key = (H5D_istore_key_t *) _lt_key; + H5D_istore_key_t *rt_key = (H5D_istore_key_t *) _rt_key; + H5D_istore_ud1_t *udata = (H5D_istore_ud1_t *) _udata; int ret_value; - FUNC_ENTER_NOAPI(H5F_istore_cmp2, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_cmp2, FAIL); assert(lt_key); assert(rt_key); @@ -426,11 +421,11 @@ H5F_istore_cmp2(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, void *_uda done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_cmp2() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_cmp3 + * Function: H5D_istore_cmp3 * * Purpose: Compare the requested datum UDATA with the left and right * keys of the B-tree. @@ -459,15 +454,15 @@ done: *------------------------------------------------------------------------- */ static int -H5F_istore_cmp3(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, void *_udata, +H5D_istore_cmp3(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, void *_udata, void *_rt_key) { - H5F_istore_key_t *lt_key = (H5F_istore_key_t *) _lt_key; - H5F_istore_key_t *rt_key = (H5F_istore_key_t *) _rt_key; - H5F_istore_ud1_t *udata = (H5F_istore_ud1_t *) _udata; + H5D_istore_key_t *lt_key = (H5D_istore_key_t *) _lt_key; + H5D_istore_key_t *rt_key = (H5D_istore_key_t *) _rt_key; + H5D_istore_ud1_t *udata = (H5D_istore_ud1_t *) _udata; int ret_value = 0; - FUNC_ENTER_NOAPI(H5F_istore_cmp3, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_cmp3, FAIL); assert(lt_key); assert(rt_key); @@ -484,11 +479,11 @@ H5F_istore_cmp3(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, void *_uda done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_cmp3() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_new_node + * Function: H5D_istore_new_node * * Purpose: Adds a new entry to an i-storage B-tree. We can assume that * the domain represented by UDATA doesn't intersect the domain @@ -508,17 +503,17 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5F_istore_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t op, +H5D_istore_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t op, void *_lt_key, void *_udata, void *_rt_key, haddr_t *addr_p/*out*/) { - H5F_istore_key_t *lt_key = (H5F_istore_key_t *) _lt_key; - H5F_istore_key_t *rt_key = (H5F_istore_key_t *) _rt_key; - H5F_istore_ud1_t *udata = (H5F_istore_ud1_t *) _udata; + H5D_istore_key_t *lt_key = (H5D_istore_key_t *) _lt_key; + H5D_istore_key_t *rt_key = (H5D_istore_key_t *) _rt_key; + H5D_istore_ud1_t *udata = (H5D_istore_ud1_t *) _udata; unsigned u; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_new_node, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_new_node, FAIL); /* check args */ assert(f); @@ -561,11 +556,11 @@ H5F_istore_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t op, done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_new_node() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_found + * Function: H5D_istore_found * * Purpose: This function is called when the B-tree search engine has * found the leaf entry that points to a chunk of storage that @@ -592,15 +587,15 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5F_istore_found(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, const void *_lt_key, +H5D_istore_found(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, const void *_lt_key, void *_udata, const void UNUSED *_rt_key) { - H5F_istore_ud1_t *udata = (H5F_istore_ud1_t *) _udata; - const H5F_istore_key_t *lt_key = (const H5F_istore_key_t *) _lt_key; + H5D_istore_ud1_t *udata = (H5D_istore_ud1_t *) _udata; + const H5D_istore_key_t *lt_key = (const H5D_istore_key_t *) _lt_key; unsigned u; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_found, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_found, FAIL); /* Check arguments */ assert(f); @@ -624,11 +619,11 @@ H5F_istore_found(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, const void done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_found() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_insert + * Function: H5D_istore_insert * * Purpose: This function is called when the B-tree insert engine finds * the node to use to insert new data. The UDATA argument @@ -660,21 +655,21 @@ done: *------------------------------------------------------------------------- */ static H5B_ins_t -H5F_istore_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key, +H5D_istore_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key, hbool_t UNUSED *lt_key_changed, void *_md_key, void *_udata, void *_rt_key, hbool_t UNUSED *rt_key_changed, haddr_t *new_node_p/*out*/) { - H5F_istore_key_t *lt_key = (H5F_istore_key_t *) _lt_key; - H5F_istore_key_t *md_key = (H5F_istore_key_t *) _md_key; - H5F_istore_key_t *rt_key = (H5F_istore_key_t *) _rt_key; - H5F_istore_ud1_t *udata = (H5F_istore_ud1_t *) _udata; + H5D_istore_key_t *lt_key = (H5D_istore_key_t *) _lt_key; + H5D_istore_key_t *md_key = (H5D_istore_key_t *) _md_key; + H5D_istore_key_t *rt_key = (H5D_istore_key_t *) _rt_key; + H5D_istore_ud1_t *udata = (H5D_istore_ud1_t *) _udata; int cmp; unsigned u; H5B_ins_t ret_value; - FUNC_ENTER_NOAPI(H5F_istore_insert, H5B_INS_ERROR); + FUNC_ENTER_NOAPI(H5D_istore_insert, H5B_INS_ERROR); /* check args */ assert(f); @@ -687,7 +682,7 @@ H5F_istore_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key, assert(rt_key_changed); assert(new_node_p); - cmp = H5F_istore_cmp3(f, dxpl_id, lt_key, udata, rt_key); + cmp = H5D_istore_cmp3(f, dxpl_id, lt_key, udata, rt_key); assert(cmp <= 0); if (cmp < 0) { @@ -767,11 +762,11 @@ H5F_istore_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key, done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_insert() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_iter_allocated + * Function: H5D_istore_iter_allocated * * Purpose: Simply counts the number of chunks for a dataset. * @@ -791,22 +786,22 @@ done: *------------------------------------------------------------------------- */ static int -H5F_istore_iter_allocated (H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, haddr_t UNUSED addr, +H5D_istore_iter_allocated (H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, haddr_t UNUSED addr, void UNUSED *_rt_key, void *_udata) { - H5F_istore_ud1_t *bt_udata = (H5F_istore_ud1_t *)_udata; - H5F_istore_key_t *lt_key = (H5F_istore_key_t *)_lt_key; + H5D_istore_ud1_t *bt_udata = (H5D_istore_ud1_t *)_udata; + H5D_istore_key_t *lt_key = (H5D_istore_key_t *)_lt_key; - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_istore_iter_allocated); + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5D_istore_iter_allocated); bt_udata->total_storage += lt_key->nbytes; FUNC_LEAVE_NOAPI(H5B_ITER_CONT); -} /* H5F_istore_iter_allocated() */ +} /* H5D_istore_iter_allocated() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_iter_dump + * Function: H5D_istore_iter_dump * * Purpose: If the UDATA.STREAM member is non-null then debugging * information is written to that stream. @@ -827,14 +822,14 @@ H5F_istore_iter_allocated (H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, *------------------------------------------------------------------------- */ static int -H5F_istore_iter_dump (H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, haddr_t UNUSED addr, +H5D_istore_iter_dump (H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, haddr_t UNUSED addr, void UNUSED *_rt_key, void *_udata) { - H5F_istore_ud1_t *bt_udata = (H5F_istore_ud1_t *)_udata; - H5F_istore_key_t *lt_key = (H5F_istore_key_t *)_lt_key; + H5D_istore_ud1_t *bt_udata = (H5D_istore_ud1_t *)_udata; + H5D_istore_key_t *lt_key = (H5D_istore_key_t *)_lt_key; unsigned u; - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_istore_iter_dump); + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5D_istore_iter_dump); if (bt_udata->stream) { if (0==bt_udata->total_storage) { @@ -855,14 +850,14 @@ H5F_istore_iter_dump (H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, hadd } FUNC_LEAVE_NOAPI(H5B_ITER_CONT); -} /* H5F_istore_iter_dump() */ +} /* H5D_istore_iter_dump() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_init + * Function: H5D_istore_init * - * Purpose: Initialize the raw data chunk cache for a file. This is - * called when the file handle is initialized. + * Purpose: Initialize the raw data chunk cache for a dataset. This is + * called when the dataset is initialized. * * Return: Non-negative on success/Negative on failure * @@ -874,28 +869,29 @@ H5F_istore_iter_dump (H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, hadd *------------------------------------------------------------------------- */ herr_t -H5F_istore_init (H5F_t *f) +H5D_istore_init (H5F_t *f, H5D_t *dset) { - H5F_rdcc_t *rdcc = &(f->shared->rdcc); + H5D_rdcc_t *rdcc = &(dset->cache.chunk); herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_init, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_init, FAIL); - HDmemset (rdcc, 0, sizeof(H5F_rdcc_t)); - if (f->shared->rdcc_nbytes>0 && f->shared->rdcc_nelmts>0) { - rdcc->nslots = f->shared->rdcc_nelmts; - rdcc->slot = H5FL_SEQ_CALLOC (H5F_rdcc_ent_ptr_t,rdcc->nslots); + HDmemset (rdcc, 0, sizeof(H5D_rdcc_t)); + if (H5F_RDCC_NBYTES(f)>0 && H5F_RDCC_NELMTS(f)>0) { + rdcc->nbytes=H5F_RDCC_NBYTES(f); + rdcc->nslots = H5F_RDCC_NELMTS(f); + rdcc->slot = H5FL_SEQ_CALLOC (H5D_rdcc_ent_ptr_t,rdcc->nslots); if (NULL==rdcc->slot) HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed"); - } + } /* end if */ done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_init() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_flush_entry + * Function: H5D_istore_flush_entry * * Purpose: Writes a chunk to disk. If RESET is non-zero then the * entry is cleared -- it's slightly faster to flush a chunk if @@ -912,8 +908,8 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5F_istore_flush_entry(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, H5F_rdcc_ent_t *ent, hbool_t reset) +H5D_istore_flush_entry(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, + hid_t dxpl_id, H5D_t *dset, H5D_rdcc_ent_t *ent, hbool_t reset) { herr_t ret_value=SUCCEED; /*return value */ unsigned u; /*counters */ @@ -921,7 +917,7 @@ H5F_istore_flush_entry(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, size_t alloc; /*bytes allocated for BUF */ hbool_t point_of_no_return = FALSE; - FUNC_ENTER_NOAPI_NOINIT(H5F_istore_flush_entry); + FUNC_ENTER_NOAPI_NOINIT(H5D_istore_flush_entry); assert(f); assert(ent); @@ -929,18 +925,18 @@ H5F_istore_flush_entry(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, buf = ent->chunk; if (ent->dirty) { - H5F_istore_ud1_t udata; /*pass through B-tree */ + H5D_istore_ud1_t udata; /*pass through B-tree */ - udata.mesg = ent->layout; + udata.mesg = dset->layout; udata.key.filter_mask = 0; udata.addr = HADDR_UNDEF; udata.key.nbytes = ent->chunk_size; - for (u=0; ulayout.u.chunk.ndims; u++) + for (u=0; ulayout.u.chunk.ndims; u++) udata.key.offset[u] = ent->offset[u]; alloc = ent->alloc_size; /* Should the chunk be filtered before writing it to disk? */ - if (ent->pline.nused) { + if (dset->dcpl_cache.pline.nused) { if (!reset) { /* * Copy the chunk to a new buffer before running it through @@ -962,36 +958,33 @@ H5F_istore_flush_entry(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, point_of_no_return = TRUE; ent->chunk = NULL; } - if (H5Z_pipeline(&ent->pline, 0, &(udata.key.filter_mask), dxpl_cache->err_detect, - dxpl_cache->filter_cb, &(udata.key.nbytes), &alloc, &buf)<0) { - HGOTO_ERROR(H5E_PLINE, H5E_WRITEERROR, FAIL, - "output pipeline failed"); - } + if (H5Z_pipeline(&(dset->dcpl_cache.pline), 0, &(udata.key.filter_mask), dxpl_cache->err_detect, + dxpl_cache->filter_cb, &(udata.key.nbytes), &alloc, &buf)<0) + HGOTO_ERROR(H5E_PLINE, H5E_WRITEERROR, FAIL, "output pipeline failed") } /* * Create the chunk it if it doesn't exist, or reallocate the chunk if * its size changed. Then write the data into the file. */ - if (H5B_insert(f, dxpl_id, H5B_ISTORE, ent->layout.u.chunk.addr, &udata)<0) + if (H5B_insert(f, dxpl_id, H5B_ISTORE, dset->layout.u.chunk.addr, &udata)<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to allocate chunk"); if (H5F_block_write(f, H5FD_MEM_DRAW, udata.addr, udata.key.nbytes, dxpl_id, buf)<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to write raw data to file"); /* Mark cache entry as clean */ ent->dirty = FALSE; - f->shared->rdcc.nflushes++; - } + dset->cache.chunk.nflushes++; + } /* end if */ /* Reset, but do not free or removed from list */ if (reset) { point_of_no_return = FALSE; - H5O_reset(H5O_LAYOUT_ID, &ent->layout); - if (buf==ent->chunk) buf = NULL; + if(buf==ent->chunk) + buf = NULL; if(ent->chunk!=NULL) - ent->chunk = H5F_istore_chunk_xfree(ent->chunk,&ent->pline); - H5O_reset(H5O_PLINE_ID, &ent->pline); - } + ent->chunk = H5D_istore_chunk_xfree(ent->chunk,&(dset->dcpl_cache.pline)); + } /* end if */ done: /* Free the temp buffer only if it's different than the entry chunk */ @@ -1005,17 +998,16 @@ done: * list. */ if (ret_value<0 && point_of_no_return) { - H5O_reset(H5O_LAYOUT_ID, &ent->layout); if(ent->chunk) - ent->chunk = H5F_istore_chunk_xfree(ent->chunk,&ent->pline); - H5O_reset(H5O_PLINE_ID, &ent->pline); - } + ent->chunk = H5D_istore_chunk_xfree(ent->chunk,&(dset->dcpl_cache.pline)); + } /* end if */ + FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_flush_entry() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_preempt + * Function: H5D_istore_preempt * * Purpose: Preempts the specified entry from the cache, flushing it to * disk if necessary. @@ -1033,12 +1025,13 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5F_istore_preempt(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, H5F_rdcc_ent_t * ent, hbool_t flush) +H5D_istore_preempt(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, H5D_rdcc_ent_t * ent, hbool_t flush) { - H5F_rdcc_t *rdcc = &(f->shared->rdcc); + H5D_rdcc_t *rdcc = &(dset->cache.chunk); herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT(H5F_istore_preempt); + FUNC_ENTER_NOAPI_NOINIT(H5D_istore_preempt); assert(f); assert(ent); @@ -1047,15 +1040,13 @@ H5F_istore_preempt(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, if(flush) { /* Flush */ - if(H5F_istore_flush_entry(f, dxpl_cache, dxpl_id, ent, TRUE) < 0) + if(H5D_istore_flush_entry(f, dxpl_cache, dxpl_id, dset, ent, TRUE) < 0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "cannot flush indexed storage buffer"); } else { /* Don't flush, just free chunk */ - H5O_reset(H5O_LAYOUT_ID, &ent->layout); if(ent->chunk != NULL) - ent->chunk = H5F_istore_chunk_xfree(ent->chunk,&ent->pline); - H5O_reset(H5O_PLINE_ID, &ent->pline); + ent->chunk = H5D_istore_chunk_xfree(ent->chunk,&(dset->dcpl_cache.pline)); } /* Unlink from list */ @@ -1076,15 +1067,15 @@ H5F_istore_preempt(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, --rdcc->nused; /* Free */ - H5FL_FREE(H5F_rdcc_ent_t, ent); + H5FL_FREE(H5D_rdcc_ent_t, ent); done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_preempt() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_flush + * Function: H5D_istore_flush * * Purpose: Writes all dirty chunks to disk and optionally preempts them * from the cache. @@ -1101,15 +1092,15 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_flush (H5F_t *f, hid_t dxpl_id, unsigned flags) +H5D_istore_flush (H5F_t *f, hid_t dxpl_id, H5D_t *dset, unsigned flags) { H5D_dxpl_cache_t dxpl_cache; /* Cached data transfer properties */ - H5F_rdcc_t *rdcc = &(f->shared->rdcc); + H5D_rdcc_t *rdcc = &(dset->cache.chunk); int nerrors=0; - H5F_rdcc_ent_t *ent=NULL, *next=NULL; + H5D_rdcc_ent_t *ent=NULL, *next=NULL; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_flush, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_flush, FAIL); /* Fill the DXPL cache values for later use */ if (H5D_get_dxpl_cache(dxpl_id,&dxpl_cache)<0) @@ -1122,24 +1113,24 @@ H5F_istore_flush (H5F_t *f, hid_t dxpl_id, unsigned flags) ent->dirty = FALSE; } /* end if */ else if ((flags&H5F_FLUSH_INVALIDATE)) { - if (H5F_istore_preempt(f, &dxpl_cache, dxpl_id, ent, TRUE )<0) + if (H5D_istore_preempt(f, &dxpl_cache, dxpl_id, dset, ent, TRUE )<0) nerrors++; } else { - if (H5F_istore_flush_entry(f, &dxpl_cache, dxpl_id, ent, FALSE)<0) + if (H5D_istore_flush_entry(f, &dxpl_cache, dxpl_id, dset, ent, FALSE)<0) nerrors++; } - } + } /* end for */ if (nerrors) HGOTO_ERROR (H5E_IO, H5E_CANTFLUSH, FAIL, "unable to flush one or more raw data chunks"); done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_flush() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_dest + * Function: H5D_istore_dest * * Purpose: Destroy the entire chunk cache by flushing dirty entries, * preempting all entries, and freeing the cache itself. @@ -1156,42 +1147,42 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_dest (H5F_t *f, hid_t dxpl_id) +H5D_istore_dest (H5F_t *f, hid_t dxpl_id, H5D_t *dset) { H5D_dxpl_cache_t dxpl_cache; /* Cached data transfer properties */ - H5F_rdcc_t *rdcc = &(f->shared->rdcc); + H5D_rdcc_t *rdcc = &(dset->cache.chunk); int nerrors=0; - H5F_rdcc_ent_t *ent=NULL, *next=NULL; + H5D_rdcc_ent_t *ent=NULL, *next=NULL; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_dest, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_dest, FAIL); /* Fill the DXPL cache values for later use */ if (H5D_get_dxpl_cache(dxpl_id,&dxpl_cache)<0) HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache") for (ent=rdcc->head; ent; ent=next) { -#ifdef H5F_ISTORE_DEBUG +#ifdef H5D_ISTORE_DEBUG HDfputc('c', stderr); HDfflush(stderr); #endif next = ent->next; - if (H5F_istore_preempt(f, &dxpl_cache, dxpl_id, ent, TRUE )<0) + if (H5D_istore_preempt(f, &dxpl_cache, dxpl_id, dset, ent, TRUE )<0) nerrors++; } if (nerrors) HGOTO_ERROR (H5E_IO, H5E_CANTFLUSH, FAIL, "unable to flush one or more raw data chunks"); - H5FL_SEQ_FREE (H5F_rdcc_ent_ptr_t,rdcc->slot); - HDmemset (rdcc, 0, sizeof(H5F_rdcc_t)); + H5FL_SEQ_FREE (H5D_rdcc_ent_ptr_t,rdcc->slot); + HDmemset (rdcc, 0, sizeof(H5D_rdcc_t)); done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_dest() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_prune + * Function: H5D_istore_prune * * Purpose: Prune the cache by preempting some things until the cache has * room for something which is SIZE bytes. Only unlocked @@ -1209,18 +1200,19 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5F_istore_prune (H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, size_t size) +H5D_istore_prune (H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, H5D_t *dset, + size_t size) { int i, j, nerrors=0; - H5F_rdcc_t *rdcc = &(f->shared->rdcc); - size_t total = f->shared->rdcc_nbytes; + H5D_rdcc_t *rdcc = &(dset->cache.chunk); + size_t total = rdcc->nbytes; const int nmeth=2; /*number of methods */ int w[1]; /*weighting as an interval */ - H5F_rdcc_ent_t *p[2], *cur; /*list pointers */ - H5F_rdcc_ent_t *n[2]; /*list next pointers */ + H5D_rdcc_ent_t *p[2], *cur; /*list pointers */ + H5D_rdcc_ent_t *n[2]; /*list next pointers */ herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT(H5F_istore_prune); + FUNC_ENTER_NOAPI_NOINIT(H5D_istore_prune); /* * Preemption is accomplished by having multiple pointers (currently two) @@ -1232,7 +1224,7 @@ H5F_istore_prune (H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, s * begins. The pointers participating in the list traversal are each * given a chance at preemption before any of the pointers are advanced. */ - w[0] = (int)(rdcc->nused * f->shared->rdcc_w0); + w[0] = (int)(rdcc->nused * H5F_RDCC_W0(f)); p[0] = rdcc->head; p[1] = NULL; @@ -1259,7 +1251,7 @@ H5F_istore_prune (H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, s * written or partially read. */ cur = p[0]; -#ifdef H5F_ISTORE_DEBUG +#ifdef H5D_ISTORE_DEBUG HDputc('.', stderr); HDfflush(stderr); #endif @@ -1271,7 +1263,7 @@ H5F_istore_prune (H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, s * resort preemption. */ cur = p[1]; -#ifdef H5F_ISTORE_DEBUG +#ifdef H5D_ISTORE_DEBUG HDputc(':', stderr); HDfflush(stderr); #endif @@ -1288,7 +1280,7 @@ H5F_istore_prune (H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, s if (n[j]==cur) n[j] = cur->next; } - if (H5F_istore_preempt(f, dxpl_cache, dxpl_id, cur, TRUE)<0) + if (H5D_istore_preempt(f, dxpl_cache, dxpl_id, dset, cur, TRUE)<0) nerrors++; } } @@ -1305,11 +1297,11 @@ H5F_istore_prune (H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, s done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_prune() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_lock + * Function: H5D_istore_lock * * Purpose: Return a pointer to a dataset chunk. The pointer points * directly into the chunk cache and should not be freed @@ -1343,24 +1335,29 @@ done: *------------------------------------------------------------------------- */ static void * -H5F_istore_lock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, const H5O_layout_t *layout, - const H5O_pline_t *pline, const H5O_fill_t *fill, H5D_fill_time_t fill_time, - H5F_istore_ud1_t *udata, - const H5D_storage_t *store, hbool_t relax, - unsigned *idx_hint/*in,out*/) +H5D_istore_lock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, + H5D_istore_ud1_t *udata, hbool_t relax, unsigned *idx_hint/*in,out*/) { - int idx=0; /*hash index number */ - hsize_t temp_idx=0; /* temporary index number */ + unsigned idx=0; /*hash index number */ hbool_t found = FALSE; /*already in cache? */ - H5F_rdcc_t *rdcc = &(f->shared->rdcc);/*raw data chunk cache*/ - H5F_rdcc_ent_t *ent = NULL; /*cache entry */ + const H5O_pline_t *pline=&(dset->dcpl_cache.pline); /* I/O pipeline info */ + const H5O_layout_t *layout=&(dset->layout); /* Dataset layout */ + const H5O_fill_t *fill=&(dset->dcpl_cache.fill); /* Fill value info */ + H5D_fill_time_t fill_time=dset->dcpl_cache.fill_time; /* Fill time */ + H5D_rdcc_t *rdcc = &(dset->cache.chunk);/*raw data chunk cache*/ + H5D_rdcc_ent_t *ent = NULL; /*cache entry */ unsigned u; /*counters */ size_t chunk_size=0; /*size of a chunk */ void *chunk=NULL; /*the file chunk */ void *ret_value; /*return value */ - FUNC_ENTER_NOAPI_NOINIT(H5F_istore_lock); + FUNC_ENTER_NOAPI_NOINIT(H5D_istore_lock); + assert(f); + assert(dset); + assert(store); + assert(dxpl_cache); assert(TRUE==H5P_isa_class(dxpl_id,H5P_DATASET_XFER)); /* Get the chunk's size */ @@ -1369,20 +1366,18 @@ H5F_istore_lock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, con /* Search for the chunk in the cache */ if (rdcc->nslots>0) { - temp_idx = store->chunk.index + (hsize_t)(layout->u.chunk.addr); - idx=H5F_HASH(f,temp_idx); + idx=H5D_HASH(dset,store->chunk.index); ent = rdcc->slot[idx]; - if (ent && layout->u.chunk.ndims==ent->layout.u.chunk.ndims && - H5F_addr_eq(layout->u.chunk.addr, ent->layout.u.chunk.addr)) { - for (u=0, found=TRUE; ulayout.u.chunk.ndims; u++) { + if (ent) { + for (u=0, found=TRUE; ulayout.u.chunk.ndims; u++) { if (store->chunk.offset[u]!=ent->offset[u]) { found = FALSE; break; - } - } - } - } + } /* end if */ + } /* end for */ + } /* end if */ + } /* end if */ if (found) { /* @@ -1397,16 +1392,16 @@ H5F_istore_lock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, con * buffer with the file contents. Count this as a hit instead of a * miss because we saved ourselves lots of work. */ -#ifdef H5F_ISTORE_DEBUG +#ifdef H5D_ISTORE_DEBUG HDputc('w', stderr); HDfflush(stderr); #endif rdcc->nhits++; - if (NULL==(chunk=H5F_istore_chunk_alloc (chunk_size,pline))) + if (NULL==(chunk=H5D_istore_chunk_alloc (chunk_size,pline))) HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for raw data chunk"); } else { - H5F_istore_ud1_t tmp_udata; /*B-tree pass-through */ + H5D_istore_ud1_t tmp_udata; /*B-tree pass-through */ haddr_t chunk_addr; /* Address of chunk on disk */ if(udata!=NULL) @@ -1419,7 +1414,7 @@ H5F_istore_lock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, con * Not in the cache. Read it from the file and count this as a miss * if it's in the file or an init if it isn't. */ - chunk_addr = H5F_istore_get_addr(f, dxpl_id, layout, store->chunk.offset, udata); + chunk_addr = H5D_istore_get_addr(f, dxpl_id, layout, store->chunk.offset, udata); } /* end else */ if (H5F_addr_defined(chunk_addr)) { @@ -1431,7 +1426,7 @@ H5F_istore_lock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, con /* Chunk size on disk isn't [likely] the same size as the final chunk * size in memory, so allocate memory big enough. */ chunk_alloc = udata->key.nbytes; - if (NULL==(chunk = H5F_istore_chunk_alloc (chunk_alloc,pline))) + if (NULL==(chunk = H5D_istore_chunk_alloc (chunk_alloc,pline))) HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for raw data chunk"); if (H5F_block_read(f, H5FD_MEM_DRAW, chunk_addr, udata->key.nbytes, dxpl_id, chunk)<0) HGOTO_ERROR (H5E_IO, H5E_READERROR, NULL, "unable to read raw data chunk"); @@ -1450,7 +1445,7 @@ H5F_istore_lock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, con /* Chunk size on disk isn't [likely] the same size as the final chunk * size in memory, so allocate memory big enough. */ - if (NULL==(chunk = H5F_istore_chunk_alloc (chunk_size,pline))) + if (NULL==(chunk = H5D_istore_chunk_alloc (chunk_size,pline))) HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for raw data chunk"); if (H5P_is_fill_value_defined(fill, &fill_status) < 0) @@ -1478,31 +1473,29 @@ H5F_istore_lock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, con } assert (found || chunk_size>0); - if (!found && rdcc->nslots>0 && chunk_size<=f->shared->rdcc_nbytes && + if (!found && rdcc->nslots>0 && chunk_size<=dset->cache.chunk.nbytes && (!ent || !ent->locked)) { /* * Add the chunk to the cache only if the slot is not already locked. * Preempt enough things from the cache to make room. */ if (ent) { -#ifdef H5F_ISTORE_DEBUG +#ifdef H5D_ISTORE_DEBUG HDputc('#', stderr); HDfflush(stderr); #endif - if (H5F_istore_preempt(f, dxpl_cache, dxpl_id, ent, TRUE)<0) + if (H5D_istore_preempt(f, dxpl_cache, dxpl_id, dset, ent, TRUE)<0) HGOTO_ERROR(H5E_IO, H5E_CANTINIT, NULL, "unable to preempt chunk from cache"); } - if (H5F_istore_prune(f, dxpl_cache, dxpl_id, chunk_size)<0) + if (H5D_istore_prune(f, dxpl_cache, dxpl_id, dset, chunk_size)<0) HGOTO_ERROR(H5E_IO, H5E_CANTINIT, NULL, "unable to preempt chunk(s) from cache"); /* Create a new entry */ - ent = H5FL_MALLOC(H5F_rdcc_ent_t); + ent = H5FL_MALLOC(H5D_rdcc_ent_t); ent->locked = 0; ent->dirty = FALSE; ent->chunk_size = chunk_size; ent->alloc_size = chunk_size; - H5O_copy(H5O_LAYOUT_ID, layout, &ent->layout); - H5O_copy(H5O_PLINE_ID, pline, &ent->pline); for (u=0; uu.chunk.ndims; u++) ent->offset[u] = store->chunk.offset[u]; ent->rd_count = chunk_size; @@ -1574,13 +1567,13 @@ H5F_istore_lock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, con done: if (!ret_value) if(chunk) - H5F_istore_chunk_xfree (chunk,pline); + H5D_istore_chunk_xfree (chunk,pline); FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_lock() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_unlock + * Function: H5D_istore_unlock * * Purpose: Unlocks a previously locked chunk. The LAYOUT, COMP, and * OFFSET arguments should be the same as for H5F_rdcc_lock(). @@ -1606,16 +1599,16 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5F_istore_unlock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, - const H5O_layout_t *layout, const H5O_pline_t *pline, hbool_t dirty, - const H5D_storage_t *store, unsigned idx_hint, uint8_t *chunk, size_t naccessed) +H5D_istore_unlock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, + hbool_t dirty, unsigned idx_hint, uint8_t *chunk, size_t naccessed) { - H5F_rdcc_t *rdcc = &(f->shared->rdcc); - H5F_rdcc_ent_t *ent = NULL; + H5D_rdcc_t *rdcc = &(dset->cache.chunk); + H5D_rdcc_ent_t *ent = NULL; int found = -1; unsigned u; - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_istore_unlock); + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5D_istore_unlock); if (UINT_MAX==idx_hint) { /*not in cache*/ @@ -1634,23 +1627,21 @@ H5F_istore_unlock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, * don't discard the `const' qualifier. */ if (dirty) { - H5F_rdcc_ent_t x; + H5D_rdcc_ent_t x; HDmemset (&x, 0, sizeof x); x.dirty = TRUE; - H5O_copy (H5O_LAYOUT_ID, layout, &x.layout); - H5O_copy (H5O_PLINE_ID, pline, &x.pline); - for (u=0; uu.chunk.ndims; u++) + for (u=0; ulayout.u.chunk.ndims; u++) x.offset[u] = store->chunk.offset[u]; - assert(layout->u.chunk.size>0); - H5_ASSIGN_OVERFLOW(x.chunk_size,layout->u.chunk.size,hsize_t,size_t); + assert(dset->layout.u.chunk.size>0); + H5_ASSIGN_OVERFLOW(x.chunk_size,dset->layout.u.chunk.size,hsize_t,size_t); x.alloc_size = x.chunk_size; x.chunk = chunk; - H5F_istore_flush_entry (f, dxpl_cache, dxpl_id, &x, TRUE); + H5D_istore_flush_entry (f, dxpl_cache, dxpl_id, dset, &x, TRUE); } else { if(chunk) - H5F_istore_chunk_xfree (chunk,pline); + H5D_istore_chunk_xfree (chunk,&(dset->dcpl_cache.pline)); } } else { /* @@ -1668,11 +1659,11 @@ H5F_istore_unlock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, } FUNC_LEAVE_NOAPI(SUCCEED); -} +} /* end H5D_istore_unlock() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_readvv + * Function: H5D_istore_readvv * * Purpose: Reads a multi-dimensional buffer from (part of) an indexed raw * storage array. @@ -1687,25 +1678,25 @@ H5F_istore_unlock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, *------------------------------------------------------------------------- */ ssize_t -H5F_istore_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, - const H5O_layout_t *layout, const struct H5D_dcpl_cache_t *dcpl_cache, const H5D_storage_t *store, +H5D_istore_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, size_t chunk_max_nseq, size_t *chunk_curr_seq, size_t chunk_len_arr[], hsize_t chunk_offset_arr[], size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], void *buf) { - H5F_istore_ud1_t udata; /*B-tree pass-through */ + H5D_istore_ud1_t udata; /*B-tree pass-through */ haddr_t chunk_addr; /* Chunk address on disk */ size_t u; /* Local index variables */ ssize_t ret_value; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_readvv, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_readvv, FAIL); /* Check args */ assert(f); assert(dxpl_cache); - assert(layout && H5D_CHUNKED==layout->type); - assert(layout->u.chunk.ndims>0 && layout->u.chunk.ndims<=H5O_LAYOUT_NDIMS); - assert(dcpl_cache); + assert(dset && H5D_CHUNKED==dset->layout.type); + assert(dset->layout.u.chunk.ndims>0 && dset->layout.u.chunk.ndims<=H5O_LAYOUT_NDIMS); + assert(store); assert(chunk_len_arr); assert(chunk_offset_arr); assert(mem_len_arr); @@ -1713,19 +1704,19 @@ H5F_istore_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxp assert(buf); #ifndef NDEBUG - for (u=0; uu.chunk.ndims; u++) + for (u=0; ulayout.u.chunk.ndims; u++) assert(store->chunk.offset[u]>=0); /*negative coordinates not supported (yet) */ #endif /* Get the address of this chunk on disk */ #ifdef QAK HDfprintf(stderr,"%s: chunk_coords={",FUNC); -for(u=0; uu.chunk.ndims; u++) - HDfprintf(stderr,"%Hd%s",chunk_coords[u],(u<(layout->u.chunk.ndims-1) ? ", " : "}\n")); +for(u=0; ulayout.u.chunk.ndims; u++) + HDfprintf(stderr,"%Hd%s",chunk_coords[u],(u<(dset->layout.u.chunk.ndims-1) ? ", " : "}\n")); #endif /* QAK */ - chunk_addr=H5F_istore_get_addr(f, dxpl_id, layout, store->chunk.offset, &udata); + chunk_addr=H5D_istore_get_addr(f, dxpl_id, &(dset->layout), store->chunk.offset, &udata); #ifdef QAK -HDfprintf(stderr,"%s: chunk_addr=%a, chunk_size=%Hu\n",FUNC,chunk_addr,layout->u.chunk.size); +HDfprintf(stderr,"%s: chunk_addr=%a, chunk_size=%Hu\n",FUNC,chunk_addr,dset->layout.u.chunk.size); HDfprintf(stderr,"%s: chunk_len_arr[%Zu]=%Zu\n",FUNC,*chunk_curr_seq,chunk_len_arr[*chunk_curr_seq]); HDfprintf(stderr,"%s: chunk_offset_arr[%Zu]=%Hu\n",FUNC,*chunk_curr_seq,chunk_offset_arr[*chunk_curr_seq]); HDfprintf(stderr,"%s: mem_len_arr[%Zu]=%Zu\n",FUNC,*mem_curr_seq,mem_len_arr[*mem_curr_seq]); @@ -1738,9 +1729,9 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a * for the chunk has been defined, then don't load the chunk into the * cache, just write the data to it directly. */ - if (layout->u.chunk.size>f->shared->rdcc_nbytes && dcpl_cache->pline.nused==0 && + if (dset->layout.u.chunk.size>dset->cache.chunk.nbytes && dset->dcpl_cache.pline.nused==0 && chunk_addr!=HADDR_UNDEF) { - if ((ret_value=H5F_contig_readvv(f, (hsize_t)layout->u.chunk.size, chunk_addr, chunk_max_nseq, chunk_curr_seq, chunk_len_arr, chunk_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, dxpl_id, buf))<0) + if ((ret_value=H5D_contig_readvv(f, dxpl_id, dset, chunk_addr, (hsize_t)dset->layout.u.chunk.size, chunk_max_nseq, chunk_curr_seq, chunk_len_arr, chunk_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, buf))<0) HGOTO_ERROR (H5E_IO, H5E_READERROR, FAIL, "unable to read raw data to file"); } /* end if */ else { @@ -1752,8 +1743,8 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a * Lock the chunk, copy from application to chunk, then unlock the * chunk. */ - if (NULL==(chunk=H5F_istore_lock(f, dxpl_cache, dxpl_id, layout, &dcpl_cache->pline, &dcpl_cache->fill, dcpl_cache->fill_time, - &udata, store, FALSE, &idx_hint))) + if (NULL==(chunk=H5D_istore_lock(f, dxpl_cache, dxpl_id, dset, store, + &udata, FALSE, &idx_hint))) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to read raw data chunk"); /* Use the vectorized memory copy routine to do actual work */ @@ -1761,8 +1752,8 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "vectorized memcpy failed"); H5_CHECK_OVERFLOW(naccessed,ssize_t,size_t); - if (H5F_istore_unlock(f, dxpl_cache, dxpl_id, layout, &dcpl_cache->pline, FALSE, - store, idx_hint, chunk, (size_t)naccessed)<0) + if (H5D_istore_unlock(f, dxpl_cache, dxpl_id, dset, store, + FALSE, idx_hint, chunk, (size_t)naccessed)<0) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to unlock raw data chunk"); /* Set return value */ @@ -1771,11 +1762,11 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a done: FUNC_LEAVE_NOAPI(ret_value); -} /* H5F_istore_readvv() */ +} /* H5D_istore_readvv() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_writevv + * Function: H5D_istore_writevv * * Purpose: Writes a multi-dimensional buffer to (part of) an indexed raw * storage array. @@ -1790,26 +1781,25 @@ done: *------------------------------------------------------------------------- */ ssize_t -H5F_istore_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, const H5O_layout_t *layout, - const struct H5D_dcpl_cache_t *dcpl_cache, const H5D_storage_t *store, +H5D_istore_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, + hid_t dxpl_id, H5D_t *dset, const H5D_storage_t *store, size_t chunk_max_nseq, size_t *chunk_curr_seq, size_t chunk_len_arr[], hsize_t chunk_offset_arr[], size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], const void *buf) { - H5F_istore_ud1_t udata; /*B-tree pass-through */ + H5D_istore_ud1_t udata; /*B-tree pass-through */ haddr_t chunk_addr; /* Chunk address on disk */ size_t u; /* Local index variables */ ssize_t ret_value; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_writevv, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_writevv, FAIL); /* Check args */ assert(f); assert(dxpl_cache); - assert(layout && H5D_CHUNKED==layout->type); - assert(layout->u.chunk.ndims>0 && layout->u.chunk.ndims<=H5O_LAYOUT_NDIMS); - assert(dcpl_cache); + assert(dset && H5D_CHUNKED==dset->layout.type); + assert(dset->layout.u.chunk.ndims>0 && dset->layout.u.chunk.ndims<=H5O_LAYOUT_NDIMS); + assert(store); assert(chunk_len_arr); assert(chunk_offset_arr); assert(mem_len_arr); @@ -1817,19 +1807,19 @@ H5F_istore_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, assert(buf); #ifndef NDEBUG - for (u=0; uu.chunk.ndims; u++) + for (u=0; ulayout.u.chunk.ndims; u++) assert(store->chunk.offset[u]>=0); /*negative coordinates not supported (yet) */ #endif /* Get the address of this chunk on disk */ #ifdef QAK HDfprintf(stderr,"%s: chunk_coords={",FUNC); -for(u=0; uu.chunk.ndims; u++) - HDfprintf(stderr,"%Hd%s",chunk_coords[u],(u<(layout->u.chunk.ndims-1) ? ", " : "}\n")); +for(u=0; ulayout.u.chunk.ndims; u++) + HDfprintf(stderr,"%Hd%s",chunk_coords[u],(u<(dset->layout.u.chunk.ndims-1) ? ", " : "}\n")); #endif /* QAK */ - chunk_addr=H5F_istore_get_addr(f, dxpl_id, layout, store->chunk.offset, &udata); + chunk_addr=H5D_istore_get_addr(f, dxpl_id, &(dset->layout), store->chunk.offset, &udata); #ifdef QAK -HDfprintf(stderr,"%s: chunk_addr=%a, chunk_size=%Hu\n",FUNC,chunk_addr,layout->u.chunk.size); +HDfprintf(stderr,"%s: chunk_addr=%a, chunk_size=%Hu\n",FUNC,chunk_addr,dset->layout.u.chunk.size); HDfprintf(stderr,"%s: chunk_len_arr[%Zu]=%Zu\n",FUNC,*chunk_curr_seq,chunk_len_arr[*chunk_curr_seq]); HDfprintf(stderr,"%s: chunk_offset_arr[%Zu]=%Hu\n",FUNC,*chunk_curr_seq,chunk_offset_arr[*chunk_curr_seq]); HDfprintf(stderr,"%s: mem_len_arr[%Zu]=%Zu\n",FUNC,*mem_curr_seq,mem_len_arr[*mem_curr_seq]); @@ -1847,14 +1837,14 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a * writing to other elements in the same chunk. Do a direct * write-through of only the elements requested. */ - if ((layout->u.chunk.size>f->shared->rdcc_nbytes && dcpl_cache->pline.nused==0 && chunk_addr!=HADDR_UNDEF) - || (IS_H5FD_MPI(f) && (H5F_ACC_RDWR & f->shared->flags))) { + if ((dset->layout.u.chunk.size>dset->cache.chunk.nbytes && dset->dcpl_cache.pline.nused==0 && chunk_addr!=HADDR_UNDEF) + || (IS_H5FD_MPI(f) && (H5F_ACC_RDWR & H5F_get_intent(f)))) { #ifdef H5_HAVE_PARALLEL /* Additional sanity check when operating in parallel */ - if (chunk_addr==HADDR_UNDEF || dcpl_cache->pline.nused>0) + if (chunk_addr==HADDR_UNDEF || dset->dcpl_cache.pline.nused>0) HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to locate raw data chunk"); #endif /* H5_HAVE_PARALLEL */ - if ((ret_value=H5F_contig_writevv(f, (hsize_t)layout->u.chunk.size, chunk_addr, chunk_max_nseq, chunk_curr_seq, chunk_len_arr, chunk_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, dxpl_id, buf))<0) + if ((ret_value=H5D_contig_writevv(f, dxpl_id, dset, chunk_addr, (hsize_t)dset->layout.u.chunk.size, chunk_max_nseq, chunk_curr_seq, chunk_len_arr, chunk_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, buf))<0) HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to write raw data to file"); } /* end if */ else { @@ -1867,13 +1857,13 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a * Lock the chunk, copy from application to chunk, then unlock the * chunk. */ - if(chunk_max_nseq==1 && chunk_len_arr[0] == layout->u.chunk.size) + if(chunk_max_nseq==1 && chunk_len_arr[0] == dset->layout.u.chunk.size) relax = TRUE; else relax = FALSE; - if (NULL==(chunk=H5F_istore_lock(f, dxpl_cache, dxpl_id, layout, &dcpl_cache->pline, &dcpl_cache->fill, dcpl_cache->fill_time, - &udata, store, relax, &idx_hint))) + if (NULL==(chunk=H5D_istore_lock(f, dxpl_cache, dxpl_id, dset, store, + &udata, relax, &idx_hint))) HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to read raw data chunk"); /* Use the vectorized memory copy routine to do actual work */ @@ -1881,8 +1871,8 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "vectorized memcpy failed"); H5_CHECK_OVERFLOW(naccessed,ssize_t,size_t); - if (H5F_istore_unlock(f, dxpl_cache, dxpl_id, layout, &dcpl_cache->pline, TRUE, - store, idx_hint, chunk, (size_t)naccessed)<0) + if (H5D_istore_unlock(f, dxpl_cache, dxpl_id, dset, store, + TRUE, idx_hint, chunk, (size_t)naccessed)<0) HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "uanble to unlock raw data chunk"); /* Set return value */ @@ -1891,11 +1881,11 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a done: FUNC_LEAVE_NOAPI(ret_value); -} /* H5F_istore_writevv() */ +} /* H5D_istore_writevv() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_create + * Function: H5D_istore_create * * Purpose: Creates a new indexed-storage B-tree and initializes the * istore struct with information about the storage. The @@ -1915,15 +1905,15 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_create(H5F_t *f, hid_t dxpl_id, H5O_layout_t *layout /*out */ ) +H5D_istore_create(H5F_t *f, hid_t dxpl_id, H5O_layout_t *layout /*out */ ) { - H5F_istore_ud1_t udata; + H5D_istore_ud1_t udata; #ifndef NDEBUG unsigned u; #endif herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_create, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_create, FAIL); /* Check args */ assert(f); @@ -1940,11 +1930,11 @@ H5F_istore_create(H5F_t *f, hid_t dxpl_id, H5O_layout_t *layout /*out */ ) done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_create() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_allocated + * Function: H5D_istore_allocated * * Purpose: Return the number of bytes allocated in the file for storage * of raw data under the specified B-tree (ADDR is the address @@ -1963,15 +1953,15 @@ done: *------------------------------------------------------------------------- */ hsize_t -H5F_istore_allocated(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout) +H5D_istore_allocated(H5F_t *f, hid_t dxpl_id, H5D_t *dset) { - H5F_rdcc_t *rdcc = &(f->shared->rdcc); /*raw data chunk cache */ - H5F_rdcc_ent_t *ent; /*cache entry */ + H5D_rdcc_t *rdcc = &(dset->cache.chunk); /*raw data chunk cache */ + H5D_rdcc_ent_t *ent; /*cache entry */ H5D_dxpl_cache_t dxpl_cache; /* Cached data transfer properties */ - H5F_istore_ud1_t udata; + H5D_istore_ud1_t udata; hsize_t ret_value; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_allocated, 0); + FUNC_ENTER_NOAPI(H5D_istore_allocated, 0); /* Fill the DXPL cache values for later use */ if (H5D_get_dxpl_cache(dxpl_id,&dxpl_cache)<0) @@ -1979,17 +1969,14 @@ H5F_istore_allocated(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout) /* Search for cached chunks that haven't been written out */ for(ent = rdcc->head; ent; ent = ent->next) { - /* Make certain we are dealing with the correct B-tree, etc */ - if (H5F_addr_eq(layout->u.chunk.addr, ent->layout.u.chunk.addr)) { - /* Flush the chunk out to disk, to make certain the size is correct later */ - if (H5F_istore_flush_entry(f, &dxpl_cache, dxpl_id, ent, FALSE)<0) - HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, 0, "cannot flush indexed storage buffer"); - } /* end if */ + /* Flush the chunk out to disk, to make certain the size is correct later */ + if (H5D_istore_flush_entry(f, &dxpl_cache, dxpl_id, dset, ent, FALSE)<0) + HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, 0, "cannot flush indexed storage buffer"); } /* end for */ HDmemset(&udata, 0, sizeof udata); - udata.mesg.u.chunk.ndims = layout->u.chunk.ndims; - if (H5B_iterate(f, dxpl_id, H5B_ISTORE, H5F_istore_iter_allocated, layout->u.chunk.addr, &udata)<0) + udata.mesg.u.chunk.ndims = dset->layout.u.chunk.ndims; + if (H5B_iterate(f, dxpl_id, H5B_ISTORE, H5D_istore_iter_allocated, dset->layout.u.chunk.addr, &udata)<0) HGOTO_ERROR(H5E_IO, H5E_CANTINIT, 0, "unable to iterate over chunk B-tree"); /* Set return value */ @@ -1997,11 +1984,11 @@ H5F_istore_allocated(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout) done: FUNC_LEAVE_NOAPI(ret_value); -} /* end H5F_istore_allocated() */ +} /* end H5D_istore_allocated() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_get_addr + * Function: H5D_istore_get_addr * * Purpose: Get the file address of a chunk if file space has been * assigned. Save the retrieved information in the udata @@ -2019,15 +2006,15 @@ done: *------------------------------------------------------------------------- */ static haddr_t -H5F_istore_get_addr(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, - const hssize_t offset[], H5F_istore_ud1_t *_udata) +H5D_istore_get_addr(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, + const hssize_t offset[], H5D_istore_ud1_t *_udata) { - H5F_istore_ud1_t tmp_udata; /* Information about a chunk */ - H5F_istore_ud1_t *udata; /* Pointer to information about a chunk */ + H5D_istore_ud1_t tmp_udata; /* Information about a chunk */ + H5D_istore_ud1_t *udata; /* Pointer to information about a chunk */ unsigned u; haddr_t ret_value; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT(H5F_istore_get_addr); + FUNC_ENTER_NOAPI_NOINIT(H5D_istore_get_addr); assert(f); assert(layout && (layout->u.chunk.ndims > 0)); @@ -2054,11 +2041,11 @@ H5F_istore_get_addr(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, done: FUNC_LEAVE_NOAPI(ret_value); -} /* H5F_istore_get_addr() */ +} /* H5D_istore_get_addr() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_chunk_alloc + * Function: H5D_istore_chunk_alloc * * Purpose: Allocate space for a chunk in memory. This routine allocates * memory space for non-filtered chunks from a block free list @@ -2074,11 +2061,11 @@ done: *------------------------------------------------------------------------- */ static void * -H5F_istore_chunk_alloc(size_t size, const H5O_pline_t *pline) +H5D_istore_chunk_alloc(size_t size, const H5O_pline_t *pline) { void *ret_value=NULL; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_istore_chunk_alloc); + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5D_istore_chunk_alloc); assert(size); assert(pline); @@ -2089,11 +2076,11 @@ H5F_istore_chunk_alloc(size_t size, const H5O_pline_t *pline) ret_value=H5FL_BLK_MALLOC(chunk,size); FUNC_LEAVE_NOAPI(ret_value); -} /* H5F_istore_chunk_alloc() */ +} /* H5D_istore_chunk_alloc() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_chunk_xfree + * Function: H5D_istore_chunk_xfree * * Purpose: Free space for a chunk in memory. This routine allocates * memory space for non-filtered chunks from a block free list @@ -2109,9 +2096,9 @@ H5F_istore_chunk_alloc(size_t size, const H5O_pline_t *pline) *------------------------------------------------------------------------- */ static void * -H5F_istore_chunk_xfree(void *chk, const H5O_pline_t *pline) +H5D_istore_chunk_xfree(void *chk, const H5O_pline_t *pline) { - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_istore_chunk_xfree); + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5D_istore_chunk_xfree); assert(pline); @@ -2123,11 +2110,11 @@ H5F_istore_chunk_xfree(void *chk, const H5O_pline_t *pline) } /* end if */ FUNC_LEAVE_NOAPI(NULL); -} /* H5F_istore_chunk_xfree() */ +} /* H5D_istore_chunk_xfree() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_allocate + * Function: H5D_istore_allocate * * Purpose: Allocate file space for all chunks that are not allocated yet. * Return SUCCEED if all needed allocation succeed, otherwise @@ -2141,6 +2128,9 @@ H5F_istore_chunk_xfree(void *chk, const H5O_pline_t *pline) * This should be changed to do a direct flush independent * of the cache value. * + * This routine might be called before the dcpl_cache is set up + * correctly, so don't use those values. + * * Programmer: Albert Cheng * June 26, 1998 * @@ -2167,8 +2157,8 @@ H5F_istore_chunk_xfree(void *chk, const H5O_pline_t *pline) *------------------------------------------------------------------------- */ herr_t -H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, - const hsize_t *space_dim, H5P_genplist_t *dc_plist, hbool_t full_overwrite) +H5D_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5D_t *dset, + hbool_t full_overwrite) { hssize_t chunk_offset[H5O_LAYOUT_NDIMS]; /* Offset of current chunk */ hsize_t chunk_size; /* Size of chunk in bytes */ @@ -2177,7 +2167,7 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, H5D_fill_time_t fill_time; /* When to write fill values */ H5D_fill_value_t fill_status; /* The fill value status */ unsigned should_fill=0; /* Whether fill values should be written */ - H5F_istore_ud1_t udata; /* B-tree pass-through for creating chunk */ + H5D_istore_ud1_t udata; /* B-tree pass-through for creating chunk */ void *chunk=NULL; /* Chunk buffer for writing fill values */ H5P_genplist_t *dx_plist; /* Data xfer property list */ #ifdef H5_HAVE_PARALLEL @@ -2193,18 +2183,28 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, unsigned u; /* Local index variable */ H5Z_EDC_t edc; /* Decide whether to enable EDC for read */ H5Z_cb_t cb_struct; + H5P_genplist_t *dc_plist; /* Property list */ + int space_ndims; /* Dataset's space rank */ + hsize_t space_dim[H5O_LAYOUT_NDIMS]; /* Dataset's dataspace dimensions */ herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_allocate, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_allocate, FAIL); /* Check args */ assert(f); - assert(space_dim); - assert(layout && H5D_CHUNKED==layout->type); - assert(layout->u.chunk.ndims>0 && layout->u.chunk.ndims<=H5O_LAYOUT_NDIMS); - assert(H5F_addr_defined(layout->u.chunk.addr)); assert(TRUE==H5P_isa_class(dxpl_id,H5P_DATASET_XFER)); - assert(dc_plist); + assert(dset && H5D_CHUNKED==dset->layout.type); + assert(dset->layout.u.chunk.ndims>0 && dset->layout.u.chunk.ndims<=H5O_LAYOUT_NDIMS); + assert(H5F_addr_defined(dset->layout.u.chunk.addr)); + + /* Get dataset's creation property list */ + if (NULL == (dc_plist = H5I_object(dset->dcpl_id))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset creation property list") + + /* We only handle simple data spaces so far */ + if ((space_ndims=H5S_get_simple_extent_dims(dset->space, space_dim, NULL))<0) + HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to get simple data space info") + space_dim[space_ndims] = dset->layout.u.chunk.dim[space_ndims]; /* Get necessary properties from dataset creation property list */ if(H5P_get(dc_plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0) @@ -2226,11 +2226,11 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, /* Retrieve MPI parameters */ if(IS_H5FD_MPI(f)) { /* Get the MPI communicator */ - if (MPI_COMM_NULL == (mpi_comm=H5FD_mpi_get_comm(f->shared->lf))) + if (MPI_COMM_NULL == (mpi_comm=H5F_mpi_get_comm(f))) HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "Can't retrieve MPI communicator"); - /* Get the MPI rank & size */ - if ((mpi_rank=H5FD_mpi_get_rank(f->shared->lf))<0) + /* Get the MPI rank */ + if ((mpi_rank=H5F_mpi_get_rank(f))<0) HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "Can't retrieve MPI rank"); /* Set the MPI-capable file driver flag */ @@ -2242,9 +2242,9 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, * Setup indice to go through all chunks. (Future improvement * should allocate only chunks that have no file space assigned yet. */ - for (u=0; uu.chunk.ndims; u++) + for (u=0; ulayout.u.chunk.ndims; u++) chunk_offset[u] = 0; - chunk_size = layout->u.chunk.size; + chunk_size = dset->layout.u.chunk.size; /* Check the dataset's fill-value status */ if (H5P_is_fill_value_defined(&fill, &fill_status) < 0) @@ -2262,7 +2262,7 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, if(should_fill) { /* Allocate chunk buffer for processes to use when writing fill values */ H5_CHECK_OVERFLOW(chunk_size,hsize_t,size_t); - if (NULL==(chunk = H5F_istore_chunk_alloc((size_t)chunk_size,&pline))) + if (NULL==(chunk = H5D_istore_chunk_alloc((size_t)chunk_size,&pline))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for chunk"); /* Fill the chunk with the proper values */ @@ -2299,41 +2299,36 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, while (carry==0) { /* Check if the chunk exists yet on disk */ chunk_exists=1; - if(H5F_istore_get_addr(f,dxpl_id,layout,chunk_offset, NULL)==HADDR_UNDEF) { - H5F_rdcc_t *rdcc = &(f->shared->rdcc); /*raw data chunk cache */ - H5F_rdcc_ent_t *ent = NULL; /*cache entry */ + if(H5D_istore_get_addr(f,dxpl_id,&(dset->layout),chunk_offset, NULL)==HADDR_UNDEF) { + const H5D_rdcc_t *rdcc = &(dset->cache.chunk); /*raw data chunk cache */ + H5D_rdcc_ent_t *ent = NULL; /*cache entry */ /* Didn't find the chunk on disk */ chunk_exists = 0; /* Look for chunk in cache */ for(ent = rdcc->head; ent && !chunk_exists; ent = ent->next) { - /* Make certain we are dealing with the correct B-tree, etc */ - if (layout->u.chunk.ndims==ent->layout.u.chunk.ndims && - H5F_addr_eq(layout->u.chunk.addr, ent->layout.u.chunk.addr)) { - - /* Assume a match */ - chunk_exists = 1; - for(u = 0; u < layout->u.chunk.ndims && chunk_exists; u++) { - if(ent->offset[u] != chunk_offset[u]) - chunk_exists = 0; /* Reset if no match */ - } /* end for */ - } /* end if */ + /* Assume a match */ + chunk_exists = 1; + for(u = 0; u < dset->layout.u.chunk.ndims && chunk_exists; u++) { + if(ent->offset[u] != chunk_offset[u]) + chunk_exists = 0; /* Reset if no match */ + } /* end for */ } /* end for */ } /* end if */ if(!chunk_exists) { /* Initialize the chunk information */ - udata.mesg = *layout; + udata.mesg = dset->layout; udata.key.filter_mask = 0; udata.addr = HADDR_UNDEF; H5_CHECK_OVERFLOW(chunk_size,hsize_t,size_t); udata.key.nbytes = (size_t)chunk_size; - for (u=0; uu.chunk.ndims; u++) + for (u=0; ulayout.u.chunk.ndims; u++) udata.key.offset[u] = chunk_offset[u]; /* Allocate the chunk with all processes */ - if (H5B_insert(f, dxpl_id, H5B_ISTORE, layout->u.chunk.addr, &udata)<0) + if (H5B_insert(f, dxpl_id, H5B_ISTORE, dset->layout.u.chunk.addr, &udata)<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to allocate chunk"); /* Check if fill values should be written to blocks */ @@ -2362,8 +2357,8 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, } /* end if */ /* Increment indices */ - for (i=layout->u.chunk.ndims-1, carry=1; i>=0 && carry; --i) { - chunk_offset[i] += layout->u.chunk.dim[i]; + for (i=dset->layout.u.chunk.ndims-1, carry=1; i>=0 && carry; --i) { + chunk_offset[i] += dset->layout.u.chunk.dim[i]; if (chunk_offset[i] >= (hssize_t)(space_dim[i])) chunk_offset[i] = 0; else @@ -2387,14 +2382,14 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, done: /* Free the chunk for fill values */ if(chunk!=NULL) - H5F_istore_chunk_xfree(chunk,&pline); + H5D_istore_chunk_xfree(chunk,&pline); FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_allocate() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_prune_by_extent + * Function: H5D_istore_prune_by_extent * * Purpose: This function searches for chunks that are no longer necessary both in the * raw data cache and in the B-tree. @@ -2494,28 +2489,28 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_prune_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, const H5O_layout_t *layout, const H5S_t * space) +H5D_istore_prune_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, + hid_t dxpl_id, H5D_t *dset) { - H5F_rdcc_t *rdcc = &(f->shared->rdcc); /*raw data chunk cache */ - H5F_rdcc_ent_t *ent = NULL, *next = NULL; /*cache entry */ + H5D_rdcc_t *rdcc = &(dset->cache.chunk); /*raw data chunk cache */ + H5D_rdcc_ent_t *ent = NULL, *next = NULL; /*cache entry */ unsigned u; /*counters */ int found; /*remove this entry */ - H5F_istore_ud1_t udata; /*B-tree pass-through */ + H5D_istore_ud1_t udata; /*B-tree pass-through */ hsize_t curr_dims[H5O_LAYOUT_NDIMS]; /*current dataspace dimensions */ herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_prune_by_extent, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_prune_by_extent, FAIL); /* Check args */ assert(f); - assert(layout && H5D_CHUNKED == layout->type); - assert(layout->u.chunk.ndims > 0 && layout->u.chunk.ndims <= H5O_LAYOUT_NDIMS); - assert(H5F_addr_defined(layout->u.chunk.addr)); - assert(space); + assert(dxpl_cache); + assert(dset && H5D_CHUNKED == dset->layout.type); + assert(dset->layout.u.chunk.ndims > 0 && dset->layout.u.chunk.ndims <= H5O_LAYOUT_NDIMS); + assert(H5F_addr_defined(dset->layout.u.chunk.addr)); /* Go get the rank & dimensions */ - if(H5S_get_simple_extent_dims(space, curr_dims, NULL) < 0) + if(H5S_get_simple_extent_dims(dset->space, curr_dims, NULL) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset dimensions"); /*------------------------------------------------------------------------- @@ -2527,26 +2522,23 @@ H5F_istore_prune_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, for(ent = rdcc->head; ent; ent = next) { next = ent->next; - /* Make certain we are dealing with the correct B-tree, etc */ - if (H5F_addr_eq(layout->u.chunk.addr, ent->layout.u.chunk.addr)) { - for(u = 0; u < ent->layout.u.chunk.ndims - 1; u++) { - if((hsize_t)ent->offset[u] > curr_dims[u]) { - found = 1; - break; - } - } - } /* end if */ + for(u = 0; u < dset->layout.u.chunk.ndims - 1; u++) { + if((hsize_t)ent->offset[u] > curr_dims[u]) { + found = 1; + break; + } /* end if */ + } /* end for */ if(found) { -#ifdef H5F_ISTORE_DEBUG +#ifdef H5D_ISTORE_DEBUG HDfputs("cache:remove:[", stderr); - for(u = 0; u < ent->layout.u.chunk.ndims - 1; u++) + for(u = 0; u < dset->layout.u.chunk.ndims - 1; u++) HDfprintf(stderr, "%s%Hd", u ? ", " : "", ent->offset[u]); HDfputs("]\n", stderr); #endif /* Preempt the entry from the cache, but do not flush it to disk */ - if(H5F_istore_preempt(f, dxpl_cache, dxpl_id, ent, FALSE) < 0) + if(H5D_istore_preempt(f, dxpl_cache, dxpl_id, dset, ent, FALSE) < 0) HGOTO_ERROR(H5E_IO, H5E_CANTINIT, 0, "unable to preempt chunk"); found=0; @@ -2560,22 +2552,22 @@ H5F_istore_prune_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, HDmemset(&udata, 0, sizeof udata); udata.stream = stdout; - udata.mesg.u.chunk.addr = layout->u.chunk.addr; - udata.mesg.u.chunk.ndims = layout->u.chunk.ndims; - for(u = 0; u < udata.mesg.u.chunk.ndims; u++) - udata.mesg.u.chunk.dim[u] = layout->u.chunk.dim[u]; + udata.mesg.u.chunk.addr = dset->layout.u.chunk.addr; + udata.mesg.u.chunk.ndims = dset->layout.u.chunk.ndims; + for(u = 0; u < dset->layout.u.chunk.ndims; u++) + udata.mesg.u.chunk.dim[u] = dset->layout.u.chunk.dim[u]; udata.dims = curr_dims; - if(H5B_iterate(f, dxpl_id, H5B_ISTORE, H5F_istore_prune_extent, layout->u.chunk.addr, &udata) < 0) + if(H5B_iterate(f, dxpl_id, H5B_ISTORE, H5D_istore_prune_extent, dset->layout.u.chunk.addr, &udata) < 0) HGOTO_ERROR(H5E_IO, H5E_CANTINIT, 0, "unable to iterate over B-tree"); done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_prune_by_extent() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_prune_extent + * Function: H5D_istore_prune_extent * * Purpose: Search for chunks that are no longer necessary in the B-tree. * @@ -2585,32 +2577,32 @@ done: * * Date: March 26, 2002 * - * Comments: Called by H5B_prune_by_extent, part of H5B_ISTORE + * Comments: Called by H5D_prune_by_extent * * Modifications: * *------------------------------------------------------------------------- */ static int -H5F_istore_prune_extent(H5F_t *f, hid_t dxpl_id, void *_lt_key, haddr_t UNUSED addr, +H5D_istore_prune_extent(H5F_t *f, hid_t dxpl_id, void *_lt_key, haddr_t UNUSED addr, void UNUSED *_rt_key, void *_udata) { - H5F_istore_ud1_t *bt_udata = (H5F_istore_ud1_t *)_udata; - H5F_istore_key_t *lt_key = (H5F_istore_key_t *)_lt_key; + H5D_istore_ud1_t *bt_udata = (H5D_istore_ud1_t *)_udata; + H5D_istore_key_t *lt_key = (H5D_istore_key_t *)_lt_key; unsigned u; - H5F_istore_ud1_t udata; + H5D_istore_ud1_t udata; int ret_value=H5B_ITER_CONT; /* Return value */ /* The LT_KEY is the left key (the one that describes the chunk). It points to a chunk of * storage that contains the beginning of the logical address space represented by UDATA. */ - FUNC_ENTER_NOAPI_NOINIT(H5F_istore_prune_extent); + FUNC_ENTER_NOAPI_NOINIT(H5D_istore_prune_extent); /* Figure out what chunks are no longer in use for the specified extent and release them */ for(u = 0; u < bt_udata->mesg.u.chunk.ndims - 1; u++) if((hsize_t)lt_key->offset[u] > bt_udata->dims[u]) { -#ifdef H5F_ISTORE_DEBUG +#ifdef H5D_ISTORE_DEBUG HDfputs("b-tree:remove:[", bt_udata->stream); for(u = 0; u < bt_udata->mesg.u.chunk.ndims - 1; u++) HDfprintf(bt_udata->stream, "%s%Hd", u ? ", " : "", lt_key->offset[u]); @@ -2629,11 +2621,11 @@ H5F_istore_prune_extent(H5F_t *f, hid_t dxpl_id, void *_lt_key, haddr_t UNUSED a done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_prune_extent() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_remove + * Function: H5D_istore_remove * * Purpose: Removes chunks that are no longer necessary in the B-tree. * @@ -2651,20 +2643,16 @@ done: *------------------------------------------------------------------------- */ static H5B_ins_t -H5F_istore_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key /*in,out */ , +H5D_istore_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key /*in,out */ , hbool_t *lt_key_changed /*out */ , void UNUSED * _udata /*in,out */ , void UNUSED * _rt_key /*in,out */ , hbool_t *rt_key_changed /*out */ ) { - H5F_istore_key_t *lt_key = (H5F_istore_key_t *)_lt_key; + H5D_istore_key_t *lt_key = (H5D_istore_key_t *)_lt_key; H5B_ins_t ret_value=H5B_INS_REMOVE; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_remove,H5B_INS_ERROR); - - /* Check for overlap with the sieve buffer and reset it */ - if (H5F_sieve_overlap_clear(f, dxpl_id, addr, (hsize_t)lt_key->nbytes)<0) - HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, H5B_INS_ERROR, "unable to clear sieve buffer"); + FUNC_ENTER_NOAPI(H5D_istore_remove,H5B_INS_ERROR); /* Remove raw data chunk from file */ H5MF_xfree(f, H5FD_MEM_DRAW, dxpl_id, addr, (hsize_t)lt_key->nbytes); @@ -2675,11 +2663,11 @@ H5F_istore_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key /*in,out done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_remove() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_initialize_by_extent + * Function: H5D_istore_initialize_by_extent * * Purpose: This function searches for chunks that have to be initialized with the fill * value both in the raw data cache and in the B-tree. @@ -2692,7 +2680,7 @@ done: * * Comments: * - * (See the example of H5F_istore_prune_by_extent) + * (See the example of H5D_istore_prune_by_extent) * Next, there are seven chunks where the database extent boundary is * within the chunk. We find those seven just like we did with the previous nine. * Fot the ones that are allocated we initialize the part that lies outside the boundary @@ -2703,9 +2691,8 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, const H5O_layout_t *layout, - H5P_genplist_t *dc_plist, const H5S_t * space) +H5D_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, + hid_t dxpl_id, H5D_t *dset) { uint8_t *chunk = NULL; /*the file chunk */ unsigned idx_hint = 0; /*input value for H5F_istore_lock */ @@ -2728,20 +2715,25 @@ H5F_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_ca int i, carry; /*counters */ unsigned u; int found = 0; /*initialize this entry */ + H5P_genplist_t *dc_plist; /* Property list */ H5O_pline_t pline; /* I/O pipeline information */ H5O_fill_t fill; /* Fill value information */ H5D_fill_time_t fill_time; /* Fill time information */ H5D_storage_t store; /* Dataset storage information */ herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_initialize_by_extent, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_initialize_by_extent, FAIL); /* Check args */ assert(f); - assert(layout && H5D_CHUNKED == layout->type); - assert(layout->u.chunk.ndims > 0 && layout->u.chunk.ndims <= H5O_LAYOUT_NDIMS); - assert(H5F_addr_defined(layout->u.chunk.addr)); - assert(space); + assert(dxpl_cache); + assert(dset && H5D_CHUNKED == dset->layout.type); + assert(dset->layout.u.chunk.ndims > 0 && dset->layout.u.chunk.ndims <= H5O_LAYOUT_NDIMS); + assert(H5F_addr_defined(dset->layout.u.chunk.addr)); + + /* Get dataset's creation property list */ + if (NULL == (dc_plist = H5I_object(dset->dcpl_id))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset creation property list") /* Get necessary properties from property list */ if(H5P_get(dc_plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0) @@ -2756,7 +2748,7 @@ H5F_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_ca HDmemset(count, 0, sizeof(count)); /* Go get the rank & dimensions */ - if((srank = H5S_get_simple_extent_dims(space, curr_dims, NULL)) < 0) + if((srank = H5S_get_simple_extent_dims(dset->space, curr_dims, NULL)) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset dimensions"); H5_ASSIGN_OVERFLOW(rank,srank,int,unsigned); @@ -2765,9 +2757,9 @@ H5F_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_ca size[u] = curr_dims[u]; /* Round up to the next integer # of chunks, to accomodate partial chunks */ - chunks[u] = ((curr_dims[u]+layout->u.chunk.dim[u])-1) / layout->u.chunk.dim[u]; + chunks[u] = ((curr_dims[u]+dset->layout.u.chunk.dim[u])-1) / dset->layout.u.chunk.dim[u]; } /* end for */ - size[u] = layout->u.chunk.dim[u]; + size[u] = dset->layout.u.chunk.dim[u]; /* Get the "down" sizes for each dimension */ if(H5V_array_down(rank,chunks,down_chunks)<0) @@ -2775,7 +2767,7 @@ H5F_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_ca /* Create a data space for a chunk & set the extent */ for(u = 0; u < rank; u++) - chunk_dims[u] = layout->u.chunk.dim[u]; + chunk_dims[u] = dset->layout.u.chunk.dim[u]; if(NULL == (space_chunk = H5S_create_simple(rank,chunk_dims,NULL))) HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "can't create simple dataspace"); @@ -2784,18 +2776,18 @@ H5F_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_ca * loop through the chunks copying each chunk from the application to the * chunk cache. */ - for(u = 0; u < layout->u.chunk.ndims; u++) { - idx_max[u] = (size[u] - 1) / layout->u.chunk.dim[u] + 1; + for(u = 0; u < dset->layout.u.chunk.ndims; u++) { + idx_max[u] = (size[u] - 1) / dset->layout.u.chunk.dim[u] + 1; idx_cur[u] = 0; } /* end for */ /* Loop over all chunks */ carry=0; while(carry==0) { - for(u = 0, naccessed = 1; u < layout->u.chunk.ndims; u++) { + for(u = 0, naccessed = 1; u < dset->layout.u.chunk.ndims; u++) { /* The location and size of the chunk being accessed */ - chunk_offset[u] = idx_cur[u] * (hssize_t)(layout->u.chunk.dim[u]); - sub_size[u] = MIN((idx_cur[u] + 1) * layout->u.chunk.dim[u], + chunk_offset[u] = idx_cur[u] * (hssize_t)(dset->layout.u.chunk.dim[u]); + sub_size[u] = MIN((idx_cur[u] + 1) * dset->layout.u.chunk.dim[u], size[u]) - chunk_offset[u]; naccessed *= sub_size[u]; } /* end for */ @@ -2804,8 +2796,8 @@ H5F_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_ca * Figure out what chunks have to be initialized. These are the chunks where the dataspace * extent boundary is within the chunk */ - for(u = 0, found = 0; u < layout->u.chunk.ndims - 1; u++) { - end_chunk = chunk_offset[u] + layout->u.chunk.dim[u]; + for(u = 0, found = 0; u < dset->layout.u.chunk.ndims - 1; u++) { + end_chunk = chunk_offset[u] + dset->layout.u.chunk.dim[u]; if(end_chunk > size[u]) { found = 1; break; @@ -2815,27 +2807,27 @@ H5F_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_ca if(found) { /* Calculate the index of this chunk */ - if(H5V_chunk_index(rank,chunk_offset,layout->u.chunk.dim,down_chunks,&store.chunk.index)<0) + if(H5V_chunk_index(rank,chunk_offset,dset->layout.u.chunk.dim,down_chunks,&store.chunk.index)<0) HGOTO_ERROR (H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index") store.chunk.offset=chunk_offset; - if(NULL == (chunk = H5F_istore_lock(f, dxpl_cache, dxpl_id, layout, &pline, &fill, fill_time, - NULL, &store, FALSE, &idx_hint))) + if(NULL == (chunk = H5D_istore_lock(f, dxpl_cache, dxpl_id, dset, + &store, NULL, FALSE, &idx_hint))) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to read raw data chunk"); if(H5S_select_all(space_chunk,1) < 0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to select space"); for(u = 0; u < rank; u++) - count[u] = MIN((idx_cur[u] + 1) * layout->u.chunk.dim[u], size[u] - chunk_offset[u]); + count[u] = MIN((idx_cur[u] + 1) * dset->layout.u.chunk.dim[u], size[u] - chunk_offset[u]); -#ifdef H5F_ISTORE_DEBUG +#ifdef H5D_ISTORE_DEBUG HDfputs("cache:initialize:offset:[", stdout); - for(u = 0; u < layout->u.chunk.ndims - 1; u++) + for(u = 0; u < dset->layout.u.chunk.ndims - 1; u++) HDfprintf(stdout, "%s%Hd", u ? ", " : "", chunk_offset[u]); HDfputs("]", stdout); HDfputs(":count:[", stdout); - for(u = 0; u < layout->u.chunk.ndims - 1; u++) + for(u = 0; u < dset->layout.u.chunk.ndims - 1; u++) HDfprintf(stdout, "%s%Hd", u ? ", " : "", count[u]); HDfputs("]\n", stdout); #endif @@ -2852,13 +2844,13 @@ H5F_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_ca if(H5S_select_fill(fill.buf, (size_t)size[rank], space_chunk, chunk) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTENCODE, FAIL, "filling selection failed"); - if(H5F_istore_unlock(f, dxpl_cache, dxpl_id, layout, &pline, TRUE, - &store, idx_hint, chunk, (size_t)naccessed) < 0) + if(H5D_istore_unlock(f, dxpl_cache, dxpl_id, dset, &store, + TRUE, idx_hint, chunk, (size_t)naccessed) < 0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to unlock raw data chunk"); } /*found */ /* Increment indices */ - for(i = layout->u.chunk.ndims - 1, carry = 1; i >= 0 && carry; --i) { + for(i = dset->layout.u.chunk.ndims - 1, carry = 1; i >= 0 && carry; --i) { if(++idx_cur[i] >= idx_max[i]) idx_cur[i] = 0; else @@ -2871,11 +2863,11 @@ done: H5S_close(space_chunk); FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_initialize_by_extent() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_delete + * Function: H5D_istore_delete * * Purpose: Delete raw data storage for entire dataset (i.e. all chunks) * @@ -2890,34 +2882,15 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_delete(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout) +H5D_istore_delete(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout) { - H5D_dxpl_cache_t dxpl_cache; /* Cached data transfer properties */ - H5F_istore_ud1_t udata; /* User data for B-tree iterator call */ - H5F_rdcc_t *rdcc = &(f->shared->rdcc); /* File's raw data chunk cache */ - H5F_rdcc_ent_t *ent, *next; /* Pointers to cache entries */ + H5D_istore_ud1_t udata; /* User data for B-tree iterator call */ herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_delete, FAIL); - - /* Fill the DXPL cache values for later use */ - if (H5D_get_dxpl_cache(dxpl_id,&dxpl_cache)<0) - HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache") + FUNC_ENTER_NOAPI(H5D_istore_delete, FAIL); /* Check if the B-tree has been created in the file */ if(H5F_addr_defined(layout->u.chunk.addr)) { - /* Iterate through the entries in the cache, checking for the chunks to be deleted */ - for (ent=rdcc->head; ent; ent=next) { - /* Get pointer to next node, in case this one is deleted */ - next=ent->next; - - /* Is the chunk to be deleted this cache entry? */ - if(layout->u.chunk.addr==ent->layout.u.chunk.addr) - /* Remove entry without flushing */ - if (H5F_istore_preempt(f, &dxpl_cache, dxpl_id, ent, FALSE )<0) - HGOTO_ERROR (H5E_IO, H5E_CANTFLUSH, FAIL, "unable to flush one or more raw data chunks"); - } /* end for */ - /* Set up user data for B-tree deletion */ HDmemset(&udata, 0, sizeof udata); udata.mesg = *layout; @@ -2929,11 +2902,11 @@ H5F_istore_delete(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout) done: FUNC_LEAVE_NOAPI(ret_value); -} /* end H5F_istore_delete() */ +} /* end H5D_istore_delete() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_update_cache + * Function: H5D_istore_update_cache * * Purpose: Update any cached chunks index values after the dataspace * size has changed @@ -2949,11 +2922,11 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_update_cache(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, const H5S_t * space) +H5D_istore_update_cache(H5F_t *f, hid_t dxpl_id, H5D_t *dset) { - H5F_rdcc_t *rdcc = &(f->shared->rdcc); /*raw data chunk cache */ - H5F_rdcc_ent_t *ent, *next; /*cache entry */ - H5F_rdcc_ent_t *old_ent; /* Old cache entry */ + H5D_rdcc_t *rdcc = &(dset->cache.chunk); /*raw data chunk cache */ + H5D_rdcc_ent_t *ent, *next; /*cache entry */ + H5D_rdcc_ent_t *old_ent; /* Old cache entry */ H5D_dxpl_cache_t dxpl_cache; /* Cached data transfer properties */ int srank; /*current # of dimensions (signed) */ unsigned rank; /*current # of dimensions */ @@ -2961,29 +2934,25 @@ H5F_istore_update_cache(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, con hsize_t chunks[H5O_LAYOUT_NDIMS]; /*current number of chunks in each dimension */ hsize_t down_chunks[H5O_LAYOUT_NDIMS]; /* "down" size of number of elements in each dimension */ hsize_t idx; /* Chunk index */ - hsize_t temp_idx; /* temporary index number */ unsigned old_idx; /* Previous index number */ unsigned u; /*counters */ herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_update_cache, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_update_cache, FAIL); /* Check args */ assert(f); - assert(layout && H5D_CHUNKED == layout->type); - assert(layout->u.chunk.ndims > 0 && layout->u.chunk.ndims <= H5O_LAYOUT_NDIMS); - assert(space); + assert(dset && H5D_CHUNKED == dset->layout.type); + assert(dset->layout.u.chunk.ndims > 0 && dset->layout.u.chunk.ndims <= H5O_LAYOUT_NDIMS); /* Go get the rank & dimensions */ - if((srank = H5S_get_simple_extent_dims(space, curr_dims, NULL)) < 0) + if((srank = H5S_get_simple_extent_dims(dset->space, curr_dims, NULL)) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset dimensions"); H5_ASSIGN_OVERFLOW(rank,srank,int,unsigned); - /* Copy current dimensions */ - for(u = 0; u < rank; u++) { - /* Round up to the next integer # of chunks, to accomodate partial chunks */ - chunks[u] = ((curr_dims[u]+layout->u.chunk.dim[u])-1) / layout->u.chunk.dim[u]; - } /* end for */ + /* Round up to the next integer # of chunks, to accomodate partial chunks */ + for(u = 0; u < rank; u++) + chunks[u] = ((curr_dims[u]+dset->layout.u.chunk.dim[u])-1) / dset->layout.u.chunk.dim[u]; /* Get the "down" sizes for each dimension */ if(H5V_array_down(rank,chunks,down_chunks)<0) @@ -2997,38 +2966,34 @@ H5F_istore_update_cache(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, con for(ent = rdcc->head; ent; ent = next) { next=ent->next; - /* Make certain we are dealing with the correct B-tree, etc */ - if (H5F_addr_eq(layout->u.chunk.addr, ent->layout.u.chunk.addr)) { - /* Calculate the index of this chunk */ - if(H5V_chunk_index(rank,ent->offset,layout->u.chunk.dim,down_chunks,&idx)<0) - HGOTO_ERROR (H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index") + /* Calculate the index of this chunk */ + if(H5V_chunk_index(rank,ent->offset,dset->layout.u.chunk.dim,down_chunks,&idx)<0) + HGOTO_ERROR (H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index") - /* Compute the index for the chunk entry */ - temp_idx = idx + (hsize_t)(layout->u.chunk.addr); - old_idx=ent->idx; /* Save for later */ - ent->idx=H5F_HASH(f,temp_idx); + /* Compute the index for the chunk entry */ + old_idx=ent->idx; /* Save for later */ + ent->idx=H5D_HASH(dset,idx); - if(old_idx!=ent->idx) { - /* Check if there is already a chunk at this chunk's new location */ - old_ent = rdcc->slot[ent->idx]; - if(old_ent!=NULL) { - assert(old_ent->locked==0); + if(old_idx!=ent->idx) { + /* Check if there is already a chunk at this chunk's new location */ + old_ent = rdcc->slot[ent->idx]; + if(old_ent!=NULL) { + assert(old_ent->locked==0); - /* Check if we are removing the entry we would walk to next */ - if(old_ent==next) - next=old_ent->next; + /* Check if we are removing the entry we would walk to next */ + if(old_ent==next) + next=old_ent->next; - /* Remove the old entry from the cache */ - if (H5F_istore_preempt(f, &dxpl_cache, dxpl_id, old_ent, TRUE )<0) - HGOTO_ERROR (H5E_IO, H5E_CANTFLUSH, FAIL, "unable to flush one or more raw data chunks"); - } /* end if */ + /* Remove the old entry from the cache */ + if (H5D_istore_preempt(f, &dxpl_cache, dxpl_id, dset, old_ent, TRUE )<0) + HGOTO_ERROR (H5E_IO, H5E_CANTFLUSH, FAIL, "unable to flush one or more raw data chunks"); + } /* end if */ - /* Insert this chunk into correct location in hash table */ - rdcc->slot[ent->idx]=ent; + /* Insert this chunk into correct location in hash table */ + rdcc->slot[ent->idx]=ent; - /* Null out previous location */ - rdcc->slot[old_idx]=NULL; - } /* end if */ + /* Null out previous location */ + rdcc->slot[old_idx]=NULL; } /* end if */ } /* end for */ @@ -3038,7 +3003,7 @@ done: /*------------------------------------------------------------------------- - * Function: H5F_istore_dump_btree + * Function: H5D_istore_dump_btree * * Purpose: Prints information about the storage B-tree to the specified * stream. @@ -3056,29 +3021,29 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_dump_btree(H5F_t *f, hid_t dxpl_id, FILE *stream, unsigned ndims, haddr_t addr) +H5D_istore_dump_btree(H5F_t *f, hid_t dxpl_id, FILE *stream, unsigned ndims, haddr_t addr) { - H5F_istore_ud1_t udata; + H5D_istore_ud1_t udata; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_dump_btree, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_dump_btree, FAIL); HDmemset(&udata, 0, sizeof udata); udata.mesg.u.chunk.ndims = ndims; udata.stream = stream; if(stream) HDfprintf(stream, " Address: %a\n",addr); - if(H5B_iterate(f, dxpl_id, H5B_ISTORE, H5F_istore_iter_dump, addr, &udata)<0) + if(H5B_iterate(f, dxpl_id, H5B_ISTORE, H5D_istore_iter_dump, addr, &udata)<0) HGOTO_ERROR(H5E_IO, H5E_CANTINIT, 0, "unable to iterate over chunk B-tree"); done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_dump_btree() */ -#ifdef H5F_ISTORE_DEBUG +#ifdef H5D_ISTORE_DEBUG /*------------------------------------------------------------------------- - * Function: H5F_istore_stats + * Function: H5D_istore_stats * * Purpose: Print raw data cache statistics to the debug stream. If * HEADERS is non-zero then print table column headers, @@ -3094,21 +3059,20 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_stats (H5F_t *f, hbool_t headers) +H5D_istore_stats (H5D_t *dset, hbool_t headers) { - H5F_rdcc_t *rdcc = &(f->shared->rdcc); + H5D_rdcc_t *rdcc = &(dset->cache.chunk); double miss_rate; char ascii[32]; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_stats, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_stats, FAIL); if (!H5DEBUG(AC)) HGOTO_DONE(SUCCEED); if (headers) { - fprintf(H5DEBUG(AC), "H5F: raw data cache statistics for file %s\n", - f->name); + fprintf(H5DEBUG(AC), "H5D: raw data cache statistics\n"); fprintf(H5DEBUG(AC), " %-18s %8s %8s %8s %8s+%-8s\n", "Layer", "Hits", "Misses", "MissRate", "Inits", "Flushes"); fprintf(H5DEBUG(AC), " %-18s %8s %8s %8s %8s-%-8s\n", @@ -3139,12 +3103,12 @@ H5F_istore_stats (H5F_t *f, hbool_t headers) done: FUNC_LEAVE_NOAPI(ret_value); -} -#endif /* H5F_ISTORE_DEBUG */ +} /* end H5D_istore_stats() */ +#endif /* H5D_ISTORE_DEBUG */ /*------------------------------------------------------------------------- - * Function: H5F_istore_debug + * Function: H5D_istore_debug * * Purpose: Debugs a B-tree node for indexed raw data storage. * @@ -3159,13 +3123,13 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent, +H5D_istore_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent, int fwidth, int ndims) { - H5F_istore_ud1_t udata; + H5D_istore_ud1_t udata; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_debug, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_debug, FAIL); HDmemset (&udata, 0, sizeof udata); udata.mesg.u.chunk.ndims = ndims; @@ -3174,5 +3138,4 @@ H5F_istore_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int inden done: FUNC_LEAVE_NOAPI(ret_value); -} - +} /* end H5D_istore_debug() */ diff --git a/src/H5Dpkg.h b/src/H5Dpkg.h index 8a4abae..b72a13d 100644 --- a/src/H5Dpkg.h +++ b/src/H5Dpkg.h @@ -50,6 +50,29 @@ /* Package Private Typedefs */ /****************************/ +/* The raw data chunk cache */ +typedef struct H5D_rdcc_t { + unsigned ninits; /* Number of chunk creations */ + unsigned nhits; /* Number of cache hits */ + unsigned nmisses;/* Number of cache misses */ + unsigned nflushes;/* Number of cache flushes */ + size_t nbytes; /* Current cached raw data in bytes */ + size_t nslots; /* Number of chunk slots allocated */ + struct H5D_rdcc_ent_t *head; /* Head of doubly linked list */ + struct H5D_rdcc_ent_t *tail; /* Tail of doubly linked list */ + int nused; /* Number of chunk slots in use */ + struct H5D_rdcc_ent_t **slot; /* Chunk slots, each points to a chunk*/ +} H5D_rdcc_t; + +/* The raw data contiguous data cache */ +typedef struct H5D_rdcdc_t { + unsigned char *sieve_buf; /* Buffer to hold data sieve buffer */ + haddr_t sieve_loc; /* File location (offset) of the data sieve buffer */ + size_t sieve_size; /* Size of the data sieve buffer used (in bytes) */ + size_t sieve_buf_size; /* Size of the data sieve buffer allocated (in bytes) */ + unsigned sieve_dirty; /* Flag to indicate that the data sieve buffer is dirty */ +} H5D_rdcdc_t; + /* * A dataset is the following struct. */ @@ -60,11 +83,18 @@ struct H5D_t { hid_t dcpl_id; /* dataset creation property id */ H5D_dcpl_cache_t dcpl_cache; /* Cached DCPL values */ H5O_layout_t layout; /* data layout */ + /* Cache some frequently accessed values from the DCPL */ H5O_efl_t efl; /* External file list information */ H5D_alloc_time_t alloc_time; /* Dataset allocation time */ H5D_fill_time_t fill_time; /* Dataset fill value writing time */ H5O_fill_t fill; /* Dataset fill value information */ + + /* Buffered/cached information for types of raw data storage*/ + union { + H5D_rdcdc_t contig; /* Information about contiguous data */ + H5D_rdcc_t chunk; /* Information about chunked data */ + }cache; }; /* Enumerated type for allocating dataset's storage */ @@ -87,6 +117,30 @@ extern H5D_dxpl_cache_t H5D_def_dxpl_cache; H5_DLL herr_t H5D_alloc_storage (H5F_t *f, hid_t dxpl_id, H5D_t *dset, H5D_time_alloc_t time_alloc, hbool_t update_time, hbool_t full_overwrite); +/* Functions that operate on contiguous storage */ +H5_DLL herr_t H5D_contig_create(H5F_t *f, hid_t dxpl_id, H5D_t *dset); +H5_DLL herr_t H5D_contig_fill(H5F_t *f, hid_t dxpl_id, H5D_t *dset); + +/* Functions that operate on indexed storage */ +H5_DLL herr_t H5D_istore_init (H5F_t *f, H5D_t *dset); +H5_DLL herr_t H5D_istore_flush (H5F_t *f, hid_t dxpl_id, H5D_t *dset, unsigned flags); +H5_DLL herr_t H5D_istore_create(H5F_t *f, hid_t dxpl_id, + H5O_layout_t *layout/*in,out*/); +H5_DLL herr_t H5D_istore_dest (H5F_t *f, hid_t dxpl_id, H5D_t *dset); +H5_DLL herr_t H5D_istore_allocate (H5F_t *f, hid_t dxpl_id, + const H5D_t *dset, hbool_t full_overwrite); +H5_DLL hsize_t H5D_istore_allocated(H5F_t *f, hid_t dxpl_id, H5D_t *dset); +H5_DLL herr_t H5D_istore_prune_by_extent( H5F_t *f, + const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, H5D_t *dset); +H5_DLL herr_t H5D_istore_initialize_by_extent( H5F_t *f, + const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, H5D_t *dset); +H5_DLL herr_t H5D_istore_update_cache(H5F_t *f, hid_t dxpl_id, H5D_t *dset); +H5_DLL herr_t H5D_istore_dump_btree(H5F_t *f, hid_t dxpl_id, FILE *stream, unsigned ndims, + haddr_t addr); +#ifdef H5D_ISTORE_DEBUG +H5_DLL herr_t H5D_istore_stats (H5D_t *dset, hbool_t headers); +#endif /* H5D_ISTORE_DEBUG */ + /* Testing functions */ #ifdef H5D_TESTING H5_DLL herr_t H5D_layout_version_test(hid_t did, unsigned *version); diff --git a/src/H5Dprivate.h b/src/H5Dprivate.h index bdbe126..fc6ea39 100644 --- a/src/H5Dprivate.h +++ b/src/H5Dprivate.h @@ -206,8 +206,61 @@ H5_DLL herr_t H5D_xfer_create(hid_t dxpl_id, void *create_data); H5_DLL herr_t H5D_xfer_copy(hid_t new_plist_id, hid_t old_plist_id, void *copy_data); H5_DLL herr_t H5D_xfer_close(hid_t dxpl_id, void *close_data); -H5_DLL herr_t H5D_flush(const H5F_t *f, hid_t dxpl_id); +H5_DLL herr_t H5D_flush(H5F_t *f, hid_t dxpl_id, unsigned flags); H5_DLL herr_t H5D_get_dxpl_cache(hid_t dxpl_id, H5D_dxpl_cache_t *cache); H5_DLL herr_t H5D_get_dxpl_cache_real(hid_t dxpl_id, H5D_dxpl_cache_t *cache); +/* Functions that operate on byte sequences in memory and on disk */ +H5_DLL ssize_t H5D_seq_readvv(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, + hid_t dxpl_id, H5D_t *dset, const H5D_storage_t *store, + size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[], + size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], + void *buf); +H5_DLL ssize_t H5D_seq_writevv(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, + hid_t dxpl_id, H5D_t *dset, const H5D_storage_t *store, + size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[], + size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], + const void *buf); + +/* Functions that operate on contiguous storage */ +H5_DLL herr_t H5D_contig_delete(H5F_t *f, hid_t dxpl_id, + const H5O_layout_t *layout); +H5_DLL haddr_t H5D_contig_get_addr(const H5D_t *dset); +H5_DLL ssize_t H5D_contig_readvv(H5F_t *f, hid_t dxpl_id, H5D_t *dset, + haddr_t dset_addr, hsize_t dset_size, + size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[], + size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], + void *buf); +H5_DLL ssize_t H5D_contig_writevv(H5F_t *f, hid_t dxpl_id, H5D_t *dset, + haddr_t dset_addr, hsize_t dset_size, + size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[], + size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], + const void *buf); + +/* Functions that operate on compact dataset storage */ +H5_DLL ssize_t H5D_compact_readvv(H5F_t *f, hid_t dxpl_id, const H5D_t *dset, + size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_size_arr[], hsize_t dset_offset_arr[], + size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_size_arr[], hsize_t mem_offset_arr[], + void *buf); +H5_DLL ssize_t H5D_compact_writevv(H5F_t *f, hid_t dxpl_id, H5D_t *dset, + size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_size_arr[], hsize_t dset_offset_arr[], + size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_size_arr[], hsize_t mem_offset_arr[], + const void *buf); + +/* Functions that operate on indexed storage */ +H5_DLL herr_t H5D_istore_delete(H5F_t *f, hid_t dxpl_id, + const H5O_layout_t *layout); +H5_DLL ssize_t H5D_istore_readvv(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, + hid_t dxpl_id, H5D_t *dset, const H5D_storage_t *store, + size_t chunk_max_nseq, size_t *chunk_curr_seq, size_t chunk_len_arr[], hsize_t chunk_offset_arr[], + size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], + void *buf); +H5_DLL ssize_t H5D_istore_writevv(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, + hid_t dxpl_id, H5D_t *dset, const H5D_storage_t *store, + size_t chunk_max_nseq, size_t *chunk_curr_seq, size_t chunk_len_arr[], hsize_t chunk_offset_arr[], + size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], + const void *buf); +H5_DLL herr_t H5D_istore_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, + int indent, int fwidth, int ndims); + #endif diff --git a/src/H5Dseq.c b/src/H5Dseq.c index f8ecf00..5585315 100644 --- a/src/H5Dseq.c +++ b/src/H5Dseq.c @@ -23,16 +23,16 @@ * */ -#define H5F_PACKAGE /*suppress error about including H5Fpkg */ +#define H5D_PACKAGE /*suppress error about including H5Dpkg */ /* Pablo information */ /* (Put before include files to avoid problems with inline functions) */ -#define PABLO_MASK H5Fseq_mask +#define PABLO_MASK H5Dseq_mask #include "H5private.h" /* Generic Functions */ -#include "H5Dprivate.h" /* Datasets */ +#include "H5Dpkg.h" /* Datasets */ #include "H5Eprivate.h" /* Error handling */ -#include "H5Fpkg.h" /* Files */ +#include "H5Fprivate.h" /* Files */ #include "H5FDprivate.h" /* File drivers */ #include "H5Iprivate.h" /* IDs */ #include "H5MFprivate.h" /* File space management */ @@ -47,105 +47,7 @@ static int interface_initialize_g = 0; /*------------------------------------------------------------------------- - * Function: H5F_seq_read - * - * Purpose: Reads a sequence of bytes from a file dataset into a buffer in - * in memory. The data is read from file F and the array's size and - * storage information is in LAYOUT. External files are described - * according to the external file list, EFL. The sequence offset is - * DSET_OFFSET in the dataset (offsets are in terms of bytes) and the - * size of the hyperslab is SEQ_LEN. The total size of the file array - * is implied in the LAYOUT argument. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Quincey Koziol - * Thursday, September 28, 2000 - * - * Modifications: - * Re-written to use new vector I/O call - QAK, 7/7/01 - * - *------------------------------------------------------------------------- - */ -herr_t -H5F_seq_read(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, const H5O_layout_t *layout, - const struct H5D_dcpl_cache_t *dcpl_cache, const H5D_storage_t *store, - size_t seq_len, hsize_t dset_offset, void *buf/*out*/) -{ - hsize_t mem_off=0; /* Offset in memory */ - size_t mem_len=seq_len; /* Length in memory */ - size_t mem_curr_seq=0; /* "Current sequence" in memory */ - size_t dset_curr_seq=0; /* "Current sequence" in dataset */ - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5F_seq_read, FAIL); - - /* Check args */ - assert(f); - assert(layout); - assert(buf); - assert(TRUE==H5P_isa_class(dxpl_id,H5P_DATASET_XFER)); - - if (H5F_seq_readvv(f, dxpl_cache, dxpl_id, layout, dcpl_cache, store, 1, &dset_curr_seq, &seq_len, &dset_offset, 1, &mem_curr_seq, &mem_len, &mem_off, buf)<0) - HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "vector read failed"); - -done: - FUNC_LEAVE_NOAPI(ret_value); -} /* H5F_seq_read() */ - - -/*------------------------------------------------------------------------- - * Function: H5F_seq_write - * - * Purpose: Writes a sequence of bytes to a file dataset from a buffer in - * in memory. The data is written to file F and the array's size and - * storage information is in LAYOUT. External files are described - * according to the external file list, EFL. The sequence offset is - * DSET_OFFSET in the dataset (offsets are in terms of bytes) and the - * size of the hyperslab is SEQ_LEN. The total size of the file array - * is implied in the LAYOUT argument. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Quincey Koziol - * Monday, October 9, 2000 - * - * Modifications: - * Re-written to use new vector I/O routine - QAK, 7/7/01 - * - *------------------------------------------------------------------------- - */ -herr_t -H5F_seq_write(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, H5O_layout_t *layout, - const struct H5D_dcpl_cache_t *dcpl_cache, const H5D_storage_t *store, - size_t seq_len, hsize_t dset_offset, const void *buf) -{ - hsize_t mem_off=0; /* Offset in memory */ - size_t mem_len=seq_len; /* Length in memory */ - size_t mem_curr_seq=0; /* "Current sequence" in memory */ - size_t dset_curr_seq=0; /* "Current sequence" in dataset */ - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5F_seq_write, FAIL); - - /* Check args */ - assert(f); - assert(layout); - assert(buf); - assert(TRUE==H5P_isa_class(dxpl_id,H5P_DATASET_XFER)); - - if (H5F_seq_writevv(f, dxpl_cache, dxpl_id, layout, dcpl_cache, store, 1, &dset_curr_seq, &seq_len, &dset_offset, 1, &mem_curr_seq, &mem_len, &mem_off, buf)<0) - HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "vector write failed"); - -done: - FUNC_LEAVE_NOAPI(ret_value); -} /* H5F_seq_write() */ - - -/*------------------------------------------------------------------------- - * Function: H5F_seq_readvv + * Function: H5D_seq_readvv * * Purpose: Reads in a vector of byte sequences from a file dataset into a * buffer in in memory. The data is read from file F and the array's size @@ -185,22 +87,20 @@ done: *------------------------------------------------------------------------- */ ssize_t -H5F_seq_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, - const struct H5O_layout_t *layout, - const struct H5D_dcpl_cache_t *dcpl_cache, const H5D_storage_t *store, +H5D_seq_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[], size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], void *buf/*out*/) { ssize_t ret_value; /* Return value */ - FUNC_ENTER_NOAPI(H5F_seq_readvv, FAIL); + FUNC_ENTER_NOAPI(H5D_seq_readvv, FAIL); /* Check args */ assert(f); assert(TRUE==H5P_isa_class(dxpl_id,H5P_DATASET_XFER)); /* Make certain we have the correct type of property list */ - assert(layout); - assert(dcpl_cache); + assert(dset); assert(dset_curr_seq); assert(*dset_curr_seqtype) { + switch (dset->layout.type) { case H5D_CONTIGUOUS: /* Read directly from file if the dataset is in an external file */ if (store && store->efl.nused>0) { @@ -227,17 +127,18 @@ H5F_seq_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_i HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "external data read failed"); } else { /* Pass along the vector of sequences to read */ - if((ret_value=H5F_contig_readvv(f, layout->u.contig.size, layout->u.contig.addr, + if((ret_value=H5D_contig_readvv(f, dxpl_id, dset, + dset->layout.u.contig.addr, dset->layout.u.contig.size, dset_max_nseq, dset_curr_seq, dset_len_arr, dset_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, - dxpl_id, buf))<0) + buf))<0) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "block read failed"); } /* end else */ break; case H5D_CHUNKED: assert(store); - if((ret_value=H5F_istore_readvv(f, dxpl_cache, dxpl_id, layout, dcpl_cache, store, + if((ret_value=H5D_istore_readvv(f, dxpl_cache, dxpl_id, dset, store, dset_max_nseq, dset_curr_seq, dset_len_arr, dset_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, buf))<0) @@ -246,10 +147,10 @@ H5F_seq_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_i case H5D_COMPACT: /* Pass along the vector of sequences to read */ - if((ret_value=H5F_compact_readvv(f, layout, + if((ret_value=H5D_compact_readvv(f, dxpl_id, dset, dset_max_nseq, dset_curr_seq, dset_len_arr, dset_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, - dxpl_id, buf))<0) + buf))<0) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "compact read failed"); break; @@ -260,11 +161,11 @@ H5F_seq_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_i done: FUNC_LEAVE_NOAPI(ret_value); -} /* H5F_seq_readvv() */ +} /* H5D_seq_readvv() */ /*------------------------------------------------------------------------- - * Function: H5F_seq_writevv + * Function: H5D_seq_writevv * * Purpose: Writes a vector of byte sequences from a buffer in memory into * a vector of byte sequences in a file dataset. The data is written to @@ -294,22 +195,20 @@ done: *------------------------------------------------------------------------- */ ssize_t -H5F_seq_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, struct H5O_layout_t *layout, - const struct H5D_dcpl_cache_t *dcpl_cache, const H5D_storage_t *store, +H5D_seq_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, + hid_t dxpl_id, struct H5D_t *dset, const H5D_storage_t *store, size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[], size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], const void *buf) { ssize_t ret_value; /* Return value */ - FUNC_ENTER_NOAPI(H5F_seq_writevv, FAIL); + FUNC_ENTER_NOAPI(H5D_seq_writevv, FAIL); /* Check args */ assert(f); assert(TRUE==H5P_isa_class(dxpl_id,H5P_DATASET_XFER)); /* Make certain we have the correct type of property list */ - assert(layout); - assert(dcpl_cache); + assert(dset); assert(dset_curr_seq); assert(*dset_curr_seqtype) { + switch (dset->layout.type) { case H5D_CONTIGUOUS: /* Write directly to file if the dataset is in an external file */ if (store && store->efl.nused>0) { @@ -336,17 +235,18 @@ H5F_seq_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "external data write failed"); } else { /* Pass along the vector of sequences to write */ - if ((ret_value=H5F_contig_writevv(f, layout->u.contig.size, layout->u.contig.addr, + if ((ret_value=H5D_contig_writevv(f, dxpl_id, dset, + dset->layout.u.contig.addr, dset->layout.u.contig.size, dset_max_nseq, dset_curr_seq, dset_len_arr, dset_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, - dxpl_id, buf))<0) + buf))<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "block write failed"); } /* end else */ break; case H5D_CHUNKED: assert(store); - if((ret_value=H5F_istore_writevv(f, dxpl_cache, dxpl_id, layout, dcpl_cache, store, + if((ret_value=H5D_istore_writevv(f, dxpl_cache, dxpl_id, dset, store, dset_max_nseq, dset_curr_seq, dset_len_arr, dset_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, buf))<0) @@ -355,10 +255,10 @@ H5F_seq_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, case H5D_COMPACT: /* Pass along the vector of sequences to write */ - if((ret_value=H5F_compact_writevv(f, layout, + if((ret_value=H5D_compact_writevv(f, dxpl_id, dset, dset_max_nseq, dset_curr_seq, dset_len_arr, dset_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, - dxpl_id, buf))<0) + buf))<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "compact write failed"); break; @@ -369,4 +269,4 @@ H5F_seq_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, done: FUNC_LEAVE_NOAPI(ret_value); -} /* H5F_seq_writevv() */ +} /* H5D_seq_writevv() */ diff --git a/src/H5F.c b/src/H5F.c index 41fb972..db27c6a 100644 --- a/src/H5F.c +++ b/src/H5F.c @@ -92,9 +92,6 @@ H5FL_DEFINE_STATIC(H5F_file_t); /* Declare the external free list for the H5G_t struct */ H5FL_EXTERN(H5G_t); -/* Declare the external PQ free list for the sieve buffer information */ -H5FL_BLK_EXTERN(sieve_buf); - /*------------------------------------------------------------------------- * Function: H5F_init @@ -1523,10 +1520,6 @@ H5F_new(H5F_file_t *shared, hid_t fcpl_id, hid_t fapl_id) f->shared->mdc_nelmts = n; - /* Create the chunk cache */ - if(H5F_istore_init(f)<0) - HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to initialize indexed storage routines") - /* Create the file's "open object" information */ if(H5FO_create(f)<0) HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create open object TBBT") @@ -1611,22 +1604,12 @@ H5F_dest(H5F_t *f, hid_t dxpl_id) HERROR(H5E_FILE, H5E_CANTRELEASE, "problems closing file"); ret_value = FAIL; /*but keep going*/ } - if (H5F_istore_dest (f, dxpl_id)<0) { - HERROR(H5E_FILE, H5E_CANTRELEASE, "problems closing file"); - ret_value = FAIL; /*but keep going*/ - } if (H5FO_dest(f)<0) { HERROR(H5E_FILE, H5E_CANTRELEASE, "problems closing file"); ret_value = FAIL; /*but keep going*/ } /* end if */ f->shared->cwfs = H5MM_xfree (f->shared->cwfs); - /* Free the data sieve buffer, if it's been allocated */ - if(f->shared->sieve_buf) { - assert(f->shared->sieve_dirty==0); /* The buffer had better be flushed... */ - f->shared->sieve_buf = H5FL_BLK_FREE (sieve_buf,f->shared->sieve_buf); - } /* end if */ - /* Destroy file creation properties */ if(H5I_GENPROP_LST != H5I_get_type(f->shared->fcpl_id)) HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a property list") @@ -3012,8 +2995,8 @@ H5F_flush(H5F_t *f, hid_t dxpl_id, H5F_scope_t scope, unsigned flags) if (H5F_flush(f->mtab.child[i].file, dxpl_id, scope, flags) < 0) nerrors++; - /* flush any cached compact storage raw data */ - if (H5D_flush(f, dxpl_id) < 0) + /* Flush any cached dataset storage raw data */ + if (H5D_flush(f, dxpl_id, flags) < 0) HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush dataset cache") /* @@ -3071,21 +3054,6 @@ H5F_flush(H5F_t *f, hid_t dxpl_id, H5F_scope_t scope, unsigned flags) #endif /* H5_HAVE_FPHDF5 */ } /* end if */ - /* flush the data sieve buffer, if we have a dirty one */ - if (f->shared->sieve_buf && f->shared->sieve_dirty) { - /* Write dirty data sieve buffer to file */ - if (H5F_block_write(f, H5FD_MEM_DRAW, f->shared->sieve_loc, - f->shared->sieve_size, dxpl_id, f->shared->sieve_buf) < 0) - HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "block write failed") - - /* Reset sieve buffer dirty flag */ - f->shared->sieve_dirty=0; - } /* end if */ - - /* flush the entire raw data cache */ - if (H5F_istore_flush(f, dxpl_id, flags & (H5F_FLUSH_INVALIDATE | H5F_FLUSH_CLEAR_ONLY)) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush raw data cache") - /* flush (and invalidate) the entire meta data cache */ /* * FIXME: This should be CLEAR_ONLY for non-captain processes. @@ -3340,9 +3308,6 @@ H5F_close(H5F_t *f) #ifdef H5AC_DEBUG H5AC_stats(f); #endif /* H5AC_DEBUG */ -#ifdef H5F_ISTORE_DEBUG - H5F_istore_stats(f, FALSE); -#endif /* H5F_ISTORE_DEBUG */ /* Only try to flush the file if it was opened with write access */ if(f->intent&H5F_ACC_RDWR) { @@ -4126,6 +4091,130 @@ H5F_Kvalue(const H5F_t *f, const H5B_class_t *type) /*------------------------------------------------------------------------- + * Function: H5F_rdcc_nelmts + * + * Purpose: Replaced a macro to retrieve the raw data cache number of elments, + * now that the generic properties are being used to store + * the values. + * + * Return: Success: Non-negative, and the raw data cache number of + * of elemnts is returned. + * + * Failure: Negative (should not happen) + * + * Programmer: Quincey Koziol + * koziol@ncsa.uiuc.edu + * Jun 1 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +size_t H5F_rdcc_nelmts(const H5F_t *f) +{ + /* Use FUNC_ENTER_NOAPI_NOINIT_NOFUNC here to avoid performance issues */ + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_rdcc_nelmts) + + assert(f); + assert(f->shared); + + FUNC_LEAVE_NOAPI(f->shared->rdcc_nelmts) +} /* end H5F_rdcc_nelmts() */ + + +/*------------------------------------------------------------------------- + * Function: H5F_rdcc_nbytes + * + * Purpose: Replaced a macro to retrieve the raw data cache number of bytes, + * now that the generic properties are being used to store + * the values. + * + * Return: Success: Non-negative, and the raw data cache number of + * of bytes is returned. + * + * Failure: Negative (should not happen) + * + * Programmer: Quincey Koziol + * koziol@ncsa.uiuc.edu + * Jun 1 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +size_t H5F_rdcc_nbytes(const H5F_t *f) +{ + /* Use FUNC_ENTER_NOAPI_NOINIT_NOFUNC here to avoid performance issues */ + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_rdcc_nbytes) + + assert(f); + assert(f->shared); + + FUNC_LEAVE_NOAPI(f->shared->rdcc_nbytes) +} /* end H5F_rdcc_nbytes() */ + + +/*------------------------------------------------------------------------- + * Function: H5F_rdcc_w0 + * + * Purpose: Replaced a macro to retrieve the raw data cache 'w0' value + * now that the generic properties are being used to store + * the values. + * + * Return: Success: Non-negative, and the raw data cache 'w0' value + * is returned. + * + * Failure: Negative (should not happen) + * + * Programmer: Quincey Koziol + * koziol@ncsa.uiuc.edu + * Jun 2 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +double H5F_rdcc_w0(const H5F_t *f) +{ + /* Use FUNC_ENTER_NOAPI_NOINIT_NOFUNC here to avoid performance issues */ + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_rdcc_w0) + + assert(f); + assert(f->shared); + + FUNC_LEAVE_NOAPI(f->shared->rdcc_w0) +} /* end H5F_rdcc_w0() */ + + +/*------------------------------------------------------------------------- + * Function: H5F_has_feature + * + * Purpose: Check if a file has a particular feature enabled + * + * Return: Success: Non-negative - TRUE or FALSE + * Failure: Negative (should not happen) + * + * Programmer: Quincey Koziol + * koziol@ncsa.uiuc.edu + * May 31 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +hbool_t H5F_has_feature(const H5F_t *f, unsigned feature) +{ + /* Use FUNC_ENTER_NOAPI_NOINIT_NOFUNC here to avoid performance issues */ + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_has_feature) + + assert(f); + assert(f->shared); + + FUNC_LEAVE_NOAPI(f->shared->lf->feature_flags&feature); +} /* end H5F_has_feature() */ + + +/*------------------------------------------------------------------------- * Function: H5F_get_driver_id * * Purpose: Quick and dirty routine to retrieve the file's 'driver_id' value @@ -4268,6 +4357,144 @@ H5F_get_base_addr(const H5F_t *f) /*------------------------------------------------------------------------- + * Function: H5F_get_eoa + * + * Purpose: Quick and dirty routine to retrieve the file's 'eoa' value + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * June 1, 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +haddr_t +H5F_get_eoa(const H5F_t *f) +{ + haddr_t ret_value; + + /* Use FUNC_ENTER_NOAPI_NOINIT_NOFUNC here to avoid performance issues */ + FUNC_ENTER_NOAPI(H5F_get_eoa, HADDR_UNDEF) + + assert(f); + assert(f->shared); + + /* Dispatch to driver */ + if (HADDR_UNDEF==(ret_value=H5FD_get_eoa(f->shared->lf))) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, HADDR_UNDEF, "driver get_eoa request failed") + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5F_get_base_addr() */ + +#ifdef H5_HAVE_PARALLEL + +/*------------------------------------------------------------------------- + * Function: H5F_mpi_get_rank + * + * Purpose: Retrieves the rank of an MPI process. + * + * Return: Success: The rank (non-negative) + * + * Failure: Negative + * + * Programmer: Quincey Koziol + * Friday, January 30, 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +int +H5F_mpi_get_rank(const H5F_t *f) +{ + int ret_value; + + FUNC_ENTER_NOAPI(H5F_mpi_get_rank, FAIL) + + assert(f && f->shared); + + /* Dispatch to driver */ + if ((ret_value=H5FD_mpi_get_rank(f->shared->lf))<0) + HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "driver get_rank request failed") + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5F_mpi_get_rank() */ + + +/*------------------------------------------------------------------------- + * Function: H5F_mpi_get_size + * + * Purpose: Retrieves the size of the communicator used for the file + * + * Return: Success: The communicator size (non-negative) + * + * Failure: Negative + * + * Programmer: Quincey Koziol + * Friday, January 30, 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +int +H5F_mpi_get_size(const H5F_t *f) +{ + int ret_value; + + FUNC_ENTER_NOAPI(H5F_mpi_get_size, FAIL) + + assert(f && f->shared); + + /* Dispatch to driver */ + if ((ret_value=H5FD_mpi_get_size(f->shared->lf))<0) + HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "driver get_size request failed") + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5F_mpi_get_size() */ + + +/*------------------------------------------------------------------------- + * Function: H5F_mpi_get_comm + * + * Purpose: Retrieves the file's communicator + * + * Return: Success: The communicator (non-negative) + * + * Failure: Negative + * + * Programmer: Quincey Koziol + * Friday, January 30, 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +MPI_Comm +H5F_mpi_get_comm(const H5F_t *f) +{ + MPI_Comm ret_value; + + FUNC_ENTER_NOAPI(H5F_mpi_get_comm, MPI_COMM_NULL) + + assert(f && f->shared); + + /* Dispatch to driver */ + if ((ret_value=H5FD_mpi_get_comm(f->shared->lf))==MPI_COMM_NULL) + HGOTO_ERROR(H5E_VFL, H5E_CANTGET, MPI_COMM_NULL, "driver get_comm request failed") + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5F_mpi_get_comm() */ +#endif /* H5_HAVE_PARALLEL */ + + +/*------------------------------------------------------------------------- * Function: H5F_block_read * * Purpose: Reads some data from a file/server/etc into a buffer. @@ -4474,89 +4701,6 @@ H5F_addr_decode(const H5F_t *f, const uint8_t **pp/*in,out*/, haddr_t *addr_p/*o /*------------------------------------------------------------------------- - * Function: H5F_sieve_overlap_clear - * - * Purpose: Checks for an address range's overlap with the sieve buffer - * and resets the sieve buffer if it overlaps. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Quincey Koziol - * Wednesday, March 19, 2003 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t -H5F_sieve_overlap_clear(const H5F_t *f, hid_t dxpl_id, haddr_t addr, hsize_t size) -{ - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5F_sieve_overlap_clear,FAIL) - - /* Sanity check arguments */ - assert(f); - - /* Check for the address range overlapping with the sieve buffer */ - if(H5F_addr_overlap(f->shared->sieve_loc,f->shared->sieve_size,addr,size)) { - /* Check if only part of the sieve buffer is being invalidated */ - if(sizeshared->sieve_size) { - /* Check if the portion to invalidate is at the end */ - if((f->shared->sieve_loc+f->shared->sieve_size)==(addr+size)) { - /* Just shorten the buffer */ - f->shared->sieve_size-=size; - } /* end if */ - /* Check if the portion to invalidate is at the beginning */ - else if(f->shared->sieve_loc==addr) { - /* Advance the start of the sieve buffer (on disk) and shorten the buffer */ - f->shared->sieve_loc+=size; - f->shared->sieve_size-=size; - - /* Move the retained information in the buffer down */ - HDmemcpy(f->shared->sieve_buf,f->shared->sieve_buf+size,f->shared->sieve_size); - } /* end elif */ - /* Portion to invalidate is in middle */ - else { - size_t invalid_size; /* Portion of sieve buffer to invalidate */ - - /* Write out portion at the beginning of the buffer, if buffer is dirty */ - if(f->shared->sieve_dirty) { - size_t start_size; /* Portion of sieve buffer to write */ - - /* Compute size of block at beginning of buffer */ - start_size=(addr-f->shared->sieve_loc); - - /* Write to file */ - if (H5F_block_write(f, H5FD_MEM_DRAW, f->shared->sieve_loc, start_size, dxpl_id, f->shared->sieve_buf)<0) - HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "block write failed"); - } /* end if */ - - /* Compute size of block to invalidate */ - invalid_size=((addr+size)-f->shared->sieve_loc); - - /* Advance the start of the sieve buffer (on disk) and shorten the buffer */ - f->shared->sieve_loc+=invalid_size; - f->shared->sieve_size-=invalid_size; - - /* Move the retained information in the buffer down */ - HDmemcpy(f->shared->sieve_buf,f->shared->sieve_buf+invalid_size,f->shared->sieve_size); - } /* end else */ - } /* end if */ - else { - /* Reset sieve information */ - f->shared->sieve_loc=HADDR_UNDEF; - f->shared->sieve_size=0; - f->shared->sieve_dirty=0; - } /* end else */ - } /* end if */ - -done: - FUNC_LEAVE_NOAPI(ret_value) -} /* H5F_sieve_overlap_clear() */ - - -/*------------------------------------------------------------------------- * Function: H5Fget_freespace * * Purpose: Retrieves the amount of free space (of a given type) in the diff --git a/src/H5Fcompact.c b/src/H5Fcompact.c index 4f5b75e..3701221 100644 --- a/src/H5Fcompact.c +++ b/src/H5Fcompact.c @@ -17,21 +17,22 @@ * August 5, 2002 * * Purpose: Compact dataset I/O functions. These routines are similar - * H5F_contig_* and H5F_istore_*. + * H5D_contig_* and H5D_istore_*. */ -#define H5F_PACKAGE /*suppress error about including H5Fpkg */ +#define H5D_PACKAGE /*suppress error about including H5Dpkg */ /* Pablo information */ /* (Put before include files to avoid problems with inline functions) */ -#define PABLO_MASK H5Fcompact_mask +#define PABLO_MASK H5Dcompact_mask -#include "H5private.h" -#include "H5Eprivate.h" -#include "H5Fpkg.h" -#include "H5Oprivate.h" -#include "H5FDprivate.h" /*file driver */ -#include "H5FLprivate.h" /*Free Lists */ +#include "H5private.h" /* Generic Functions */ +#include "H5Dpkg.h" /* Dataset functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Fprivate.h" /* Files */ +#include "H5FDprivate.h" /* File drivers */ +#include "H5FLprivate.h" /* Free Lists */ +#include "H5Oprivate.h" /* Object headers */ #include "H5Vprivate.h" /* Vector and array functions */ /* Interface initialization */ @@ -40,7 +41,7 @@ static int interface_initialize_g = 0; /*------------------------------------------------------------------------- - * Function: H5F_compact_readvv + * Function: H5D_compact_readvv * * Purpose: Reads some data vectors from a dataset into a buffer. * The data is in compact dataset. The address is relative @@ -60,26 +61,28 @@ static int interface_initialize_g = 0; *------------------------------------------------------------------------- */ ssize_t -H5F_compact_readvv(H5F_t UNUSED *f, const H5O_layout_t *layout, +H5D_compact_readvv(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, const H5D_t *dset, size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_size_arr[], hsize_t dset_offset_arr[], size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_size_arr[], hsize_t mem_offset_arr[], - hid_t UNUSED dxpl_id, void *buf) + void *buf) { ssize_t ret_value; /* Return value */ - FUNC_ENTER_NOAPI(H5F_compact_readvv, FAIL); + FUNC_ENTER_NOAPI(H5D_compact_readvv, FAIL); + + assert(dset); /* Use the vectorized memory copy routine to do actual work */ - if((ret_value=H5V_memcpyvv(buf,mem_max_nseq,mem_curr_seq,mem_size_arr,mem_offset_arr,layout->u.compact.buf,dset_max_nseq,dset_curr_seq,dset_size_arr,dset_offset_arr))<0) + if((ret_value=H5V_memcpyvv(buf,mem_max_nseq,mem_curr_seq,mem_size_arr,mem_offset_arr,dset->layout.u.compact.buf,dset_max_nseq,dset_curr_seq,dset_size_arr,dset_offset_arr))<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "vectorized memcpy failed"); done: FUNC_LEAVE_NOAPI(ret_value); -} /* end H5F_compact_readvv() */ +} /* end H5D_compact_readvv() */ /*------------------------------------------------------------------------- - * Function: H5F_compact_writevv + * Function: H5D_compact_writevv * * Purpose: Writes some data vectors from a dataset into a buffer. * The data is in compact dataset. The address is relative @@ -102,22 +105,23 @@ done: *------------------------------------------------------------------------- */ ssize_t -H5F_compact_writevv(H5F_t UNUSED *f, H5O_layout_t *layout, +H5D_compact_writevv(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, H5D_t *dset, size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_size_arr[], hsize_t dset_offset_arr[], size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_size_arr[], hsize_t mem_offset_arr[], - hid_t UNUSED dxpl_id, const void *buf) + const void *buf) { ssize_t ret_value; /* Return value */ - FUNC_ENTER_NOAPI(H5F_compact_writevv, FAIL); + FUNC_ENTER_NOAPI(H5D_compact_writevv, FAIL); + + assert(dset); /* Use the vectorized memory copy routine to do actual work */ - if((ret_value=H5V_memcpyvv(layout->u.compact.buf,dset_max_nseq,dset_curr_seq,dset_size_arr,dset_offset_arr,buf,mem_max_nseq,mem_curr_seq,mem_size_arr,mem_offset_arr))<0) + if((ret_value=H5V_memcpyvv(dset->layout.u.compact.buf,dset_max_nseq,dset_curr_seq,dset_size_arr,dset_offset_arr,buf,mem_max_nseq,mem_curr_seq,mem_size_arr,mem_offset_arr))<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "vectorized memcpy failed"); - layout->u.compact.dirty = TRUE; + dset->layout.u.compact.dirty = TRUE; done: FUNC_LEAVE_NOAPI(ret_value); -} /* end H5F_compact_writevv() */ - +} /* end H5D_compact_writevv() */ diff --git a/src/H5Fcontig.c b/src/H5Fcontig.c index 1255922..3e0c163 100644 --- a/src/H5Fcontig.c +++ b/src/H5Fcontig.c @@ -18,20 +18,20 @@ * * Purpose: * Contiguous dataset I/O functions. These routines are similar to - * the H5F_istore_* routines and really only an abstract way of dealing - * with the data sieve buffer from H5F_seg_read/write. + * the H5D_istore_* routines and really only an abstract way of dealing + * with the data sieve buffer from H5F_seq_read/write. */ -#define H5F_PACKAGE /*suppress error about including H5Fpkg */ +#define H5D_PACKAGE /*suppress error about including H5Dpkg */ /* Pablo information */ /* (Put before include files to avoid problems with inline functions) */ -#define PABLO_MASK H5Fcontig_mask +#define PABLO_MASK H5Dcontig_mask #include "H5private.h" /* Generic Functions */ -#include "H5Dprivate.h" /* Dataset functions */ +#include "H5Dpkg.h" /* Dataset functions */ #include "H5Eprivate.h" /* Error handling */ -#include "H5Fpkg.h" /* Files */ +#include "H5Fprivate.h" /* Files */ #include "H5FDprivate.h" /* File drivers */ #include "H5FLprivate.h" /* Free Lists */ #include "H5MFprivate.h" /* File memory management */ @@ -41,8 +41,8 @@ #include "H5Vprivate.h" /* Vector and array functions */ /* Private prototypes */ -static herr_t H5F_contig_write(H5F_t *f, hsize_t max_data, haddr_t addr, - const size_t size, hid_t dxpl_id, const void *buf); +static herr_t H5D_contig_write(H5F_t *f, hid_t dxpl_id, H5D_t *dset, + hsize_t offset, size_t size, const void *buf); /* Interface initialization */ static int interface_initialize_g = 0; @@ -59,7 +59,7 @@ H5FL_BLK_DEFINE_STATIC(zero_fill); /*------------------------------------------------------------------------- - * Function: H5F_contig_create + * Function: H5D_contig_create * * Purpose: Allocate file space for a contiguously stored dataset * @@ -73,27 +73,27 @@ H5FL_BLK_DEFINE_STATIC(zero_fill); *------------------------------------------------------------------------- */ herr_t -H5F_contig_create(H5F_t *f, hid_t dxpl_id, struct H5O_layout_t *layout) +H5D_contig_create(H5F_t *f, hid_t dxpl_id, H5D_t *dset) { herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_contig_create, FAIL); + FUNC_ENTER_NOAPI(H5D_contig_create, FAIL); /* check args */ assert(f); - assert(layout); + assert(dset); /* Allocate space for the contiguous data */ - if (HADDR_UNDEF==(layout->u.contig.addr=H5MF_alloc(f, H5FD_MEM_DRAW, dxpl_id, layout->u.contig.size))) + if (HADDR_UNDEF==(dset->layout.u.contig.addr=H5MF_alloc(f, H5FD_MEM_DRAW, dxpl_id, dset->layout.u.contig.size))) HGOTO_ERROR (H5E_IO, H5E_NOSPACE, FAIL, "unable to reserve file space"); done: FUNC_LEAVE_NOAPI(ret_value); -} /* end H5F_contig_create */ +} /* end H5D_contig_create */ /*------------------------------------------------------------------------- - * Function: H5F_contig_fill + * Function: H5D_contig_fill * * Purpose: Write fill values to a contiguously stored dataset. * @@ -110,16 +110,15 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_contig_fill(H5F_t *f, hid_t dxpl_id, struct H5O_layout_t *layout, - const struct H5S_t *space, - const struct H5O_fill_t *fill, size_t elmt_size) +H5D_contig_fill(H5F_t *f, hid_t dxpl_id, H5D_t *dset) { hssize_t snpoints; /* Number of points in space (for error checking) */ size_t npoints; /* Number of points in space */ size_t ptsperbuf; /* Maximum # of points which fit in the buffer */ + size_t elmt_size; /* Size of each element */ size_t bufsize=64*1024; /* Size of buffer to write */ size_t size; /* Current # of points to write */ - haddr_t addr; /* Offset of dataset */ + hsize_t offset; /* Offset of dataset */ void *buf = NULL; /* Buffer for fill value writing */ #ifdef H5_HAVE_PARALLEL MPI_Comm mpi_comm=MPI_COMM_NULL; /* MPI communicator for file */ @@ -131,26 +130,25 @@ H5F_contig_fill(H5F_t *f, hid_t dxpl_id, struct H5O_layout_t *layout, int non_zero_fill_f=(-1); /* Indicate that a non-zero fill-value was used */ herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_contig_fill, FAIL); + FUNC_ENTER_NOAPI(H5D_contig_fill, FAIL); /* Check args */ assert(f); assert(TRUE==H5P_isa_class(dxpl_id,H5P_DATASET_XFER)); - assert(layout && H5D_CONTIGUOUS==layout->type); - assert(H5F_addr_defined(layout->u.contig.addr)); - assert(layout->u.contig.size>0); - assert(space); - assert(elmt_size>0); + assert(dset && H5D_CONTIGUOUS==dset->layout.type); + assert(H5F_addr_defined(dset->layout.u.contig.addr)); + assert(dset->layout.u.contig.size>0); + assert(dset->space); #ifdef H5_HAVE_PARALLEL /* Retrieve MPI parameters */ if(IS_H5FD_MPI(f)) { /* Get the MPI communicator */ - if (MPI_COMM_NULL == (mpi_comm=H5FD_mpi_get_comm(f->shared->lf))) + if (MPI_COMM_NULL == (mpi_comm=H5F_mpi_get_comm(f))) HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "Can't retrieve MPI communicator"); /* Get the MPI rank & size */ - if ((mpi_rank=H5FD_mpi_get_rank(f->shared->lf))<0) + if ((mpi_rank=H5F_mpi_get_rank(f))<0) HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "Can't retrieve MPI rank"); /* Set the MPI-capable file driver flag */ @@ -158,14 +156,18 @@ H5F_contig_fill(H5F_t *f, hid_t dxpl_id, struct H5O_layout_t *layout, } /* end if */ #endif /* H5_HAVE_PARALLEL */ + /* Get size of elements */ + elmt_size=H5T_get_size(dset->type); + assert(elmt_size>0); + /* Get the number of elements in the dataset's dataspace */ - snpoints = H5S_GET_SIMPLE_EXTENT_NPOINTS(space); + snpoints = H5S_GET_SIMPLE_EXTENT_NPOINTS(dset->space); assert(snpoints>=0); H5_ASSIGN_OVERFLOW(npoints,snpoints,hssize_t,size_t); /* If fill value is not library default, use it to set the element size */ - if(fill->buf) - elmt_size=fill->size; + if(dset->fill.buf) + elmt_size=dset->fill.size; /* * Fill the entire current extent with the fill value. We can do @@ -176,12 +178,12 @@ H5F_contig_fill(H5F_t *f, hid_t dxpl_id, struct H5O_layout_t *layout, bufsize = ptsperbuf*elmt_size; /* Fill the buffer with the user's fill value */ - if(fill->buf) { + if(dset->fill.buf) { /* Allocate temporary buffer */ if ((buf=H5FL_BLK_MALLOC(non_zero_fill,bufsize))==NULL) HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for fill buffer"); - H5V_array_fill(buf, fill->buf, elmt_size, ptsperbuf); + H5V_array_fill(buf, dset->fill.buf, elmt_size, ptsperbuf); /* Indicate that a non-zero fill buffer was used */ non_zero_fill_f=1; @@ -206,7 +208,7 @@ H5F_contig_fill(H5F_t *f, hid_t dxpl_id, struct H5O_layout_t *layout, } /* end else */ /* Start at the beginning of the dataset */ - addr = layout->u.contig.addr; + offset = 0; /* Loop through writing the fill value to the dataset */ while (npoints>0) { @@ -218,7 +220,7 @@ H5F_contig_fill(H5F_t *f, hid_t dxpl_id, struct H5O_layout_t *layout, /* Write the chunks out from only one process */ /* !! Use the internal "independent" DXPL!! -QAK */ if(H5_PAR_META_WRITE==mpi_rank) { - if (H5F_contig_write(f, (hsize_t)size, addr, size, H5AC_ind_dxpl_id, buf)<0) + if (H5D_contig_write(f, H5AC_ind_dxpl_id, dset, offset, size, buf)<0) HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to write fill value to dataset"); } /* end if */ @@ -228,14 +230,14 @@ H5F_contig_fill(H5F_t *f, hid_t dxpl_id, struct H5O_layout_t *layout, else { #endif /* H5_HAVE_PARALLEL */ H5_CHECK_OVERFLOW(size,size_t,hsize_t); - if (H5F_contig_write(f, (hsize_t)size, addr, size, dxpl_id, buf)<0) + if (H5D_contig_write(f, dxpl_id, dset, offset, size, buf)<0) HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to write fill value to dataset"); #ifdef H5_HAVE_PARALLEL } /* end else */ #endif /* H5_HAVE_PARALLEL */ npoints -= MIN(ptsperbuf, npoints); - addr += size; + offset += size; } /* end while */ #ifdef H5_HAVE_PARALLEL @@ -262,11 +264,11 @@ done: } /* end if */ FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_contig_fill() */ /*------------------------------------------------------------------------- - * Function: H5F_contig_delete + * Function: H5D_contig_delete * * Purpose: Delete the file space for a contiguously stored dataset * @@ -280,31 +282,60 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_contig_delete(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout) +H5D_contig_delete(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout) { herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_contig_delete, FAIL); + FUNC_ENTER_NOAPI(H5D_contig_delete, FAIL); /* check args */ assert(f); assert(layout); - /* Check for overlap with the sieve buffer and reset it */ - if (H5F_sieve_overlap_clear(f, dxpl_id, layout->u.contig.addr, layout->u.contig.size)<0) - HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to clear sieve buffer"); - /* Free the file space for the chunk */ if (H5MF_xfree(f, H5FD_MEM_DRAW, dxpl_id, layout->u.contig.addr, layout->u.contig.size)<0) HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free object header"); done: FUNC_LEAVE_NOAPI(ret_value); -} /* end H5F_contig_delete */ +} /* end H5D_contig_delete */ + + +/*------------------------------------------------------------------------- + * Function: H5D_contig_get_addr + * + * Purpose: Get the offset of the contiguous data on disk + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * June 2, 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +haddr_t +H5D_contig_get_addr(const H5D_t *dset) +{ + haddr_t ret_value; /* Return value */ + + FUNC_ENTER_NOAPI(H5D_contig_get_addr, HADDR_UNDEF); + + /* check args */ + assert(dset); + assert(dset->layout.type==H5D_CONTIGUOUS); + + /* Get the address */ + ret_value=dset->layout.u.contig.addr; + +done: + FUNC_LEAVE_NOAPI(ret_value); +} /* end H5D_contig_get_addr */ /*------------------------------------------------------------------------- - * Function: H5F_contig_write + * Function: H5D_contig_write * * Purpose: Writes some data from a dataset into a buffer. * The data is contiguous. The address is relative to the base @@ -321,32 +352,34 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5F_contig_write(H5F_t *f, hsize_t max_data, haddr_t addr, - const size_t size, hid_t dxpl_id, const void *buf) +H5D_contig_write(H5F_t *f, hid_t dxpl_id, H5D_t *dset, + hsize_t offset, size_t size, const void *buf) { - hsize_t dset_off=0; /* Offset in dataset */ - hsize_t mem_off=0; /* Offset in memory */ + hsize_t dset_off=offset; /* Offset in dataset */ size_t dset_len=size; /* Length in dataset */ + size_t dset_curr_seq=0; /* "Current sequence" in dataset */ + hsize_t mem_off=0; /* Offset in memory */ size_t mem_len=size; /* Length in memory */ size_t mem_curr_seq=0; /* "Current sequence" in memory */ - size_t dset_curr_seq=0; /* "Current sequence" in dataset */ herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_contig_write, FAIL); + FUNC_ENTER_NOAPI(H5D_contig_write, FAIL); assert (f); + assert (dset); assert (buf); - if (H5F_contig_writevv(f, max_data, addr, 1, &dset_curr_seq, &dset_len, &dset_off, 1, &mem_curr_seq, &mem_len, &mem_off, dxpl_id, buf)<0) + if (H5D_contig_writevv(f, dxpl_id, dset, dset->layout.u.contig.addr, dset->layout.u.contig.size, + 1, &dset_curr_seq, &dset_len, &dset_off, 1, &mem_curr_seq, &mem_len, &mem_off, buf)<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "vector write failed"); done: FUNC_LEAVE_NOAPI(ret_value); -} /* end H5F_contig_write() */ +} /* end H5D_contig_write() */ /*------------------------------------------------------------------------- - * Function: H5F_contig_readvv + * Function: H5D_contig_readvv * * Purpose: Reads some data vectors from a dataset into a buffer. * The data is contiguous. The address is the start of the dataset, @@ -366,10 +399,11 @@ done: *------------------------------------------------------------------------- */ ssize_t -H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, +H5D_contig_readvv(H5F_t *f, hid_t dxpl_id, H5D_t *dset, + haddr_t dset_addr, hsize_t dset_size, size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[], size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], - hid_t dxpl_id, void *_buf) + void *_buf) { unsigned char *buf=(unsigned char *)_buf; /* Pointer to buffer to fill */ haddr_t abs_eoa; /* Absolute end of file address */ @@ -381,14 +415,15 @@ H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, size_t v; /* Counting variable */ ssize_t ret_value=0; /* Return value */ - FUNC_ENTER_NOAPI(H5F_contig_readvv, FAIL); + FUNC_ENTER_NOAPI(H5D_contig_readvv, FAIL); /* Check args */ assert(f); + assert(dset); assert(buf); /* Check if data sieving is enabled */ - if(f->shared->lf->feature_flags&H5FD_FEAT_DATA_SIEVE) { + if(H5F_HAS_FEATURE(f,H5FD_FEAT_DATA_SIEVE)) { haddr_t sieve_start, sieve_end; /* Start & end locations of sieve buffer */ haddr_t contig_end; /* End locations of block to write */ size_t sieve_size; /* size of sieve buffer */ @@ -398,7 +433,7 @@ H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, v=*mem_curr_seq; /* No data sieve buffer yet, go allocate one */ - if(f->shared->sieve_buf==NULL) { + if(dset->cache.contig.sieve_buf==NULL) { /* Choose smallest buffer to write */ if(mem_len_arr[v]f->shared->sieve_buf_size) { + if(size>dset->cache.contig.sieve_buf_size) { if (H5F_block_read(f, H5FD_MEM_DRAW, addr, size, dxpl_id, buf)<0) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "block read failed"); } /* end if */ else { /* Allocate room for the data sieve buffer */ - if (NULL==(f->shared->sieve_buf=H5FL_BLK_MALLOC(sieve_buf,f->shared->sieve_buf_size))) + if (NULL==(dset->cache.contig.sieve_buf=H5FL_BLK_MALLOC(sieve_buf,dset->cache.contig.sieve_buf_size))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed"); /* Determine the new sieve buffer size & location */ - f->shared->sieve_loc=addr; + dset->cache.contig.sieve_loc=addr; /* Make certain we don't read off the end of the file */ - if (HADDR_UNDEF==(abs_eoa=H5FD_get_eoa(f->shared->lf))) + if (HADDR_UNDEF==(abs_eoa=H5F_get_eoa(f))) HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to determine file size"); /* Adjust absolute EOA address to relative EOA address */ - rel_eoa=abs_eoa-f->shared->base_addr; + rel_eoa=abs_eoa-H5F_get_base_addr(f); /* Compute the size of the sieve buffer */ - H5_ASSIGN_OVERFLOW(f->shared->sieve_size,MIN(rel_eoa-f->shared->sieve_loc,MIN(max_data,f->shared->sieve_buf_size)),hsize_t,size_t); + H5_ASSIGN_OVERFLOW(dset->cache.contig.sieve_size,MIN3(rel_eoa-dset->cache.contig.sieve_loc,max_data,dset->cache.contig.sieve_buf_size),hsize_t,size_t); /* Read the new sieve buffer */ - if (H5F_block_read(f, H5FD_MEM_DRAW, f->shared->sieve_loc, f->shared->sieve_size, dxpl_id, f->shared->sieve_buf)<0) + if (H5F_block_read(f, H5FD_MEM_DRAW, dset->cache.contig.sieve_loc, dset->cache.contig.sieve_size, dxpl_id, dset->cache.contig.sieve_buf)<0) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "block read failed"); /* Grab the data out of the buffer (must be first piece of data in buffer ) */ - HDmemcpy(buf,f->shared->sieve_buf,size); + HDmemcpy(buf,dset->cache.contig.sieve_buf,size); /* Reset sieve buffer dirty flag */ - f->shared->sieve_dirty=0; + dset->cache.contig.sieve_dirty=0; } /* end else */ /* Update memory information */ @@ -465,8 +500,8 @@ H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, } /* end if */ /* Stash local copies of these value */ - sieve_start=f->shared->sieve_loc; - sieve_size=f->shared->sieve_size; + sieve_start=dset->cache.contig.sieve_loc; + sieve_size=dset->cache.contig.sieve_size; sieve_end=sieve_start+sieve_size; /* Works through sequences as fast as possible */ @@ -478,7 +513,7 @@ H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, size=dset_len_arr[u]; /* Compute offset on disk */ - addr=_addr+dset_offset_arr[u]; + addr=dset_addr+dset_offset_arr[u]; /* Compute offset in memory */ buf = (unsigned char *)_buf + mem_offset_arr[v]; @@ -488,7 +523,7 @@ H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, /* If entire read is within the sieve buffer, read it from the buffer */ if(addr>=sieve_start && contig_endshared->sieve_buf+(addr-sieve_start); + unsigned char *base_sieve_buf=dset->cache.contig.sieve_buf+(addr-sieve_start); /* Grab the data out of the buffer */ HDmemcpy(buf,base_sieve_buf,size); @@ -496,18 +531,18 @@ H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, /* Entire request is not within this data sieve buffer */ else { /* Check if we can actually hold the I/O request in the sieve buffer */ - if(size>f->shared->sieve_buf_size) { + if(size>dset->cache.contig.sieve_buf_size) { /* Check for any overlap with the current sieve buffer */ if((sieve_start>=addr && sieve_start<(contig_end+1)) || ((sieve_end-1)>=addr && (sieve_end-1)<(contig_end+1))) { /* Flush the sieve buffer, if it's dirty */ - if(f->shared->sieve_dirty) { + if(dset->cache.contig.sieve_dirty) { /* Write to file */ - if (H5F_block_write(f, H5FD_MEM_DRAW, sieve_start, sieve_size, dxpl_id, f->shared->sieve_buf)<0) + if (H5F_block_write(f, H5FD_MEM_DRAW, sieve_start, sieve_size, dxpl_id, dset->cache.contig.sieve_buf)<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "block write failed"); /* Reset sieve buffer dirty flag */ - f->shared->sieve_dirty=0; + dset->cache.contig.sieve_dirty=0; } /* end if */ } /* end if */ @@ -518,46 +553,46 @@ H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, /* Element size fits within the buffer size */ else { /* Flush the sieve buffer if it's dirty */ - if(f->shared->sieve_dirty) { + if(dset->cache.contig.sieve_dirty) { /* Write to file */ - if (H5F_block_write(f, H5FD_MEM_DRAW, sieve_start, sieve_size, dxpl_id, f->shared->sieve_buf)<0) + if (H5F_block_write(f, H5FD_MEM_DRAW, sieve_start, sieve_size, dxpl_id, dset->cache.contig.sieve_buf)<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "block write failed"); /* Reset sieve buffer dirty flag */ - f->shared->sieve_dirty=0; + dset->cache.contig.sieve_dirty=0; } /* end if */ /* Determine the new sieve buffer size & location */ - f->shared->sieve_loc=addr; + dset->cache.contig.sieve_loc=addr; /* Make certain we don't read off the end of the file */ - if (HADDR_UNDEF==(abs_eoa=H5FD_get_eoa(f->shared->lf))) + if (HADDR_UNDEF==(abs_eoa=H5F_get_eoa(f))) HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to determine file size"); /* Adjust absolute EOA address to relative EOA address */ - rel_eoa=abs_eoa-f->shared->base_addr; + rel_eoa=abs_eoa-H5F_get_base_addr(f); /* Only need this when resizing sieve buffer */ - max_data=_max_data-dset_offset_arr[u]; + max_data=dset_size-dset_offset_arr[u]; /* Compute the size of the sieve buffer */ /* Don't read off the end of the file, don't read past the end of the data element and don't read more than the buffer size */ - H5_ASSIGN_OVERFLOW(f->shared->sieve_size,MIN(rel_eoa-f->shared->sieve_loc,MIN(max_data,f->shared->sieve_buf_size)),hsize_t,size_t); + H5_ASSIGN_OVERFLOW(dset->cache.contig.sieve_size,MIN3(rel_eoa-dset->cache.contig.sieve_loc,max_data,dset->cache.contig.sieve_buf_size),hsize_t,size_t); /* Update local copies of sieve information */ - sieve_start=f->shared->sieve_loc; - sieve_size=f->shared->sieve_size; + sieve_start=dset->cache.contig.sieve_loc; + sieve_size=dset->cache.contig.sieve_size; sieve_end=sieve_start+sieve_size; /* Read the new sieve buffer */ - if (H5F_block_read(f, H5FD_MEM_DRAW, f->shared->sieve_loc, f->shared->sieve_size, dxpl_id, f->shared->sieve_buf)<0) + if (H5F_block_read(f, H5FD_MEM_DRAW, dset->cache.contig.sieve_loc, dset->cache.contig.sieve_size, dxpl_id, dset->cache.contig.sieve_buf)<0) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "block read failed"); /* Grab the data out of the buffer (must be first piece of data in buffer ) */ - HDmemcpy(buf,f->shared->sieve_buf,size); + HDmemcpy(buf,dset->cache.contig.sieve_buf,size); /* Reset sieve buffer dirty flag */ - f->shared->sieve_dirty=0; + dset->cache.contig.sieve_dirty=0; } /* end else */ } /* end else */ @@ -587,7 +622,7 @@ H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, size=dset_len_arr[u]; /* Compute offset on disk */ - addr=_addr+dset_offset_arr[u]; + addr=dset_addr+dset_offset_arr[u]; /* Compute offset in memory */ buf = (unsigned char *)_buf + mem_offset_arr[v]; @@ -619,11 +654,11 @@ H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, done: FUNC_LEAVE_NOAPI(ret_value); -} /* end H5F_contig_readvv() */ +} /* end H5D_contig_readvv() */ /*------------------------------------------------------------------------- - * Function: H5F_contig_writevv + * Function: H5D_contig_writevv * * Purpose: Writes some data vectors into a dataset from vectors into a * buffer. The address is the start of the dataset, @@ -643,10 +678,11 @@ done: *------------------------------------------------------------------------- */ ssize_t -H5F_contig_writevv(H5F_t *f, hsize_t _max_data, haddr_t _addr, +H5D_contig_writevv(H5F_t *f, hid_t dxpl_id, H5D_t *dset, + haddr_t dset_addr, hsize_t dset_size, size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[], size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], - hid_t dxpl_id, const void *_buf) + const void *_buf) { const unsigned char *buf=_buf; /* Pointer to buffer to fill */ haddr_t abs_eoa; /* Absolute end of file address */ @@ -658,14 +694,15 @@ H5F_contig_writevv(H5F_t *f, hsize_t _max_data, haddr_t _addr, size_t v; /* Counting variable */ ssize_t ret_value=0; /* Return value */ - FUNC_ENTER_NOAPI(H5F_contig_writevv, FAIL); + FUNC_ENTER_NOAPI(H5D_contig_writevv, FAIL); /* Check args */ assert(f); + assert(dset); assert(buf); /* Check if data sieving is enabled */ - if(f->shared->lf->feature_flags&H5FD_FEAT_DATA_SIEVE) { + if(H5F_HAS_FEATURE(f,H5FD_FEAT_DATA_SIEVE)) { haddr_t sieve_start, sieve_end; /* Start & end locations of sieve buffer */ haddr_t contig_end; /* End locations of block to write */ size_t sieve_size; /* size of sieve buffer */ @@ -675,7 +712,7 @@ H5F_contig_writevv(H5F_t *f, hsize_t _max_data, haddr_t _addr, v=*mem_curr_seq; /* No data sieve buffer yet, go allocate one */ - if(f->shared->sieve_buf==NULL) { + if(dset->cache.contig.sieve_buf==NULL) { /* Choose smallest buffer to write */ if(mem_len_arr[v]f->shared->sieve_buf_size) { + if(size>dset->cache.contig.sieve_buf_size) { if (H5F_block_write(f, H5FD_MEM_DRAW, addr, size, dxpl_id, buf)<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "block write failed"); } /* end if */ else { /* Allocate room for the data sieve buffer */ - if (NULL==(f->shared->sieve_buf=H5FL_BLK_MALLOC(sieve_buf,f->shared->sieve_buf_size))) + if (NULL==(dset->cache.contig.sieve_buf=H5FL_BLK_MALLOC(sieve_buf,dset->cache.contig.sieve_buf_size))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed"); /* Determine the new sieve buffer size & location */ - f->shared->sieve_loc=addr; + dset->cache.contig.sieve_loc=addr; /* Make certain we don't read off the end of the file */ - if (HADDR_UNDEF==(abs_eoa=H5FD_get_eoa(f->shared->lf))) + if (HADDR_UNDEF==(abs_eoa=H5F_get_eoa(f))) HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to determine file size"); /* Adjust absolute EOA address to relative EOA address */ - rel_eoa=abs_eoa-f->shared->base_addr; + rel_eoa=abs_eoa-H5F_get_base_addr(f); /* Compute the size of the sieve buffer */ - H5_ASSIGN_OVERFLOW(f->shared->sieve_size,MIN(rel_eoa-f->shared->sieve_loc,MIN(max_data,f->shared->sieve_buf_size)),hsize_t,size_t); + H5_ASSIGN_OVERFLOW(dset->cache.contig.sieve_size,MIN3(rel_eoa-dset->cache.contig.sieve_loc,max_data,dset->cache.contig.sieve_buf_size),hsize_t,size_t); /* Check if there is any point in reading the data from the file */ - if(f->shared->sieve_size>size) { + if(dset->cache.contig.sieve_size>size) { /* Read the new sieve buffer */ - if (H5F_block_read(f, H5FD_MEM_DRAW, f->shared->sieve_loc, f->shared->sieve_size, dxpl_id, f->shared->sieve_buf)<0) + if (H5F_block_read(f, H5FD_MEM_DRAW, dset->cache.contig.sieve_loc, dset->cache.contig.sieve_size, dxpl_id, dset->cache.contig.sieve_buf)<0) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "block read failed"); } /* end if */ /* Grab the data out of the buffer (must be first piece of data in buffer ) */ - HDmemcpy(f->shared->sieve_buf,buf,size); + HDmemcpy(dset->cache.contig.sieve_buf,buf,size); /* Set sieve buffer dirty flag */ - f->shared->sieve_dirty=1; + dset->cache.contig.sieve_dirty=1; } /* end else */ /* Update memory information */ @@ -745,8 +782,8 @@ H5F_contig_writevv(H5F_t *f, hsize_t _max_data, haddr_t _addr, } /* end if */ /* Stash local copies of these value */ - sieve_start=f->shared->sieve_loc; - sieve_size=f->shared->sieve_size; + sieve_start=dset->cache.contig.sieve_loc; + sieve_size=dset->cache.contig.sieve_size; sieve_end=sieve_start+sieve_size; /* Works through sequences as fast as possible */ @@ -758,7 +795,7 @@ H5F_contig_writevv(H5F_t *f, hsize_t _max_data, haddr_t _addr, size=dset_len_arr[u]; /* Compute offset on disk */ - addr=_addr+dset_offset_arr[u]; + addr=dset_addr+dset_offset_arr[u]; /* Compute offset in memory */ buf = (const unsigned char *)_buf + mem_offset_arr[v]; @@ -768,35 +805,35 @@ H5F_contig_writevv(H5F_t *f, hsize_t _max_data, haddr_t _addr, /* If entire write is within the sieve buffer, write it to the buffer */ if(addr>=sieve_start && contig_endshared->sieve_buf+(addr-sieve_start); + unsigned char *base_sieve_buf=dset->cache.contig.sieve_buf+(addr-sieve_start); /* Put the data into the sieve buffer */ HDmemcpy(base_sieve_buf,buf,size); /* Set sieve buffer dirty flag */ - f->shared->sieve_dirty=1; + dset->cache.contig.sieve_dirty=1; } /* end if */ /* Entire request is not within this data sieve buffer */ else { /* Check if we can actually hold the I/O request in the sieve buffer */ - if(size>f->shared->sieve_buf_size) { + if(size>dset->cache.contig.sieve_buf_size) { /* Check for any overlap with the current sieve buffer */ if((sieve_start>=addr && sieve_start<(contig_end+1)) || ((sieve_end-1)>=addr && (sieve_end-1)<(contig_end+1))) { /* Flush the sieve buffer, if it's dirty */ - if(f->shared->sieve_dirty) { + if(dset->cache.contig.sieve_dirty) { /* Write to file */ - if (H5F_block_write(f, H5FD_MEM_DRAW, sieve_start, sieve_size, dxpl_id, f->shared->sieve_buf)<0) + if (H5F_block_write(f, H5FD_MEM_DRAW, sieve_start, sieve_size, dxpl_id, dset->cache.contig.sieve_buf)<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "block write failed"); /* Reset sieve buffer dirty flag */ - f->shared->sieve_dirty=0; + dset->cache.contig.sieve_dirty=0; } /* end if */ /* Force the sieve buffer to be re-read the next time */ - f->shared->sieve_loc=HADDR_UNDEF; - f->shared->sieve_size=0; + dset->cache.contig.sieve_loc=HADDR_UNDEF; + dset->cache.contig.sieve_size=0; } /* end if */ /* Write directly from the user's buffer */ @@ -807,81 +844,81 @@ H5F_contig_writevv(H5F_t *f, hsize_t _max_data, haddr_t _addr, else { /* Check if it is possible to (exactly) prepend or append to existing (dirty) sieve buffer */ if(((addr+size)==sieve_start || addr==sieve_end) && - (size+sieve_size)<=f->shared->sieve_buf_size && - f->shared->sieve_dirty) { + (size+sieve_size)<=dset->cache.contig.sieve_buf_size && + dset->cache.contig.sieve_dirty) { /* Prepend to existing sieve buffer */ if((addr+size)==sieve_start) { /* Move existing sieve information to correct location */ - HDmemmove(f->shared->sieve_buf+size,f->shared->sieve_buf,sieve_size); + HDmemmove(dset->cache.contig.sieve_buf+size,dset->cache.contig.sieve_buf,sieve_size); /* Copy in new information (must be first in sieve buffer) */ - HDmemcpy(f->shared->sieve_buf,buf,size); + HDmemcpy(dset->cache.contig.sieve_buf,buf,size); /* Adjust sieve location */ - f->shared->sieve_loc=addr; + dset->cache.contig.sieve_loc=addr; } /* end if */ /* Append to existing sieve buffer */ else { /* Copy in new information */ - HDmemcpy(f->shared->sieve_buf+sieve_size,buf,size); + HDmemcpy(dset->cache.contig.sieve_buf+sieve_size,buf,size); } /* end else */ /* Adjust sieve size */ - f->shared->sieve_size += size; + dset->cache.contig.sieve_size += size; /* Update local copies of sieve information */ - sieve_start=f->shared->sieve_loc; - sieve_size=f->shared->sieve_size; + sieve_start=dset->cache.contig.sieve_loc; + sieve_size=dset->cache.contig.sieve_size; sieve_end=sieve_start+sieve_size; } /* end if */ /* Can't add the new data onto the existing sieve buffer */ else { /* Flush the sieve buffer if it's dirty */ - if(f->shared->sieve_dirty) { + if(dset->cache.contig.sieve_dirty) { /* Write to file */ - if (H5F_block_write(f, H5FD_MEM_DRAW, sieve_start, sieve_size, dxpl_id, f->shared->sieve_buf)<0) + if (H5F_block_write(f, H5FD_MEM_DRAW, sieve_start, sieve_size, dxpl_id, dset->cache.contig.sieve_buf)<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "block write failed"); /* Reset sieve buffer dirty flag */ - f->shared->sieve_dirty=0; + dset->cache.contig.sieve_dirty=0; } /* end if */ /* Determine the new sieve buffer size & location */ - f->shared->sieve_loc=addr; + dset->cache.contig.sieve_loc=addr; /* Make certain we don't read off the end of the file */ - if (HADDR_UNDEF==(abs_eoa=H5FD_get_eoa(f->shared->lf))) + if (HADDR_UNDEF==(abs_eoa=H5F_get_eoa(f))) HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to determine file size"); /* Adjust absolute EOA address to relative EOA address */ - rel_eoa=abs_eoa-f->shared->base_addr; + rel_eoa=abs_eoa-H5F_get_base_addr(f); /* Only need this when resizing sieve buffer */ - max_data=_max_data-dset_offset_arr[u]; + max_data=dset_size-dset_offset_arr[u]; /* Compute the size of the sieve buffer */ /* Don't read off the end of the file, don't read past the end of the data element and don't read more than the buffer size */ - H5_ASSIGN_OVERFLOW(f->shared->sieve_size,MIN(rel_eoa-f->shared->sieve_loc,MIN(max_data,f->shared->sieve_buf_size)),hsize_t,size_t); + H5_ASSIGN_OVERFLOW(dset->cache.contig.sieve_size,MIN3(rel_eoa-dset->cache.contig.sieve_loc,max_data,dset->cache.contig.sieve_buf_size),hsize_t,size_t); /* Update local copies of sieve information */ - sieve_start=f->shared->sieve_loc; - sieve_size=f->shared->sieve_size; + sieve_start=dset->cache.contig.sieve_loc; + sieve_size=dset->cache.contig.sieve_size; sieve_end=sieve_start+sieve_size; /* Check if there is any point in reading the data from the file */ - if(f->shared->sieve_size>size) { + if(dset->cache.contig.sieve_size>size) { /* Read the new sieve buffer */ - if (H5F_block_read(f, H5FD_MEM_DRAW, f->shared->sieve_loc, f->shared->sieve_size, dxpl_id, f->shared->sieve_buf)<0) + if (H5F_block_read(f, H5FD_MEM_DRAW, dset->cache.contig.sieve_loc, dset->cache.contig.sieve_size, dxpl_id, dset->cache.contig.sieve_buf)<0) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "block read failed"); } /* end if */ /* Grab the data out of the buffer (must be first piece of data in buffer ) */ - HDmemcpy(f->shared->sieve_buf,buf,size); + HDmemcpy(dset->cache.contig.sieve_buf,buf,size); /* Set sieve buffer dirty flag */ - f->shared->sieve_dirty=1; + dset->cache.contig.sieve_dirty=1; } /* end else */ } /* end else */ @@ -913,7 +950,7 @@ H5F_contig_writevv(H5F_t *f, hsize_t _max_data, haddr_t _addr, size=dset_len_arr[u]; /* Compute offset on disk */ - addr=_addr+dset_offset_arr[u]; + addr=dset_addr+dset_offset_arr[u]; /* Compute offset in memory */ buf = (const unsigned char *)_buf + mem_offset_arr[v]; @@ -945,5 +982,5 @@ H5F_contig_writevv(H5F_t *f, hsize_t _max_data, haddr_t _addr, done: FUNC_LEAVE_NOAPI(ret_value); -} /* end H5F_contig_writevv() */ +} /* end H5D_contig_writevv() */ diff --git a/src/H5Fistore.c b/src/H5Fistore.c index a5aeb70..032a776 100644 --- a/src/H5Fistore.c +++ b/src/H5Fistore.c @@ -41,17 +41,17 @@ */ #define H5B_PACKAGE /*suppress error about including H5Bpkg */ -#define H5F_PACKAGE /*suppress error about including H5Fpkg */ +#define H5D_PACKAGE /*suppress error about including H5Dpkg */ /* Pablo information */ /* (Put before include files to avoid problems with inline functions) */ -#define PABLO_MASK H5Fistore_mask +#define PABLO_MASK H5Distore_mask #include "H5private.h" /* Generic Functions */ #include "H5Bpkg.h" /* B-link trees */ -#include "H5Dprivate.h" /* Datasets */ +#include "H5Dpkg.h" /* Datasets */ #include "H5Eprivate.h" /* Error handling */ -#include "H5Fpkg.h" /* Files */ +#include "H5Fprivate.h" /* Files */ #include "H5FDprivate.h" /* File drivers */ #include "H5FLprivate.h" /* Free Lists */ #include "H5Iprivate.h" /* IDs */ @@ -86,7 +86,7 @@ * and the operating system can also eliminate a read operation. */ -/*#define H5F_ISTORE_DEBUG */ +/*#define H5D_ISTORE_DEBUG */ /* Interface initialization */ static int interface_initialize_g = 0; @@ -96,14 +96,12 @@ static int interface_initialize_g = 0; * Given a B-tree node return the dimensionality of the chunks pointed to by * that node. */ -#define H5F_ISTORE_NDIMS(X) ((int)(((X)->sizeof_rkey-8)/8)) +#define H5D_ISTORE_NDIMS(X) ((int)(((X)->sizeof_rkey-8)/8)) /* Raw data chunks are cached. Each entry in the cache is: */ -typedef struct H5F_rdcc_ent_t { +typedef struct H5D_rdcc_ent_t { hbool_t locked; /*entry is locked in cache */ hbool_t dirty; /*needs to be written to disk? */ - H5O_layout_t layout; /*the layout message */ - H5O_pline_t pline; /*filter pipeline message */ hssize_t offset[H5O_LAYOUT_NDIMS]; /*chunk name */ size_t rd_count; /*bytes remaining to be read */ size_t wr_count; /*bytes remaining to be written */ @@ -111,10 +109,10 @@ typedef struct H5F_rdcc_ent_t { size_t alloc_size; /*amount allocated for the chunk */ uint8_t *chunk; /*the unfiltered chunk data */ unsigned idx; /*index in hash table */ - struct H5F_rdcc_ent_t *next;/*next item in doubly-linked list */ - struct H5F_rdcc_ent_t *prev;/*previous item in doubly-linked list */ -} H5F_rdcc_ent_t; -typedef H5F_rdcc_ent_t *H5F_rdcc_ent_ptr_t; /* For free lists */ + struct H5D_rdcc_ent_t *next;/*next item in doubly-linked list */ + struct H5D_rdcc_ent_t *prev;/*previous item in doubly-linked list */ +} H5D_rdcc_ent_t; +typedef H5D_rdcc_ent_t *H5D_rdcc_ent_ptr_t; /* For free lists */ /* * B-tree key. A key contains the minimum logical N-dimensional address and @@ -130,97 +128,94 @@ typedef H5F_rdcc_ent_t *H5F_rdcc_ent_ptr_t; /* For free lists */ * * The chunk's file address is part of the B-tree and not part of the key. */ -typedef struct H5F_istore_key_t { +typedef struct H5D_istore_key_t { size_t nbytes; /*size of stored data */ hssize_t offset[H5O_LAYOUT_NDIMS]; /*logical offset to start*/ unsigned filter_mask; /*excluded filters */ -} H5F_istore_key_t; +} H5D_istore_key_t; -typedef struct H5F_istore_ud1_t { - H5F_istore_key_t key; /*key values */ +typedef struct H5D_istore_ud1_t { + H5D_istore_key_t key; /*key values */ haddr_t addr; /*file address of chunk */ H5O_layout_t mesg; /*layout message */ hsize_t total_storage; /*output from iterator */ FILE *stream; /*debug output stream */ hsize_t *dims; /*dataset dimensions */ -} H5F_istore_ud1_t; +} H5D_istore_ud1_t; -#define H5F_HASH_DIVISOR 1 /* Attempt to spread out the hashing */ - /* This should be the same size as the alignment of */ - /* of the smallest file format object written to the file. */ -#define H5F_HASH(F,ADDR) H5F_addr_hash((ADDR/H5F_HASH_DIVISOR),(F)->shared->rdcc.nslots) +#define H5D_HASH(D,ADDR) H5F_addr_hash(ADDR,(D)->cache.chunk.nslots) /* Private prototypes */ -static haddr_t H5F_istore_get_addr(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, - const hssize_t offset[], H5F_istore_ud1_t *_udata); -static void *H5F_istore_chunk_alloc(size_t size, const H5O_pline_t *pline); -static void *H5F_istore_chunk_xfree(void *chk, const H5O_pline_t *pline); +static haddr_t H5D_istore_get_addr(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, + const hssize_t offset[], H5D_istore_ud1_t *_udata); +static void *H5D_istore_chunk_alloc(size_t size, const H5O_pline_t *pline); +static void *H5D_istore_chunk_xfree(void *chk, const H5O_pline_t *pline); /* B-tree iterator callbacks */ -static int H5F_istore_iter_allocated(H5F_t *f, hid_t dxpl_id, void *left_key, haddr_t addr, +static int H5D_istore_iter_allocated(H5F_t *f, hid_t dxpl_id, void *left_key, haddr_t addr, void *right_key, void *_udata); -static int H5F_istore_iter_dump(H5F_t *f, hid_t dxpl_id, void *left_key, haddr_t addr, +static int H5D_istore_iter_dump(H5F_t *f, hid_t dxpl_id, void *left_key, haddr_t addr, void *right_key, void *_udata); -static int H5F_istore_prune_extent(H5F_t *f, hid_t dxpl_id, void *_lt_key, haddr_t addr, +static int H5D_istore_prune_extent(H5F_t *f, hid_t dxpl_id, void *_lt_key, haddr_t addr, void *_rt_key, void *_udata); /* B-tree callbacks */ -static size_t H5F_istore_sizeof_rkey(H5F_t *f, const void *_udata); -static herr_t H5F_istore_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t, void *_lt_key, +static size_t H5D_istore_sizeof_rkey(H5F_t *f, const void *_udata); +static herr_t H5D_istore_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t, void *_lt_key, void *_udata, void *_rt_key, haddr_t *addr_p /*out*/); -static int H5F_istore_cmp2(H5F_t *f, hid_t dxpl_id, void *_lt_key, void *_udata, +static int H5D_istore_cmp2(H5F_t *f, hid_t dxpl_id, void *_lt_key, void *_udata, void *_rt_key); -static int H5F_istore_cmp3(H5F_t *f, hid_t dxpl_id, void *_lt_key, void *_udata, +static int H5D_istore_cmp3(H5F_t *f, hid_t dxpl_id, void *_lt_key, void *_udata, void *_rt_key); -static herr_t H5F_istore_found(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_lt_key, +static herr_t H5D_istore_found(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_lt_key, void *_udata, const void *_rt_key); -static H5B_ins_t H5F_istore_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key, +static H5B_ins_t H5D_istore_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key, hbool_t *lt_key_changed, void *_md_key, void *_udata, void *_rt_key, hbool_t *rt_key_changed, haddr_t *new_node/*out*/); -static H5B_ins_t H5F_istore_remove( H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key, +static H5B_ins_t H5D_istore_remove( H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key, hbool_t *lt_key_changed, void *_udata, void *_rt_key, hbool_t *rt_key_changed); -static herr_t H5F_istore_decode_key(H5F_t *f, H5B_t *bt, uint8_t *raw, +static herr_t H5D_istore_decode_key(H5F_t *f, H5B_t *bt, uint8_t *raw, void *_key); -static herr_t H5F_istore_encode_key(H5F_t *f, H5B_t *bt, uint8_t *raw, +static herr_t H5D_istore_encode_key(H5F_t *f, H5B_t *bt, uint8_t *raw, void *_key); -static herr_t H5F_istore_debug_key(FILE *stream, H5F_t *f, hid_t dxpl_id, +static herr_t H5D_istore_debug_key(FILE *stream, H5F_t *f, hid_t dxpl_id, int indent, int fwidth, const void *key, const void *udata); /* inherits B-tree like properties from H5B */ H5B_class_t H5B_ISTORE[1] = {{ H5B_ISTORE_ID, /*id */ - sizeof(H5F_istore_key_t), /*sizeof_nkey */ - H5F_istore_sizeof_rkey, /*get_sizeof_rkey */ - H5F_istore_new_node, /*new */ - H5F_istore_cmp2, /*cmp2 */ - H5F_istore_cmp3, /*cmp3 */ - H5F_istore_found, /*found */ - H5F_istore_insert, /*insert */ + sizeof(H5D_istore_key_t), /*sizeof_nkey */ + H5D_istore_sizeof_rkey, /*get_sizeof_rkey */ + H5D_istore_new_node, /*new */ + H5D_istore_cmp2, /*cmp2 */ + H5D_istore_cmp3, /*cmp3 */ + H5D_istore_found, /*found */ + H5D_istore_insert, /*insert */ FALSE, /*follow min branch? */ FALSE, /*follow max branch? */ - H5F_istore_remove, /*remove */ - H5F_istore_decode_key, /*decode */ - H5F_istore_encode_key, /*encode */ - H5F_istore_debug_key, /*debug */ + H5D_istore_remove, /*remove */ + H5D_istore_decode_key, /*decode */ + H5D_istore_encode_key, /*encode */ + H5D_istore_debug_key, /*debug */ }}; /* Declare a free list to manage H5F_rdcc_ent_t objects */ -H5FL_DEFINE_STATIC(H5F_rdcc_ent_t); +H5FL_DEFINE_STATIC(H5D_rdcc_ent_t); /* Declare a free list to manage the H5F_rdcc_ent_ptr_t sequence information */ -H5FL_SEQ_DEFINE_STATIC(H5F_rdcc_ent_ptr_t); +H5FL_SEQ_DEFINE_STATIC(H5D_rdcc_ent_ptr_t); /* Declare a free list to manage the chunk sequence information */ H5FL_BLK_DEFINE_STATIC(chunk); /*------------------------------------------------------------------------- - * Function: H5F_istore_sizeof_rkey + * Function: H5D_istore_sizeof_rkey * * Purpose: Returns the size of a raw key for the specified UDATA. The * size of the key is dependent on the number of dimensions for @@ -239,13 +234,13 @@ H5FL_BLK_DEFINE_STATIC(chunk); *------------------------------------------------------------------------- */ static size_t -H5F_istore_sizeof_rkey(H5F_t UNUSED *f, const void *_udata) +H5D_istore_sizeof_rkey(H5F_t UNUSED *f, const void *_udata) { - const H5F_istore_ud1_t *udata = (const H5F_istore_ud1_t *) _udata; + const H5D_istore_ud1_t *udata = (const H5D_istore_ud1_t *) _udata; size_t nbytes; /* Use FUNC_ENTER_NOAPI_NOINIT_NOFUNC here to avoid performance issues */ - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_istore_sizeof_rkey); + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5D_istore_sizeof_rkey); assert(udata); assert(udata->mesg.u.chunk.ndims > 0 && udata->mesg.u.chunk.ndims <= H5O_LAYOUT_NDIMS); @@ -255,11 +250,11 @@ H5F_istore_sizeof_rkey(H5F_t UNUSED *f, const void *_udata) udata->mesg.u.chunk.ndims*8; /*dimension indices */ FUNC_LEAVE_NOAPI(nbytes); -} +} /* end H5D_istore_sizeof_rkey() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_decode_key + * Function: H5D_istore_decode_key * * Purpose: Decodes a raw key into a native key for the B-tree * @@ -273,14 +268,14 @@ H5F_istore_sizeof_rkey(H5F_t UNUSED *f, const void *_udata) *------------------------------------------------------------------------- */ static herr_t -H5F_istore_decode_key(H5F_t UNUSED *f, H5B_t *bt, uint8_t *raw, void *_key) +H5D_istore_decode_key(H5F_t UNUSED *f, H5B_t *bt, uint8_t *raw, void *_key) { - H5F_istore_key_t *key = (H5F_istore_key_t *) _key; + H5D_istore_key_t *key = (H5D_istore_key_t *) _key; int i; - int ndims = H5F_ISTORE_NDIMS(bt); + int ndims = H5D_ISTORE_NDIMS(bt); herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_decode_key, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_decode_key, FAIL); /* check args */ assert(f); @@ -297,11 +292,11 @@ H5F_istore_decode_key(H5F_t UNUSED *f, H5B_t *bt, uint8_t *raw, void *_key) done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_decode_key() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_encode_key + * Function: H5D_istore_encode_key * * Purpose: Encode a key from native format to raw format. * @@ -315,14 +310,14 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5F_istore_encode_key(H5F_t UNUSED *f, H5B_t *bt, uint8_t *raw, void *_key) +H5D_istore_encode_key(H5F_t UNUSED *f, H5B_t *bt, uint8_t *raw, void *_key) { - H5F_istore_key_t *key = (H5F_istore_key_t *) _key; - int ndims = H5F_ISTORE_NDIMS(bt); + H5D_istore_key_t *key = (H5D_istore_key_t *) _key; + int ndims = H5D_ISTORE_NDIMS(bt); int i; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_encode_key, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_encode_key, FAIL); /* check args */ assert(f); @@ -339,11 +334,11 @@ H5F_istore_encode_key(H5F_t UNUSED *f, H5B_t *bt, uint8_t *raw, void *_key) done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_encode_key() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_debug_key + * Function: H5D_istore_debug_key * * Purpose: Prints a key. * @@ -357,15 +352,15 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5F_istore_debug_key (FILE *stream, H5F_t UNUSED *f, hid_t UNUSED dxpl_id, int indent, int fwidth, +H5D_istore_debug_key (FILE *stream, H5F_t UNUSED *f, hid_t UNUSED dxpl_id, int indent, int fwidth, const void *_key, const void *_udata) { - const H5F_istore_key_t *key = (const H5F_istore_key_t *)_key; - const H5F_istore_ud1_t *udata = (const H5F_istore_ud1_t *)_udata; + const H5D_istore_key_t *key = (const H5D_istore_key_t *)_key; + const H5D_istore_ud1_t *udata = (const H5D_istore_ud1_t *)_udata; unsigned u; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_debug_key, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_debug_key, FAIL); assert (key); @@ -381,11 +376,11 @@ H5F_istore_debug_key (FILE *stream, H5F_t UNUSED *f, hid_t UNUSED dxpl_id, int i done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_debug_key() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_cmp2 + * Function: H5D_istore_cmp2 * * Purpose: Compares two keys sort of like strcmp(). The UDATA pointer * is only to supply extra information not carried in the keys @@ -406,15 +401,15 @@ done: *------------------------------------------------------------------------- */ static int -H5F_istore_cmp2(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, void *_udata, +H5D_istore_cmp2(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, void *_udata, void *_rt_key) { - H5F_istore_key_t *lt_key = (H5F_istore_key_t *) _lt_key; - H5F_istore_key_t *rt_key = (H5F_istore_key_t *) _rt_key; - H5F_istore_ud1_t *udata = (H5F_istore_ud1_t *) _udata; + H5D_istore_key_t *lt_key = (H5D_istore_key_t *) _lt_key; + H5D_istore_key_t *rt_key = (H5D_istore_key_t *) _rt_key; + H5D_istore_ud1_t *udata = (H5D_istore_ud1_t *) _udata; int ret_value; - FUNC_ENTER_NOAPI(H5F_istore_cmp2, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_cmp2, FAIL); assert(lt_key); assert(rt_key); @@ -426,11 +421,11 @@ H5F_istore_cmp2(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, void *_uda done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_cmp2() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_cmp3 + * Function: H5D_istore_cmp3 * * Purpose: Compare the requested datum UDATA with the left and right * keys of the B-tree. @@ -459,15 +454,15 @@ done: *------------------------------------------------------------------------- */ static int -H5F_istore_cmp3(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, void *_udata, +H5D_istore_cmp3(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, void *_udata, void *_rt_key) { - H5F_istore_key_t *lt_key = (H5F_istore_key_t *) _lt_key; - H5F_istore_key_t *rt_key = (H5F_istore_key_t *) _rt_key; - H5F_istore_ud1_t *udata = (H5F_istore_ud1_t *) _udata; + H5D_istore_key_t *lt_key = (H5D_istore_key_t *) _lt_key; + H5D_istore_key_t *rt_key = (H5D_istore_key_t *) _rt_key; + H5D_istore_ud1_t *udata = (H5D_istore_ud1_t *) _udata; int ret_value = 0; - FUNC_ENTER_NOAPI(H5F_istore_cmp3, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_cmp3, FAIL); assert(lt_key); assert(rt_key); @@ -484,11 +479,11 @@ H5F_istore_cmp3(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, void *_uda done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_cmp3() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_new_node + * Function: H5D_istore_new_node * * Purpose: Adds a new entry to an i-storage B-tree. We can assume that * the domain represented by UDATA doesn't intersect the domain @@ -508,17 +503,17 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5F_istore_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t op, +H5D_istore_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t op, void *_lt_key, void *_udata, void *_rt_key, haddr_t *addr_p/*out*/) { - H5F_istore_key_t *lt_key = (H5F_istore_key_t *) _lt_key; - H5F_istore_key_t *rt_key = (H5F_istore_key_t *) _rt_key; - H5F_istore_ud1_t *udata = (H5F_istore_ud1_t *) _udata; + H5D_istore_key_t *lt_key = (H5D_istore_key_t *) _lt_key; + H5D_istore_key_t *rt_key = (H5D_istore_key_t *) _rt_key; + H5D_istore_ud1_t *udata = (H5D_istore_ud1_t *) _udata; unsigned u; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_new_node, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_new_node, FAIL); /* check args */ assert(f); @@ -561,11 +556,11 @@ H5F_istore_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t op, done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_new_node() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_found + * Function: H5D_istore_found * * Purpose: This function is called when the B-tree search engine has * found the leaf entry that points to a chunk of storage that @@ -592,15 +587,15 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5F_istore_found(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, const void *_lt_key, +H5D_istore_found(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, const void *_lt_key, void *_udata, const void UNUSED *_rt_key) { - H5F_istore_ud1_t *udata = (H5F_istore_ud1_t *) _udata; - const H5F_istore_key_t *lt_key = (const H5F_istore_key_t *) _lt_key; + H5D_istore_ud1_t *udata = (H5D_istore_ud1_t *) _udata; + const H5D_istore_key_t *lt_key = (const H5D_istore_key_t *) _lt_key; unsigned u; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_found, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_found, FAIL); /* Check arguments */ assert(f); @@ -624,11 +619,11 @@ H5F_istore_found(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, const void done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_found() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_insert + * Function: H5D_istore_insert * * Purpose: This function is called when the B-tree insert engine finds * the node to use to insert new data. The UDATA argument @@ -660,21 +655,21 @@ done: *------------------------------------------------------------------------- */ static H5B_ins_t -H5F_istore_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key, +H5D_istore_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key, hbool_t UNUSED *lt_key_changed, void *_md_key, void *_udata, void *_rt_key, hbool_t UNUSED *rt_key_changed, haddr_t *new_node_p/*out*/) { - H5F_istore_key_t *lt_key = (H5F_istore_key_t *) _lt_key; - H5F_istore_key_t *md_key = (H5F_istore_key_t *) _md_key; - H5F_istore_key_t *rt_key = (H5F_istore_key_t *) _rt_key; - H5F_istore_ud1_t *udata = (H5F_istore_ud1_t *) _udata; + H5D_istore_key_t *lt_key = (H5D_istore_key_t *) _lt_key; + H5D_istore_key_t *md_key = (H5D_istore_key_t *) _md_key; + H5D_istore_key_t *rt_key = (H5D_istore_key_t *) _rt_key; + H5D_istore_ud1_t *udata = (H5D_istore_ud1_t *) _udata; int cmp; unsigned u; H5B_ins_t ret_value; - FUNC_ENTER_NOAPI(H5F_istore_insert, H5B_INS_ERROR); + FUNC_ENTER_NOAPI(H5D_istore_insert, H5B_INS_ERROR); /* check args */ assert(f); @@ -687,7 +682,7 @@ H5F_istore_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key, assert(rt_key_changed); assert(new_node_p); - cmp = H5F_istore_cmp3(f, dxpl_id, lt_key, udata, rt_key); + cmp = H5D_istore_cmp3(f, dxpl_id, lt_key, udata, rt_key); assert(cmp <= 0); if (cmp < 0) { @@ -767,11 +762,11 @@ H5F_istore_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key, done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_insert() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_iter_allocated + * Function: H5D_istore_iter_allocated * * Purpose: Simply counts the number of chunks for a dataset. * @@ -791,22 +786,22 @@ done: *------------------------------------------------------------------------- */ static int -H5F_istore_iter_allocated (H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, haddr_t UNUSED addr, +H5D_istore_iter_allocated (H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, haddr_t UNUSED addr, void UNUSED *_rt_key, void *_udata) { - H5F_istore_ud1_t *bt_udata = (H5F_istore_ud1_t *)_udata; - H5F_istore_key_t *lt_key = (H5F_istore_key_t *)_lt_key; + H5D_istore_ud1_t *bt_udata = (H5D_istore_ud1_t *)_udata; + H5D_istore_key_t *lt_key = (H5D_istore_key_t *)_lt_key; - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_istore_iter_allocated); + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5D_istore_iter_allocated); bt_udata->total_storage += lt_key->nbytes; FUNC_LEAVE_NOAPI(H5B_ITER_CONT); -} /* H5F_istore_iter_allocated() */ +} /* H5D_istore_iter_allocated() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_iter_dump + * Function: H5D_istore_iter_dump * * Purpose: If the UDATA.STREAM member is non-null then debugging * information is written to that stream. @@ -827,14 +822,14 @@ H5F_istore_iter_allocated (H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, *------------------------------------------------------------------------- */ static int -H5F_istore_iter_dump (H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, haddr_t UNUSED addr, +H5D_istore_iter_dump (H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, haddr_t UNUSED addr, void UNUSED *_rt_key, void *_udata) { - H5F_istore_ud1_t *bt_udata = (H5F_istore_ud1_t *)_udata; - H5F_istore_key_t *lt_key = (H5F_istore_key_t *)_lt_key; + H5D_istore_ud1_t *bt_udata = (H5D_istore_ud1_t *)_udata; + H5D_istore_key_t *lt_key = (H5D_istore_key_t *)_lt_key; unsigned u; - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_istore_iter_dump); + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5D_istore_iter_dump); if (bt_udata->stream) { if (0==bt_udata->total_storage) { @@ -855,14 +850,14 @@ H5F_istore_iter_dump (H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, hadd } FUNC_LEAVE_NOAPI(H5B_ITER_CONT); -} /* H5F_istore_iter_dump() */ +} /* H5D_istore_iter_dump() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_init + * Function: H5D_istore_init * - * Purpose: Initialize the raw data chunk cache for a file. This is - * called when the file handle is initialized. + * Purpose: Initialize the raw data chunk cache for a dataset. This is + * called when the dataset is initialized. * * Return: Non-negative on success/Negative on failure * @@ -874,28 +869,29 @@ H5F_istore_iter_dump (H5F_t UNUSED *f, hid_t UNUSED dxpl_id, void *_lt_key, hadd *------------------------------------------------------------------------- */ herr_t -H5F_istore_init (H5F_t *f) +H5D_istore_init (H5F_t *f, H5D_t *dset) { - H5F_rdcc_t *rdcc = &(f->shared->rdcc); + H5D_rdcc_t *rdcc = &(dset->cache.chunk); herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_init, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_init, FAIL); - HDmemset (rdcc, 0, sizeof(H5F_rdcc_t)); - if (f->shared->rdcc_nbytes>0 && f->shared->rdcc_nelmts>0) { - rdcc->nslots = f->shared->rdcc_nelmts; - rdcc->slot = H5FL_SEQ_CALLOC (H5F_rdcc_ent_ptr_t,rdcc->nslots); + HDmemset (rdcc, 0, sizeof(H5D_rdcc_t)); + if (H5F_RDCC_NBYTES(f)>0 && H5F_RDCC_NELMTS(f)>0) { + rdcc->nbytes=H5F_RDCC_NBYTES(f); + rdcc->nslots = H5F_RDCC_NELMTS(f); + rdcc->slot = H5FL_SEQ_CALLOC (H5D_rdcc_ent_ptr_t,rdcc->nslots); if (NULL==rdcc->slot) HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed"); - } + } /* end if */ done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_init() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_flush_entry + * Function: H5D_istore_flush_entry * * Purpose: Writes a chunk to disk. If RESET is non-zero then the * entry is cleared -- it's slightly faster to flush a chunk if @@ -912,8 +908,8 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5F_istore_flush_entry(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, H5F_rdcc_ent_t *ent, hbool_t reset) +H5D_istore_flush_entry(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, + hid_t dxpl_id, H5D_t *dset, H5D_rdcc_ent_t *ent, hbool_t reset) { herr_t ret_value=SUCCEED; /*return value */ unsigned u; /*counters */ @@ -921,7 +917,7 @@ H5F_istore_flush_entry(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, size_t alloc; /*bytes allocated for BUF */ hbool_t point_of_no_return = FALSE; - FUNC_ENTER_NOAPI_NOINIT(H5F_istore_flush_entry); + FUNC_ENTER_NOAPI_NOINIT(H5D_istore_flush_entry); assert(f); assert(ent); @@ -929,18 +925,18 @@ H5F_istore_flush_entry(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, buf = ent->chunk; if (ent->dirty) { - H5F_istore_ud1_t udata; /*pass through B-tree */ + H5D_istore_ud1_t udata; /*pass through B-tree */ - udata.mesg = ent->layout; + udata.mesg = dset->layout; udata.key.filter_mask = 0; udata.addr = HADDR_UNDEF; udata.key.nbytes = ent->chunk_size; - for (u=0; ulayout.u.chunk.ndims; u++) + for (u=0; ulayout.u.chunk.ndims; u++) udata.key.offset[u] = ent->offset[u]; alloc = ent->alloc_size; /* Should the chunk be filtered before writing it to disk? */ - if (ent->pline.nused) { + if (dset->dcpl_cache.pline.nused) { if (!reset) { /* * Copy the chunk to a new buffer before running it through @@ -962,36 +958,33 @@ H5F_istore_flush_entry(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, point_of_no_return = TRUE; ent->chunk = NULL; } - if (H5Z_pipeline(&ent->pline, 0, &(udata.key.filter_mask), dxpl_cache->err_detect, - dxpl_cache->filter_cb, &(udata.key.nbytes), &alloc, &buf)<0) { - HGOTO_ERROR(H5E_PLINE, H5E_WRITEERROR, FAIL, - "output pipeline failed"); - } + if (H5Z_pipeline(&(dset->dcpl_cache.pline), 0, &(udata.key.filter_mask), dxpl_cache->err_detect, + dxpl_cache->filter_cb, &(udata.key.nbytes), &alloc, &buf)<0) + HGOTO_ERROR(H5E_PLINE, H5E_WRITEERROR, FAIL, "output pipeline failed") } /* * Create the chunk it if it doesn't exist, or reallocate the chunk if * its size changed. Then write the data into the file. */ - if (H5B_insert(f, dxpl_id, H5B_ISTORE, ent->layout.u.chunk.addr, &udata)<0) + if (H5B_insert(f, dxpl_id, H5B_ISTORE, dset->layout.u.chunk.addr, &udata)<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to allocate chunk"); if (H5F_block_write(f, H5FD_MEM_DRAW, udata.addr, udata.key.nbytes, dxpl_id, buf)<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to write raw data to file"); /* Mark cache entry as clean */ ent->dirty = FALSE; - f->shared->rdcc.nflushes++; - } + dset->cache.chunk.nflushes++; + } /* end if */ /* Reset, but do not free or removed from list */ if (reset) { point_of_no_return = FALSE; - H5O_reset(H5O_LAYOUT_ID, &ent->layout); - if (buf==ent->chunk) buf = NULL; + if(buf==ent->chunk) + buf = NULL; if(ent->chunk!=NULL) - ent->chunk = H5F_istore_chunk_xfree(ent->chunk,&ent->pline); - H5O_reset(H5O_PLINE_ID, &ent->pline); - } + ent->chunk = H5D_istore_chunk_xfree(ent->chunk,&(dset->dcpl_cache.pline)); + } /* end if */ done: /* Free the temp buffer only if it's different than the entry chunk */ @@ -1005,17 +998,16 @@ done: * list. */ if (ret_value<0 && point_of_no_return) { - H5O_reset(H5O_LAYOUT_ID, &ent->layout); if(ent->chunk) - ent->chunk = H5F_istore_chunk_xfree(ent->chunk,&ent->pline); - H5O_reset(H5O_PLINE_ID, &ent->pline); - } + ent->chunk = H5D_istore_chunk_xfree(ent->chunk,&(dset->dcpl_cache.pline)); + } /* end if */ + FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_flush_entry() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_preempt + * Function: H5D_istore_preempt * * Purpose: Preempts the specified entry from the cache, flushing it to * disk if necessary. @@ -1033,12 +1025,13 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5F_istore_preempt(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, H5F_rdcc_ent_t * ent, hbool_t flush) +H5D_istore_preempt(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, H5D_rdcc_ent_t * ent, hbool_t flush) { - H5F_rdcc_t *rdcc = &(f->shared->rdcc); + H5D_rdcc_t *rdcc = &(dset->cache.chunk); herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT(H5F_istore_preempt); + FUNC_ENTER_NOAPI_NOINIT(H5D_istore_preempt); assert(f); assert(ent); @@ -1047,15 +1040,13 @@ H5F_istore_preempt(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, if(flush) { /* Flush */ - if(H5F_istore_flush_entry(f, dxpl_cache, dxpl_id, ent, TRUE) < 0) + if(H5D_istore_flush_entry(f, dxpl_cache, dxpl_id, dset, ent, TRUE) < 0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "cannot flush indexed storage buffer"); } else { /* Don't flush, just free chunk */ - H5O_reset(H5O_LAYOUT_ID, &ent->layout); if(ent->chunk != NULL) - ent->chunk = H5F_istore_chunk_xfree(ent->chunk,&ent->pline); - H5O_reset(H5O_PLINE_ID, &ent->pline); + ent->chunk = H5D_istore_chunk_xfree(ent->chunk,&(dset->dcpl_cache.pline)); } /* Unlink from list */ @@ -1076,15 +1067,15 @@ H5F_istore_preempt(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, --rdcc->nused; /* Free */ - H5FL_FREE(H5F_rdcc_ent_t, ent); + H5FL_FREE(H5D_rdcc_ent_t, ent); done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_preempt() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_flush + * Function: H5D_istore_flush * * Purpose: Writes all dirty chunks to disk and optionally preempts them * from the cache. @@ -1101,15 +1092,15 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_flush (H5F_t *f, hid_t dxpl_id, unsigned flags) +H5D_istore_flush (H5F_t *f, hid_t dxpl_id, H5D_t *dset, unsigned flags) { H5D_dxpl_cache_t dxpl_cache; /* Cached data transfer properties */ - H5F_rdcc_t *rdcc = &(f->shared->rdcc); + H5D_rdcc_t *rdcc = &(dset->cache.chunk); int nerrors=0; - H5F_rdcc_ent_t *ent=NULL, *next=NULL; + H5D_rdcc_ent_t *ent=NULL, *next=NULL; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_flush, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_flush, FAIL); /* Fill the DXPL cache values for later use */ if (H5D_get_dxpl_cache(dxpl_id,&dxpl_cache)<0) @@ -1122,24 +1113,24 @@ H5F_istore_flush (H5F_t *f, hid_t dxpl_id, unsigned flags) ent->dirty = FALSE; } /* end if */ else if ((flags&H5F_FLUSH_INVALIDATE)) { - if (H5F_istore_preempt(f, &dxpl_cache, dxpl_id, ent, TRUE )<0) + if (H5D_istore_preempt(f, &dxpl_cache, dxpl_id, dset, ent, TRUE )<0) nerrors++; } else { - if (H5F_istore_flush_entry(f, &dxpl_cache, dxpl_id, ent, FALSE)<0) + if (H5D_istore_flush_entry(f, &dxpl_cache, dxpl_id, dset, ent, FALSE)<0) nerrors++; } - } + } /* end for */ if (nerrors) HGOTO_ERROR (H5E_IO, H5E_CANTFLUSH, FAIL, "unable to flush one or more raw data chunks"); done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_flush() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_dest + * Function: H5D_istore_dest * * Purpose: Destroy the entire chunk cache by flushing dirty entries, * preempting all entries, and freeing the cache itself. @@ -1156,42 +1147,42 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_dest (H5F_t *f, hid_t dxpl_id) +H5D_istore_dest (H5F_t *f, hid_t dxpl_id, H5D_t *dset) { H5D_dxpl_cache_t dxpl_cache; /* Cached data transfer properties */ - H5F_rdcc_t *rdcc = &(f->shared->rdcc); + H5D_rdcc_t *rdcc = &(dset->cache.chunk); int nerrors=0; - H5F_rdcc_ent_t *ent=NULL, *next=NULL; + H5D_rdcc_ent_t *ent=NULL, *next=NULL; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_dest, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_dest, FAIL); /* Fill the DXPL cache values for later use */ if (H5D_get_dxpl_cache(dxpl_id,&dxpl_cache)<0) HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache") for (ent=rdcc->head; ent; ent=next) { -#ifdef H5F_ISTORE_DEBUG +#ifdef H5D_ISTORE_DEBUG HDfputc('c', stderr); HDfflush(stderr); #endif next = ent->next; - if (H5F_istore_preempt(f, &dxpl_cache, dxpl_id, ent, TRUE )<0) + if (H5D_istore_preempt(f, &dxpl_cache, dxpl_id, dset, ent, TRUE )<0) nerrors++; } if (nerrors) HGOTO_ERROR (H5E_IO, H5E_CANTFLUSH, FAIL, "unable to flush one or more raw data chunks"); - H5FL_SEQ_FREE (H5F_rdcc_ent_ptr_t,rdcc->slot); - HDmemset (rdcc, 0, sizeof(H5F_rdcc_t)); + H5FL_SEQ_FREE (H5D_rdcc_ent_ptr_t,rdcc->slot); + HDmemset (rdcc, 0, sizeof(H5D_rdcc_t)); done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_dest() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_prune + * Function: H5D_istore_prune * * Purpose: Prune the cache by preempting some things until the cache has * room for something which is SIZE bytes. Only unlocked @@ -1209,18 +1200,19 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5F_istore_prune (H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, size_t size) +H5D_istore_prune (H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, H5D_t *dset, + size_t size) { int i, j, nerrors=0; - H5F_rdcc_t *rdcc = &(f->shared->rdcc); - size_t total = f->shared->rdcc_nbytes; + H5D_rdcc_t *rdcc = &(dset->cache.chunk); + size_t total = rdcc->nbytes; const int nmeth=2; /*number of methods */ int w[1]; /*weighting as an interval */ - H5F_rdcc_ent_t *p[2], *cur; /*list pointers */ - H5F_rdcc_ent_t *n[2]; /*list next pointers */ + H5D_rdcc_ent_t *p[2], *cur; /*list pointers */ + H5D_rdcc_ent_t *n[2]; /*list next pointers */ herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT(H5F_istore_prune); + FUNC_ENTER_NOAPI_NOINIT(H5D_istore_prune); /* * Preemption is accomplished by having multiple pointers (currently two) @@ -1232,7 +1224,7 @@ H5F_istore_prune (H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, s * begins. The pointers participating in the list traversal are each * given a chance at preemption before any of the pointers are advanced. */ - w[0] = (int)(rdcc->nused * f->shared->rdcc_w0); + w[0] = (int)(rdcc->nused * H5F_RDCC_W0(f)); p[0] = rdcc->head; p[1] = NULL; @@ -1259,7 +1251,7 @@ H5F_istore_prune (H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, s * written or partially read. */ cur = p[0]; -#ifdef H5F_ISTORE_DEBUG +#ifdef H5D_ISTORE_DEBUG HDputc('.', stderr); HDfflush(stderr); #endif @@ -1271,7 +1263,7 @@ H5F_istore_prune (H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, s * resort preemption. */ cur = p[1]; -#ifdef H5F_ISTORE_DEBUG +#ifdef H5D_ISTORE_DEBUG HDputc(':', stderr); HDfflush(stderr); #endif @@ -1288,7 +1280,7 @@ H5F_istore_prune (H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, s if (n[j]==cur) n[j] = cur->next; } - if (H5F_istore_preempt(f, dxpl_cache, dxpl_id, cur, TRUE)<0) + if (H5D_istore_preempt(f, dxpl_cache, dxpl_id, dset, cur, TRUE)<0) nerrors++; } } @@ -1305,11 +1297,11 @@ H5F_istore_prune (H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, s done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_prune() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_lock + * Function: H5D_istore_lock * * Purpose: Return a pointer to a dataset chunk. The pointer points * directly into the chunk cache and should not be freed @@ -1343,24 +1335,29 @@ done: *------------------------------------------------------------------------- */ static void * -H5F_istore_lock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, const H5O_layout_t *layout, - const H5O_pline_t *pline, const H5O_fill_t *fill, H5D_fill_time_t fill_time, - H5F_istore_ud1_t *udata, - const H5D_storage_t *store, hbool_t relax, - unsigned *idx_hint/*in,out*/) +H5D_istore_lock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, + H5D_istore_ud1_t *udata, hbool_t relax, unsigned *idx_hint/*in,out*/) { - int idx=0; /*hash index number */ - hsize_t temp_idx=0; /* temporary index number */ + unsigned idx=0; /*hash index number */ hbool_t found = FALSE; /*already in cache? */ - H5F_rdcc_t *rdcc = &(f->shared->rdcc);/*raw data chunk cache*/ - H5F_rdcc_ent_t *ent = NULL; /*cache entry */ + const H5O_pline_t *pline=&(dset->dcpl_cache.pline); /* I/O pipeline info */ + const H5O_layout_t *layout=&(dset->layout); /* Dataset layout */ + const H5O_fill_t *fill=&(dset->dcpl_cache.fill); /* Fill value info */ + H5D_fill_time_t fill_time=dset->dcpl_cache.fill_time; /* Fill time */ + H5D_rdcc_t *rdcc = &(dset->cache.chunk);/*raw data chunk cache*/ + H5D_rdcc_ent_t *ent = NULL; /*cache entry */ unsigned u; /*counters */ size_t chunk_size=0; /*size of a chunk */ void *chunk=NULL; /*the file chunk */ void *ret_value; /*return value */ - FUNC_ENTER_NOAPI_NOINIT(H5F_istore_lock); + FUNC_ENTER_NOAPI_NOINIT(H5D_istore_lock); + assert(f); + assert(dset); + assert(store); + assert(dxpl_cache); assert(TRUE==H5P_isa_class(dxpl_id,H5P_DATASET_XFER)); /* Get the chunk's size */ @@ -1369,20 +1366,18 @@ H5F_istore_lock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, con /* Search for the chunk in the cache */ if (rdcc->nslots>0) { - temp_idx = store->chunk.index + (hsize_t)(layout->u.chunk.addr); - idx=H5F_HASH(f,temp_idx); + idx=H5D_HASH(dset,store->chunk.index); ent = rdcc->slot[idx]; - if (ent && layout->u.chunk.ndims==ent->layout.u.chunk.ndims && - H5F_addr_eq(layout->u.chunk.addr, ent->layout.u.chunk.addr)) { - for (u=0, found=TRUE; ulayout.u.chunk.ndims; u++) { + if (ent) { + for (u=0, found=TRUE; ulayout.u.chunk.ndims; u++) { if (store->chunk.offset[u]!=ent->offset[u]) { found = FALSE; break; - } - } - } - } + } /* end if */ + } /* end for */ + } /* end if */ + } /* end if */ if (found) { /* @@ -1397,16 +1392,16 @@ H5F_istore_lock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, con * buffer with the file contents. Count this as a hit instead of a * miss because we saved ourselves lots of work. */ -#ifdef H5F_ISTORE_DEBUG +#ifdef H5D_ISTORE_DEBUG HDputc('w', stderr); HDfflush(stderr); #endif rdcc->nhits++; - if (NULL==(chunk=H5F_istore_chunk_alloc (chunk_size,pline))) + if (NULL==(chunk=H5D_istore_chunk_alloc (chunk_size,pline))) HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for raw data chunk"); } else { - H5F_istore_ud1_t tmp_udata; /*B-tree pass-through */ + H5D_istore_ud1_t tmp_udata; /*B-tree pass-through */ haddr_t chunk_addr; /* Address of chunk on disk */ if(udata!=NULL) @@ -1419,7 +1414,7 @@ H5F_istore_lock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, con * Not in the cache. Read it from the file and count this as a miss * if it's in the file or an init if it isn't. */ - chunk_addr = H5F_istore_get_addr(f, dxpl_id, layout, store->chunk.offset, udata); + chunk_addr = H5D_istore_get_addr(f, dxpl_id, layout, store->chunk.offset, udata); } /* end else */ if (H5F_addr_defined(chunk_addr)) { @@ -1431,7 +1426,7 @@ H5F_istore_lock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, con /* Chunk size on disk isn't [likely] the same size as the final chunk * size in memory, so allocate memory big enough. */ chunk_alloc = udata->key.nbytes; - if (NULL==(chunk = H5F_istore_chunk_alloc (chunk_alloc,pline))) + if (NULL==(chunk = H5D_istore_chunk_alloc (chunk_alloc,pline))) HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for raw data chunk"); if (H5F_block_read(f, H5FD_MEM_DRAW, chunk_addr, udata->key.nbytes, dxpl_id, chunk)<0) HGOTO_ERROR (H5E_IO, H5E_READERROR, NULL, "unable to read raw data chunk"); @@ -1450,7 +1445,7 @@ H5F_istore_lock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, con /* Chunk size on disk isn't [likely] the same size as the final chunk * size in memory, so allocate memory big enough. */ - if (NULL==(chunk = H5F_istore_chunk_alloc (chunk_size,pline))) + if (NULL==(chunk = H5D_istore_chunk_alloc (chunk_size,pline))) HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for raw data chunk"); if (H5P_is_fill_value_defined(fill, &fill_status) < 0) @@ -1478,31 +1473,29 @@ H5F_istore_lock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, con } assert (found || chunk_size>0); - if (!found && rdcc->nslots>0 && chunk_size<=f->shared->rdcc_nbytes && + if (!found && rdcc->nslots>0 && chunk_size<=dset->cache.chunk.nbytes && (!ent || !ent->locked)) { /* * Add the chunk to the cache only if the slot is not already locked. * Preempt enough things from the cache to make room. */ if (ent) { -#ifdef H5F_ISTORE_DEBUG +#ifdef H5D_ISTORE_DEBUG HDputc('#', stderr); HDfflush(stderr); #endif - if (H5F_istore_preempt(f, dxpl_cache, dxpl_id, ent, TRUE)<0) + if (H5D_istore_preempt(f, dxpl_cache, dxpl_id, dset, ent, TRUE)<0) HGOTO_ERROR(H5E_IO, H5E_CANTINIT, NULL, "unable to preempt chunk from cache"); } - if (H5F_istore_prune(f, dxpl_cache, dxpl_id, chunk_size)<0) + if (H5D_istore_prune(f, dxpl_cache, dxpl_id, dset, chunk_size)<0) HGOTO_ERROR(H5E_IO, H5E_CANTINIT, NULL, "unable to preempt chunk(s) from cache"); /* Create a new entry */ - ent = H5FL_MALLOC(H5F_rdcc_ent_t); + ent = H5FL_MALLOC(H5D_rdcc_ent_t); ent->locked = 0; ent->dirty = FALSE; ent->chunk_size = chunk_size; ent->alloc_size = chunk_size; - H5O_copy(H5O_LAYOUT_ID, layout, &ent->layout); - H5O_copy(H5O_PLINE_ID, pline, &ent->pline); for (u=0; uu.chunk.ndims; u++) ent->offset[u] = store->chunk.offset[u]; ent->rd_count = chunk_size; @@ -1574,13 +1567,13 @@ H5F_istore_lock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, con done: if (!ret_value) if(chunk) - H5F_istore_chunk_xfree (chunk,pline); + H5D_istore_chunk_xfree (chunk,pline); FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_lock() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_unlock + * Function: H5D_istore_unlock * * Purpose: Unlocks a previously locked chunk. The LAYOUT, COMP, and * OFFSET arguments should be the same as for H5F_rdcc_lock(). @@ -1606,16 +1599,16 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5F_istore_unlock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, - const H5O_layout_t *layout, const H5O_pline_t *pline, hbool_t dirty, - const H5D_storage_t *store, unsigned idx_hint, uint8_t *chunk, size_t naccessed) +H5D_istore_unlock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, + hbool_t dirty, unsigned idx_hint, uint8_t *chunk, size_t naccessed) { - H5F_rdcc_t *rdcc = &(f->shared->rdcc); - H5F_rdcc_ent_t *ent = NULL; + H5D_rdcc_t *rdcc = &(dset->cache.chunk); + H5D_rdcc_ent_t *ent = NULL; int found = -1; unsigned u; - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_istore_unlock); + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5D_istore_unlock); if (UINT_MAX==idx_hint) { /*not in cache*/ @@ -1634,23 +1627,21 @@ H5F_istore_unlock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, * don't discard the `const' qualifier. */ if (dirty) { - H5F_rdcc_ent_t x; + H5D_rdcc_ent_t x; HDmemset (&x, 0, sizeof x); x.dirty = TRUE; - H5O_copy (H5O_LAYOUT_ID, layout, &x.layout); - H5O_copy (H5O_PLINE_ID, pline, &x.pline); - for (u=0; uu.chunk.ndims; u++) + for (u=0; ulayout.u.chunk.ndims; u++) x.offset[u] = store->chunk.offset[u]; - assert(layout->u.chunk.size>0); - H5_ASSIGN_OVERFLOW(x.chunk_size,layout->u.chunk.size,hsize_t,size_t); + assert(dset->layout.u.chunk.size>0); + H5_ASSIGN_OVERFLOW(x.chunk_size,dset->layout.u.chunk.size,hsize_t,size_t); x.alloc_size = x.chunk_size; x.chunk = chunk; - H5F_istore_flush_entry (f, dxpl_cache, dxpl_id, &x, TRUE); + H5D_istore_flush_entry (f, dxpl_cache, dxpl_id, dset, &x, TRUE); } else { if(chunk) - H5F_istore_chunk_xfree (chunk,pline); + H5D_istore_chunk_xfree (chunk,&(dset->dcpl_cache.pline)); } } else { /* @@ -1668,11 +1659,11 @@ H5F_istore_unlock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, } FUNC_LEAVE_NOAPI(SUCCEED); -} +} /* end H5D_istore_unlock() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_readvv + * Function: H5D_istore_readvv * * Purpose: Reads a multi-dimensional buffer from (part of) an indexed raw * storage array. @@ -1687,25 +1678,25 @@ H5F_istore_unlock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, *------------------------------------------------------------------------- */ ssize_t -H5F_istore_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, - const H5O_layout_t *layout, const struct H5D_dcpl_cache_t *dcpl_cache, const H5D_storage_t *store, +H5D_istore_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, size_t chunk_max_nseq, size_t *chunk_curr_seq, size_t chunk_len_arr[], hsize_t chunk_offset_arr[], size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], void *buf) { - H5F_istore_ud1_t udata; /*B-tree pass-through */ + H5D_istore_ud1_t udata; /*B-tree pass-through */ haddr_t chunk_addr; /* Chunk address on disk */ size_t u; /* Local index variables */ ssize_t ret_value; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_readvv, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_readvv, FAIL); /* Check args */ assert(f); assert(dxpl_cache); - assert(layout && H5D_CHUNKED==layout->type); - assert(layout->u.chunk.ndims>0 && layout->u.chunk.ndims<=H5O_LAYOUT_NDIMS); - assert(dcpl_cache); + assert(dset && H5D_CHUNKED==dset->layout.type); + assert(dset->layout.u.chunk.ndims>0 && dset->layout.u.chunk.ndims<=H5O_LAYOUT_NDIMS); + assert(store); assert(chunk_len_arr); assert(chunk_offset_arr); assert(mem_len_arr); @@ -1713,19 +1704,19 @@ H5F_istore_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxp assert(buf); #ifndef NDEBUG - for (u=0; uu.chunk.ndims; u++) + for (u=0; ulayout.u.chunk.ndims; u++) assert(store->chunk.offset[u]>=0); /*negative coordinates not supported (yet) */ #endif /* Get the address of this chunk on disk */ #ifdef QAK HDfprintf(stderr,"%s: chunk_coords={",FUNC); -for(u=0; uu.chunk.ndims; u++) - HDfprintf(stderr,"%Hd%s",chunk_coords[u],(u<(layout->u.chunk.ndims-1) ? ", " : "}\n")); +for(u=0; ulayout.u.chunk.ndims; u++) + HDfprintf(stderr,"%Hd%s",chunk_coords[u],(u<(dset->layout.u.chunk.ndims-1) ? ", " : "}\n")); #endif /* QAK */ - chunk_addr=H5F_istore_get_addr(f, dxpl_id, layout, store->chunk.offset, &udata); + chunk_addr=H5D_istore_get_addr(f, dxpl_id, &(dset->layout), store->chunk.offset, &udata); #ifdef QAK -HDfprintf(stderr,"%s: chunk_addr=%a, chunk_size=%Hu\n",FUNC,chunk_addr,layout->u.chunk.size); +HDfprintf(stderr,"%s: chunk_addr=%a, chunk_size=%Hu\n",FUNC,chunk_addr,dset->layout.u.chunk.size); HDfprintf(stderr,"%s: chunk_len_arr[%Zu]=%Zu\n",FUNC,*chunk_curr_seq,chunk_len_arr[*chunk_curr_seq]); HDfprintf(stderr,"%s: chunk_offset_arr[%Zu]=%Hu\n",FUNC,*chunk_curr_seq,chunk_offset_arr[*chunk_curr_seq]); HDfprintf(stderr,"%s: mem_len_arr[%Zu]=%Zu\n",FUNC,*mem_curr_seq,mem_len_arr[*mem_curr_seq]); @@ -1738,9 +1729,9 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a * for the chunk has been defined, then don't load the chunk into the * cache, just write the data to it directly. */ - if (layout->u.chunk.size>f->shared->rdcc_nbytes && dcpl_cache->pline.nused==0 && + if (dset->layout.u.chunk.size>dset->cache.chunk.nbytes && dset->dcpl_cache.pline.nused==0 && chunk_addr!=HADDR_UNDEF) { - if ((ret_value=H5F_contig_readvv(f, (hsize_t)layout->u.chunk.size, chunk_addr, chunk_max_nseq, chunk_curr_seq, chunk_len_arr, chunk_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, dxpl_id, buf))<0) + if ((ret_value=H5D_contig_readvv(f, dxpl_id, dset, chunk_addr, (hsize_t)dset->layout.u.chunk.size, chunk_max_nseq, chunk_curr_seq, chunk_len_arr, chunk_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, buf))<0) HGOTO_ERROR (H5E_IO, H5E_READERROR, FAIL, "unable to read raw data to file"); } /* end if */ else { @@ -1752,8 +1743,8 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a * Lock the chunk, copy from application to chunk, then unlock the * chunk. */ - if (NULL==(chunk=H5F_istore_lock(f, dxpl_cache, dxpl_id, layout, &dcpl_cache->pline, &dcpl_cache->fill, dcpl_cache->fill_time, - &udata, store, FALSE, &idx_hint))) + if (NULL==(chunk=H5D_istore_lock(f, dxpl_cache, dxpl_id, dset, store, + &udata, FALSE, &idx_hint))) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to read raw data chunk"); /* Use the vectorized memory copy routine to do actual work */ @@ -1761,8 +1752,8 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "vectorized memcpy failed"); H5_CHECK_OVERFLOW(naccessed,ssize_t,size_t); - if (H5F_istore_unlock(f, dxpl_cache, dxpl_id, layout, &dcpl_cache->pline, FALSE, - store, idx_hint, chunk, (size_t)naccessed)<0) + if (H5D_istore_unlock(f, dxpl_cache, dxpl_id, dset, store, + FALSE, idx_hint, chunk, (size_t)naccessed)<0) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to unlock raw data chunk"); /* Set return value */ @@ -1771,11 +1762,11 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a done: FUNC_LEAVE_NOAPI(ret_value); -} /* H5F_istore_readvv() */ +} /* H5D_istore_readvv() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_writevv + * Function: H5D_istore_writevv * * Purpose: Writes a multi-dimensional buffer to (part of) an indexed raw * storage array. @@ -1790,26 +1781,25 @@ done: *------------------------------------------------------------------------- */ ssize_t -H5F_istore_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, const H5O_layout_t *layout, - const struct H5D_dcpl_cache_t *dcpl_cache, const H5D_storage_t *store, +H5D_istore_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, + hid_t dxpl_id, H5D_t *dset, const H5D_storage_t *store, size_t chunk_max_nseq, size_t *chunk_curr_seq, size_t chunk_len_arr[], hsize_t chunk_offset_arr[], size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], const void *buf) { - H5F_istore_ud1_t udata; /*B-tree pass-through */ + H5D_istore_ud1_t udata; /*B-tree pass-through */ haddr_t chunk_addr; /* Chunk address on disk */ size_t u; /* Local index variables */ ssize_t ret_value; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_writevv, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_writevv, FAIL); /* Check args */ assert(f); assert(dxpl_cache); - assert(layout && H5D_CHUNKED==layout->type); - assert(layout->u.chunk.ndims>0 && layout->u.chunk.ndims<=H5O_LAYOUT_NDIMS); - assert(dcpl_cache); + assert(dset && H5D_CHUNKED==dset->layout.type); + assert(dset->layout.u.chunk.ndims>0 && dset->layout.u.chunk.ndims<=H5O_LAYOUT_NDIMS); + assert(store); assert(chunk_len_arr); assert(chunk_offset_arr); assert(mem_len_arr); @@ -1817,19 +1807,19 @@ H5F_istore_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, assert(buf); #ifndef NDEBUG - for (u=0; uu.chunk.ndims; u++) + for (u=0; ulayout.u.chunk.ndims; u++) assert(store->chunk.offset[u]>=0); /*negative coordinates not supported (yet) */ #endif /* Get the address of this chunk on disk */ #ifdef QAK HDfprintf(stderr,"%s: chunk_coords={",FUNC); -for(u=0; uu.chunk.ndims; u++) - HDfprintf(stderr,"%Hd%s",chunk_coords[u],(u<(layout->u.chunk.ndims-1) ? ", " : "}\n")); +for(u=0; ulayout.u.chunk.ndims; u++) + HDfprintf(stderr,"%Hd%s",chunk_coords[u],(u<(dset->layout.u.chunk.ndims-1) ? ", " : "}\n")); #endif /* QAK */ - chunk_addr=H5F_istore_get_addr(f, dxpl_id, layout, store->chunk.offset, &udata); + chunk_addr=H5D_istore_get_addr(f, dxpl_id, &(dset->layout), store->chunk.offset, &udata); #ifdef QAK -HDfprintf(stderr,"%s: chunk_addr=%a, chunk_size=%Hu\n",FUNC,chunk_addr,layout->u.chunk.size); +HDfprintf(stderr,"%s: chunk_addr=%a, chunk_size=%Hu\n",FUNC,chunk_addr,dset->layout.u.chunk.size); HDfprintf(stderr,"%s: chunk_len_arr[%Zu]=%Zu\n",FUNC,*chunk_curr_seq,chunk_len_arr[*chunk_curr_seq]); HDfprintf(stderr,"%s: chunk_offset_arr[%Zu]=%Hu\n",FUNC,*chunk_curr_seq,chunk_offset_arr[*chunk_curr_seq]); HDfprintf(stderr,"%s: mem_len_arr[%Zu]=%Zu\n",FUNC,*mem_curr_seq,mem_len_arr[*mem_curr_seq]); @@ -1847,14 +1837,14 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a * writing to other elements in the same chunk. Do a direct * write-through of only the elements requested. */ - if ((layout->u.chunk.size>f->shared->rdcc_nbytes && dcpl_cache->pline.nused==0 && chunk_addr!=HADDR_UNDEF) - || (IS_H5FD_MPI(f) && (H5F_ACC_RDWR & f->shared->flags))) { + if ((dset->layout.u.chunk.size>dset->cache.chunk.nbytes && dset->dcpl_cache.pline.nused==0 && chunk_addr!=HADDR_UNDEF) + || (IS_H5FD_MPI(f) && (H5F_ACC_RDWR & H5F_get_intent(f)))) { #ifdef H5_HAVE_PARALLEL /* Additional sanity check when operating in parallel */ - if (chunk_addr==HADDR_UNDEF || dcpl_cache->pline.nused>0) + if (chunk_addr==HADDR_UNDEF || dset->dcpl_cache.pline.nused>0) HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to locate raw data chunk"); #endif /* H5_HAVE_PARALLEL */ - if ((ret_value=H5F_contig_writevv(f, (hsize_t)layout->u.chunk.size, chunk_addr, chunk_max_nseq, chunk_curr_seq, chunk_len_arr, chunk_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, dxpl_id, buf))<0) + if ((ret_value=H5D_contig_writevv(f, dxpl_id, dset, chunk_addr, (hsize_t)dset->layout.u.chunk.size, chunk_max_nseq, chunk_curr_seq, chunk_len_arr, chunk_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, buf))<0) HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to write raw data to file"); } /* end if */ else { @@ -1867,13 +1857,13 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a * Lock the chunk, copy from application to chunk, then unlock the * chunk. */ - if(chunk_max_nseq==1 && chunk_len_arr[0] == layout->u.chunk.size) + if(chunk_max_nseq==1 && chunk_len_arr[0] == dset->layout.u.chunk.size) relax = TRUE; else relax = FALSE; - if (NULL==(chunk=H5F_istore_lock(f, dxpl_cache, dxpl_id, layout, &dcpl_cache->pline, &dcpl_cache->fill, dcpl_cache->fill_time, - &udata, store, relax, &idx_hint))) + if (NULL==(chunk=H5D_istore_lock(f, dxpl_cache, dxpl_id, dset, store, + &udata, relax, &idx_hint))) HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to read raw data chunk"); /* Use the vectorized memory copy routine to do actual work */ @@ -1881,8 +1871,8 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "vectorized memcpy failed"); H5_CHECK_OVERFLOW(naccessed,ssize_t,size_t); - if (H5F_istore_unlock(f, dxpl_cache, dxpl_id, layout, &dcpl_cache->pline, TRUE, - store, idx_hint, chunk, (size_t)naccessed)<0) + if (H5D_istore_unlock(f, dxpl_cache, dxpl_id, dset, store, + TRUE, idx_hint, chunk, (size_t)naccessed)<0) HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "uanble to unlock raw data chunk"); /* Set return value */ @@ -1891,11 +1881,11 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a done: FUNC_LEAVE_NOAPI(ret_value); -} /* H5F_istore_writevv() */ +} /* H5D_istore_writevv() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_create + * Function: H5D_istore_create * * Purpose: Creates a new indexed-storage B-tree and initializes the * istore struct with information about the storage. The @@ -1915,15 +1905,15 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_create(H5F_t *f, hid_t dxpl_id, H5O_layout_t *layout /*out */ ) +H5D_istore_create(H5F_t *f, hid_t dxpl_id, H5O_layout_t *layout /*out */ ) { - H5F_istore_ud1_t udata; + H5D_istore_ud1_t udata; #ifndef NDEBUG unsigned u; #endif herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_create, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_create, FAIL); /* Check args */ assert(f); @@ -1940,11 +1930,11 @@ H5F_istore_create(H5F_t *f, hid_t dxpl_id, H5O_layout_t *layout /*out */ ) done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_create() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_allocated + * Function: H5D_istore_allocated * * Purpose: Return the number of bytes allocated in the file for storage * of raw data under the specified B-tree (ADDR is the address @@ -1963,15 +1953,15 @@ done: *------------------------------------------------------------------------- */ hsize_t -H5F_istore_allocated(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout) +H5D_istore_allocated(H5F_t *f, hid_t dxpl_id, H5D_t *dset) { - H5F_rdcc_t *rdcc = &(f->shared->rdcc); /*raw data chunk cache */ - H5F_rdcc_ent_t *ent; /*cache entry */ + H5D_rdcc_t *rdcc = &(dset->cache.chunk); /*raw data chunk cache */ + H5D_rdcc_ent_t *ent; /*cache entry */ H5D_dxpl_cache_t dxpl_cache; /* Cached data transfer properties */ - H5F_istore_ud1_t udata; + H5D_istore_ud1_t udata; hsize_t ret_value; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_allocated, 0); + FUNC_ENTER_NOAPI(H5D_istore_allocated, 0); /* Fill the DXPL cache values for later use */ if (H5D_get_dxpl_cache(dxpl_id,&dxpl_cache)<0) @@ -1979,17 +1969,14 @@ H5F_istore_allocated(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout) /* Search for cached chunks that haven't been written out */ for(ent = rdcc->head; ent; ent = ent->next) { - /* Make certain we are dealing with the correct B-tree, etc */ - if (H5F_addr_eq(layout->u.chunk.addr, ent->layout.u.chunk.addr)) { - /* Flush the chunk out to disk, to make certain the size is correct later */ - if (H5F_istore_flush_entry(f, &dxpl_cache, dxpl_id, ent, FALSE)<0) - HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, 0, "cannot flush indexed storage buffer"); - } /* end if */ + /* Flush the chunk out to disk, to make certain the size is correct later */ + if (H5D_istore_flush_entry(f, &dxpl_cache, dxpl_id, dset, ent, FALSE)<0) + HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, 0, "cannot flush indexed storage buffer"); } /* end for */ HDmemset(&udata, 0, sizeof udata); - udata.mesg.u.chunk.ndims = layout->u.chunk.ndims; - if (H5B_iterate(f, dxpl_id, H5B_ISTORE, H5F_istore_iter_allocated, layout->u.chunk.addr, &udata)<0) + udata.mesg.u.chunk.ndims = dset->layout.u.chunk.ndims; + if (H5B_iterate(f, dxpl_id, H5B_ISTORE, H5D_istore_iter_allocated, dset->layout.u.chunk.addr, &udata)<0) HGOTO_ERROR(H5E_IO, H5E_CANTINIT, 0, "unable to iterate over chunk B-tree"); /* Set return value */ @@ -1997,11 +1984,11 @@ H5F_istore_allocated(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout) done: FUNC_LEAVE_NOAPI(ret_value); -} /* end H5F_istore_allocated() */ +} /* end H5D_istore_allocated() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_get_addr + * Function: H5D_istore_get_addr * * Purpose: Get the file address of a chunk if file space has been * assigned. Save the retrieved information in the udata @@ -2019,15 +2006,15 @@ done: *------------------------------------------------------------------------- */ static haddr_t -H5F_istore_get_addr(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, - const hssize_t offset[], H5F_istore_ud1_t *_udata) +H5D_istore_get_addr(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, + const hssize_t offset[], H5D_istore_ud1_t *_udata) { - H5F_istore_ud1_t tmp_udata; /* Information about a chunk */ - H5F_istore_ud1_t *udata; /* Pointer to information about a chunk */ + H5D_istore_ud1_t tmp_udata; /* Information about a chunk */ + H5D_istore_ud1_t *udata; /* Pointer to information about a chunk */ unsigned u; haddr_t ret_value; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT(H5F_istore_get_addr); + FUNC_ENTER_NOAPI_NOINIT(H5D_istore_get_addr); assert(f); assert(layout && (layout->u.chunk.ndims > 0)); @@ -2054,11 +2041,11 @@ H5F_istore_get_addr(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, done: FUNC_LEAVE_NOAPI(ret_value); -} /* H5F_istore_get_addr() */ +} /* H5D_istore_get_addr() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_chunk_alloc + * Function: H5D_istore_chunk_alloc * * Purpose: Allocate space for a chunk in memory. This routine allocates * memory space for non-filtered chunks from a block free list @@ -2074,11 +2061,11 @@ done: *------------------------------------------------------------------------- */ static void * -H5F_istore_chunk_alloc(size_t size, const H5O_pline_t *pline) +H5D_istore_chunk_alloc(size_t size, const H5O_pline_t *pline) { void *ret_value=NULL; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_istore_chunk_alloc); + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5D_istore_chunk_alloc); assert(size); assert(pline); @@ -2089,11 +2076,11 @@ H5F_istore_chunk_alloc(size_t size, const H5O_pline_t *pline) ret_value=H5FL_BLK_MALLOC(chunk,size); FUNC_LEAVE_NOAPI(ret_value); -} /* H5F_istore_chunk_alloc() */ +} /* H5D_istore_chunk_alloc() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_chunk_xfree + * Function: H5D_istore_chunk_xfree * * Purpose: Free space for a chunk in memory. This routine allocates * memory space for non-filtered chunks from a block free list @@ -2109,9 +2096,9 @@ H5F_istore_chunk_alloc(size_t size, const H5O_pline_t *pline) *------------------------------------------------------------------------- */ static void * -H5F_istore_chunk_xfree(void *chk, const H5O_pline_t *pline) +H5D_istore_chunk_xfree(void *chk, const H5O_pline_t *pline) { - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_istore_chunk_xfree); + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5D_istore_chunk_xfree); assert(pline); @@ -2123,11 +2110,11 @@ H5F_istore_chunk_xfree(void *chk, const H5O_pline_t *pline) } /* end if */ FUNC_LEAVE_NOAPI(NULL); -} /* H5F_istore_chunk_xfree() */ +} /* H5D_istore_chunk_xfree() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_allocate + * Function: H5D_istore_allocate * * Purpose: Allocate file space for all chunks that are not allocated yet. * Return SUCCEED if all needed allocation succeed, otherwise @@ -2141,6 +2128,9 @@ H5F_istore_chunk_xfree(void *chk, const H5O_pline_t *pline) * This should be changed to do a direct flush independent * of the cache value. * + * This routine might be called before the dcpl_cache is set up + * correctly, so don't use those values. + * * Programmer: Albert Cheng * June 26, 1998 * @@ -2167,8 +2157,8 @@ H5F_istore_chunk_xfree(void *chk, const H5O_pline_t *pline) *------------------------------------------------------------------------- */ herr_t -H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, - const hsize_t *space_dim, H5P_genplist_t *dc_plist, hbool_t full_overwrite) +H5D_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5D_t *dset, + hbool_t full_overwrite) { hssize_t chunk_offset[H5O_LAYOUT_NDIMS]; /* Offset of current chunk */ hsize_t chunk_size; /* Size of chunk in bytes */ @@ -2177,7 +2167,7 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, H5D_fill_time_t fill_time; /* When to write fill values */ H5D_fill_value_t fill_status; /* The fill value status */ unsigned should_fill=0; /* Whether fill values should be written */ - H5F_istore_ud1_t udata; /* B-tree pass-through for creating chunk */ + H5D_istore_ud1_t udata; /* B-tree pass-through for creating chunk */ void *chunk=NULL; /* Chunk buffer for writing fill values */ H5P_genplist_t *dx_plist; /* Data xfer property list */ #ifdef H5_HAVE_PARALLEL @@ -2193,18 +2183,28 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, unsigned u; /* Local index variable */ H5Z_EDC_t edc; /* Decide whether to enable EDC for read */ H5Z_cb_t cb_struct; + H5P_genplist_t *dc_plist; /* Property list */ + int space_ndims; /* Dataset's space rank */ + hsize_t space_dim[H5O_LAYOUT_NDIMS]; /* Dataset's dataspace dimensions */ herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_allocate, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_allocate, FAIL); /* Check args */ assert(f); - assert(space_dim); - assert(layout && H5D_CHUNKED==layout->type); - assert(layout->u.chunk.ndims>0 && layout->u.chunk.ndims<=H5O_LAYOUT_NDIMS); - assert(H5F_addr_defined(layout->u.chunk.addr)); assert(TRUE==H5P_isa_class(dxpl_id,H5P_DATASET_XFER)); - assert(dc_plist); + assert(dset && H5D_CHUNKED==dset->layout.type); + assert(dset->layout.u.chunk.ndims>0 && dset->layout.u.chunk.ndims<=H5O_LAYOUT_NDIMS); + assert(H5F_addr_defined(dset->layout.u.chunk.addr)); + + /* Get dataset's creation property list */ + if (NULL == (dc_plist = H5I_object(dset->dcpl_id))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset creation property list") + + /* We only handle simple data spaces so far */ + if ((space_ndims=H5S_get_simple_extent_dims(dset->space, space_dim, NULL))<0) + HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to get simple data space info") + space_dim[space_ndims] = dset->layout.u.chunk.dim[space_ndims]; /* Get necessary properties from dataset creation property list */ if(H5P_get(dc_plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0) @@ -2226,11 +2226,11 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, /* Retrieve MPI parameters */ if(IS_H5FD_MPI(f)) { /* Get the MPI communicator */ - if (MPI_COMM_NULL == (mpi_comm=H5FD_mpi_get_comm(f->shared->lf))) + if (MPI_COMM_NULL == (mpi_comm=H5F_mpi_get_comm(f))) HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "Can't retrieve MPI communicator"); - /* Get the MPI rank & size */ - if ((mpi_rank=H5FD_mpi_get_rank(f->shared->lf))<0) + /* Get the MPI rank */ + if ((mpi_rank=H5F_mpi_get_rank(f))<0) HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "Can't retrieve MPI rank"); /* Set the MPI-capable file driver flag */ @@ -2242,9 +2242,9 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, * Setup indice to go through all chunks. (Future improvement * should allocate only chunks that have no file space assigned yet. */ - for (u=0; uu.chunk.ndims; u++) + for (u=0; ulayout.u.chunk.ndims; u++) chunk_offset[u] = 0; - chunk_size = layout->u.chunk.size; + chunk_size = dset->layout.u.chunk.size; /* Check the dataset's fill-value status */ if (H5P_is_fill_value_defined(&fill, &fill_status) < 0) @@ -2262,7 +2262,7 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, if(should_fill) { /* Allocate chunk buffer for processes to use when writing fill values */ H5_CHECK_OVERFLOW(chunk_size,hsize_t,size_t); - if (NULL==(chunk = H5F_istore_chunk_alloc((size_t)chunk_size,&pline))) + if (NULL==(chunk = H5D_istore_chunk_alloc((size_t)chunk_size,&pline))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for chunk"); /* Fill the chunk with the proper values */ @@ -2299,41 +2299,36 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, while (carry==0) { /* Check if the chunk exists yet on disk */ chunk_exists=1; - if(H5F_istore_get_addr(f,dxpl_id,layout,chunk_offset, NULL)==HADDR_UNDEF) { - H5F_rdcc_t *rdcc = &(f->shared->rdcc); /*raw data chunk cache */ - H5F_rdcc_ent_t *ent = NULL; /*cache entry */ + if(H5D_istore_get_addr(f,dxpl_id,&(dset->layout),chunk_offset, NULL)==HADDR_UNDEF) { + const H5D_rdcc_t *rdcc = &(dset->cache.chunk); /*raw data chunk cache */ + H5D_rdcc_ent_t *ent = NULL; /*cache entry */ /* Didn't find the chunk on disk */ chunk_exists = 0; /* Look for chunk in cache */ for(ent = rdcc->head; ent && !chunk_exists; ent = ent->next) { - /* Make certain we are dealing with the correct B-tree, etc */ - if (layout->u.chunk.ndims==ent->layout.u.chunk.ndims && - H5F_addr_eq(layout->u.chunk.addr, ent->layout.u.chunk.addr)) { - - /* Assume a match */ - chunk_exists = 1; - for(u = 0; u < layout->u.chunk.ndims && chunk_exists; u++) { - if(ent->offset[u] != chunk_offset[u]) - chunk_exists = 0; /* Reset if no match */ - } /* end for */ - } /* end if */ + /* Assume a match */ + chunk_exists = 1; + for(u = 0; u < dset->layout.u.chunk.ndims && chunk_exists; u++) { + if(ent->offset[u] != chunk_offset[u]) + chunk_exists = 0; /* Reset if no match */ + } /* end for */ } /* end for */ } /* end if */ if(!chunk_exists) { /* Initialize the chunk information */ - udata.mesg = *layout; + udata.mesg = dset->layout; udata.key.filter_mask = 0; udata.addr = HADDR_UNDEF; H5_CHECK_OVERFLOW(chunk_size,hsize_t,size_t); udata.key.nbytes = (size_t)chunk_size; - for (u=0; uu.chunk.ndims; u++) + for (u=0; ulayout.u.chunk.ndims; u++) udata.key.offset[u] = chunk_offset[u]; /* Allocate the chunk with all processes */ - if (H5B_insert(f, dxpl_id, H5B_ISTORE, layout->u.chunk.addr, &udata)<0) + if (H5B_insert(f, dxpl_id, H5B_ISTORE, dset->layout.u.chunk.addr, &udata)<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to allocate chunk"); /* Check if fill values should be written to blocks */ @@ -2362,8 +2357,8 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, } /* end if */ /* Increment indices */ - for (i=layout->u.chunk.ndims-1, carry=1; i>=0 && carry; --i) { - chunk_offset[i] += layout->u.chunk.dim[i]; + for (i=dset->layout.u.chunk.ndims-1, carry=1; i>=0 && carry; --i) { + chunk_offset[i] += dset->layout.u.chunk.dim[i]; if (chunk_offset[i] >= (hssize_t)(space_dim[i])) chunk_offset[i] = 0; else @@ -2387,14 +2382,14 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, done: /* Free the chunk for fill values */ if(chunk!=NULL) - H5F_istore_chunk_xfree(chunk,&pline); + H5D_istore_chunk_xfree(chunk,&pline); FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_allocate() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_prune_by_extent + * Function: H5D_istore_prune_by_extent * * Purpose: This function searches for chunks that are no longer necessary both in the * raw data cache and in the B-tree. @@ -2494,28 +2489,28 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_prune_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, const H5O_layout_t *layout, const H5S_t * space) +H5D_istore_prune_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, + hid_t dxpl_id, H5D_t *dset) { - H5F_rdcc_t *rdcc = &(f->shared->rdcc); /*raw data chunk cache */ - H5F_rdcc_ent_t *ent = NULL, *next = NULL; /*cache entry */ + H5D_rdcc_t *rdcc = &(dset->cache.chunk); /*raw data chunk cache */ + H5D_rdcc_ent_t *ent = NULL, *next = NULL; /*cache entry */ unsigned u; /*counters */ int found; /*remove this entry */ - H5F_istore_ud1_t udata; /*B-tree pass-through */ + H5D_istore_ud1_t udata; /*B-tree pass-through */ hsize_t curr_dims[H5O_LAYOUT_NDIMS]; /*current dataspace dimensions */ herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_prune_by_extent, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_prune_by_extent, FAIL); /* Check args */ assert(f); - assert(layout && H5D_CHUNKED == layout->type); - assert(layout->u.chunk.ndims > 0 && layout->u.chunk.ndims <= H5O_LAYOUT_NDIMS); - assert(H5F_addr_defined(layout->u.chunk.addr)); - assert(space); + assert(dxpl_cache); + assert(dset && H5D_CHUNKED == dset->layout.type); + assert(dset->layout.u.chunk.ndims > 0 && dset->layout.u.chunk.ndims <= H5O_LAYOUT_NDIMS); + assert(H5F_addr_defined(dset->layout.u.chunk.addr)); /* Go get the rank & dimensions */ - if(H5S_get_simple_extent_dims(space, curr_dims, NULL) < 0) + if(H5S_get_simple_extent_dims(dset->space, curr_dims, NULL) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset dimensions"); /*------------------------------------------------------------------------- @@ -2527,26 +2522,23 @@ H5F_istore_prune_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, for(ent = rdcc->head; ent; ent = next) { next = ent->next; - /* Make certain we are dealing with the correct B-tree, etc */ - if (H5F_addr_eq(layout->u.chunk.addr, ent->layout.u.chunk.addr)) { - for(u = 0; u < ent->layout.u.chunk.ndims - 1; u++) { - if((hsize_t)ent->offset[u] > curr_dims[u]) { - found = 1; - break; - } - } - } /* end if */ + for(u = 0; u < dset->layout.u.chunk.ndims - 1; u++) { + if((hsize_t)ent->offset[u] > curr_dims[u]) { + found = 1; + break; + } /* end if */ + } /* end for */ if(found) { -#ifdef H5F_ISTORE_DEBUG +#ifdef H5D_ISTORE_DEBUG HDfputs("cache:remove:[", stderr); - for(u = 0; u < ent->layout.u.chunk.ndims - 1; u++) + for(u = 0; u < dset->layout.u.chunk.ndims - 1; u++) HDfprintf(stderr, "%s%Hd", u ? ", " : "", ent->offset[u]); HDfputs("]\n", stderr); #endif /* Preempt the entry from the cache, but do not flush it to disk */ - if(H5F_istore_preempt(f, dxpl_cache, dxpl_id, ent, FALSE) < 0) + if(H5D_istore_preempt(f, dxpl_cache, dxpl_id, dset, ent, FALSE) < 0) HGOTO_ERROR(H5E_IO, H5E_CANTINIT, 0, "unable to preempt chunk"); found=0; @@ -2560,22 +2552,22 @@ H5F_istore_prune_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, HDmemset(&udata, 0, sizeof udata); udata.stream = stdout; - udata.mesg.u.chunk.addr = layout->u.chunk.addr; - udata.mesg.u.chunk.ndims = layout->u.chunk.ndims; - for(u = 0; u < udata.mesg.u.chunk.ndims; u++) - udata.mesg.u.chunk.dim[u] = layout->u.chunk.dim[u]; + udata.mesg.u.chunk.addr = dset->layout.u.chunk.addr; + udata.mesg.u.chunk.ndims = dset->layout.u.chunk.ndims; + for(u = 0; u < dset->layout.u.chunk.ndims; u++) + udata.mesg.u.chunk.dim[u] = dset->layout.u.chunk.dim[u]; udata.dims = curr_dims; - if(H5B_iterate(f, dxpl_id, H5B_ISTORE, H5F_istore_prune_extent, layout->u.chunk.addr, &udata) < 0) + if(H5B_iterate(f, dxpl_id, H5B_ISTORE, H5D_istore_prune_extent, dset->layout.u.chunk.addr, &udata) < 0) HGOTO_ERROR(H5E_IO, H5E_CANTINIT, 0, "unable to iterate over B-tree"); done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_prune_by_extent() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_prune_extent + * Function: H5D_istore_prune_extent * * Purpose: Search for chunks that are no longer necessary in the B-tree. * @@ -2585,32 +2577,32 @@ done: * * Date: March 26, 2002 * - * Comments: Called by H5B_prune_by_extent, part of H5B_ISTORE + * Comments: Called by H5D_prune_by_extent * * Modifications: * *------------------------------------------------------------------------- */ static int -H5F_istore_prune_extent(H5F_t *f, hid_t dxpl_id, void *_lt_key, haddr_t UNUSED addr, +H5D_istore_prune_extent(H5F_t *f, hid_t dxpl_id, void *_lt_key, haddr_t UNUSED addr, void UNUSED *_rt_key, void *_udata) { - H5F_istore_ud1_t *bt_udata = (H5F_istore_ud1_t *)_udata; - H5F_istore_key_t *lt_key = (H5F_istore_key_t *)_lt_key; + H5D_istore_ud1_t *bt_udata = (H5D_istore_ud1_t *)_udata; + H5D_istore_key_t *lt_key = (H5D_istore_key_t *)_lt_key; unsigned u; - H5F_istore_ud1_t udata; + H5D_istore_ud1_t udata; int ret_value=H5B_ITER_CONT; /* Return value */ /* The LT_KEY is the left key (the one that describes the chunk). It points to a chunk of * storage that contains the beginning of the logical address space represented by UDATA. */ - FUNC_ENTER_NOAPI_NOINIT(H5F_istore_prune_extent); + FUNC_ENTER_NOAPI_NOINIT(H5D_istore_prune_extent); /* Figure out what chunks are no longer in use for the specified extent and release them */ for(u = 0; u < bt_udata->mesg.u.chunk.ndims - 1; u++) if((hsize_t)lt_key->offset[u] > bt_udata->dims[u]) { -#ifdef H5F_ISTORE_DEBUG +#ifdef H5D_ISTORE_DEBUG HDfputs("b-tree:remove:[", bt_udata->stream); for(u = 0; u < bt_udata->mesg.u.chunk.ndims - 1; u++) HDfprintf(bt_udata->stream, "%s%Hd", u ? ", " : "", lt_key->offset[u]); @@ -2629,11 +2621,11 @@ H5F_istore_prune_extent(H5F_t *f, hid_t dxpl_id, void *_lt_key, haddr_t UNUSED a done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_prune_extent() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_remove + * Function: H5D_istore_remove * * Purpose: Removes chunks that are no longer necessary in the B-tree. * @@ -2651,20 +2643,16 @@ done: *------------------------------------------------------------------------- */ static H5B_ins_t -H5F_istore_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key /*in,out */ , +H5D_istore_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key /*in,out */ , hbool_t *lt_key_changed /*out */ , void UNUSED * _udata /*in,out */ , void UNUSED * _rt_key /*in,out */ , hbool_t *rt_key_changed /*out */ ) { - H5F_istore_key_t *lt_key = (H5F_istore_key_t *)_lt_key; + H5D_istore_key_t *lt_key = (H5D_istore_key_t *)_lt_key; H5B_ins_t ret_value=H5B_INS_REMOVE; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_remove,H5B_INS_ERROR); - - /* Check for overlap with the sieve buffer and reset it */ - if (H5F_sieve_overlap_clear(f, dxpl_id, addr, (hsize_t)lt_key->nbytes)<0) - HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, H5B_INS_ERROR, "unable to clear sieve buffer"); + FUNC_ENTER_NOAPI(H5D_istore_remove,H5B_INS_ERROR); /* Remove raw data chunk from file */ H5MF_xfree(f, H5FD_MEM_DRAW, dxpl_id, addr, (hsize_t)lt_key->nbytes); @@ -2675,11 +2663,11 @@ H5F_istore_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key /*in,out done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_remove() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_initialize_by_extent + * Function: H5D_istore_initialize_by_extent * * Purpose: This function searches for chunks that have to be initialized with the fill * value both in the raw data cache and in the B-tree. @@ -2692,7 +2680,7 @@ done: * * Comments: * - * (See the example of H5F_istore_prune_by_extent) + * (See the example of H5D_istore_prune_by_extent) * Next, there are seven chunks where the database extent boundary is * within the chunk. We find those seven just like we did with the previous nine. * Fot the ones that are allocated we initialize the part that lies outside the boundary @@ -2703,9 +2691,8 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, const H5O_layout_t *layout, - H5P_genplist_t *dc_plist, const H5S_t * space) +H5D_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, + hid_t dxpl_id, H5D_t *dset) { uint8_t *chunk = NULL; /*the file chunk */ unsigned idx_hint = 0; /*input value for H5F_istore_lock */ @@ -2728,20 +2715,25 @@ H5F_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_ca int i, carry; /*counters */ unsigned u; int found = 0; /*initialize this entry */ + H5P_genplist_t *dc_plist; /* Property list */ H5O_pline_t pline; /* I/O pipeline information */ H5O_fill_t fill; /* Fill value information */ H5D_fill_time_t fill_time; /* Fill time information */ H5D_storage_t store; /* Dataset storage information */ herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_initialize_by_extent, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_initialize_by_extent, FAIL); /* Check args */ assert(f); - assert(layout && H5D_CHUNKED == layout->type); - assert(layout->u.chunk.ndims > 0 && layout->u.chunk.ndims <= H5O_LAYOUT_NDIMS); - assert(H5F_addr_defined(layout->u.chunk.addr)); - assert(space); + assert(dxpl_cache); + assert(dset && H5D_CHUNKED == dset->layout.type); + assert(dset->layout.u.chunk.ndims > 0 && dset->layout.u.chunk.ndims <= H5O_LAYOUT_NDIMS); + assert(H5F_addr_defined(dset->layout.u.chunk.addr)); + + /* Get dataset's creation property list */ + if (NULL == (dc_plist = H5I_object(dset->dcpl_id))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset creation property list") /* Get necessary properties from property list */ if(H5P_get(dc_plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0) @@ -2756,7 +2748,7 @@ H5F_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_ca HDmemset(count, 0, sizeof(count)); /* Go get the rank & dimensions */ - if((srank = H5S_get_simple_extent_dims(space, curr_dims, NULL)) < 0) + if((srank = H5S_get_simple_extent_dims(dset->space, curr_dims, NULL)) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset dimensions"); H5_ASSIGN_OVERFLOW(rank,srank,int,unsigned); @@ -2765,9 +2757,9 @@ H5F_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_ca size[u] = curr_dims[u]; /* Round up to the next integer # of chunks, to accomodate partial chunks */ - chunks[u] = ((curr_dims[u]+layout->u.chunk.dim[u])-1) / layout->u.chunk.dim[u]; + chunks[u] = ((curr_dims[u]+dset->layout.u.chunk.dim[u])-1) / dset->layout.u.chunk.dim[u]; } /* end for */ - size[u] = layout->u.chunk.dim[u]; + size[u] = dset->layout.u.chunk.dim[u]; /* Get the "down" sizes for each dimension */ if(H5V_array_down(rank,chunks,down_chunks)<0) @@ -2775,7 +2767,7 @@ H5F_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_ca /* Create a data space for a chunk & set the extent */ for(u = 0; u < rank; u++) - chunk_dims[u] = layout->u.chunk.dim[u]; + chunk_dims[u] = dset->layout.u.chunk.dim[u]; if(NULL == (space_chunk = H5S_create_simple(rank,chunk_dims,NULL))) HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "can't create simple dataspace"); @@ -2784,18 +2776,18 @@ H5F_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_ca * loop through the chunks copying each chunk from the application to the * chunk cache. */ - for(u = 0; u < layout->u.chunk.ndims; u++) { - idx_max[u] = (size[u] - 1) / layout->u.chunk.dim[u] + 1; + for(u = 0; u < dset->layout.u.chunk.ndims; u++) { + idx_max[u] = (size[u] - 1) / dset->layout.u.chunk.dim[u] + 1; idx_cur[u] = 0; } /* end for */ /* Loop over all chunks */ carry=0; while(carry==0) { - for(u = 0, naccessed = 1; u < layout->u.chunk.ndims; u++) { + for(u = 0, naccessed = 1; u < dset->layout.u.chunk.ndims; u++) { /* The location and size of the chunk being accessed */ - chunk_offset[u] = idx_cur[u] * (hssize_t)(layout->u.chunk.dim[u]); - sub_size[u] = MIN((idx_cur[u] + 1) * layout->u.chunk.dim[u], + chunk_offset[u] = idx_cur[u] * (hssize_t)(dset->layout.u.chunk.dim[u]); + sub_size[u] = MIN((idx_cur[u] + 1) * dset->layout.u.chunk.dim[u], size[u]) - chunk_offset[u]; naccessed *= sub_size[u]; } /* end for */ @@ -2804,8 +2796,8 @@ H5F_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_ca * Figure out what chunks have to be initialized. These are the chunks where the dataspace * extent boundary is within the chunk */ - for(u = 0, found = 0; u < layout->u.chunk.ndims - 1; u++) { - end_chunk = chunk_offset[u] + layout->u.chunk.dim[u]; + for(u = 0, found = 0; u < dset->layout.u.chunk.ndims - 1; u++) { + end_chunk = chunk_offset[u] + dset->layout.u.chunk.dim[u]; if(end_chunk > size[u]) { found = 1; break; @@ -2815,27 +2807,27 @@ H5F_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_ca if(found) { /* Calculate the index of this chunk */ - if(H5V_chunk_index(rank,chunk_offset,layout->u.chunk.dim,down_chunks,&store.chunk.index)<0) + if(H5V_chunk_index(rank,chunk_offset,dset->layout.u.chunk.dim,down_chunks,&store.chunk.index)<0) HGOTO_ERROR (H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index") store.chunk.offset=chunk_offset; - if(NULL == (chunk = H5F_istore_lock(f, dxpl_cache, dxpl_id, layout, &pline, &fill, fill_time, - NULL, &store, FALSE, &idx_hint))) + if(NULL == (chunk = H5D_istore_lock(f, dxpl_cache, dxpl_id, dset, + &store, NULL, FALSE, &idx_hint))) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to read raw data chunk"); if(H5S_select_all(space_chunk,1) < 0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to select space"); for(u = 0; u < rank; u++) - count[u] = MIN((idx_cur[u] + 1) * layout->u.chunk.dim[u], size[u] - chunk_offset[u]); + count[u] = MIN((idx_cur[u] + 1) * dset->layout.u.chunk.dim[u], size[u] - chunk_offset[u]); -#ifdef H5F_ISTORE_DEBUG +#ifdef H5D_ISTORE_DEBUG HDfputs("cache:initialize:offset:[", stdout); - for(u = 0; u < layout->u.chunk.ndims - 1; u++) + for(u = 0; u < dset->layout.u.chunk.ndims - 1; u++) HDfprintf(stdout, "%s%Hd", u ? ", " : "", chunk_offset[u]); HDfputs("]", stdout); HDfputs(":count:[", stdout); - for(u = 0; u < layout->u.chunk.ndims - 1; u++) + for(u = 0; u < dset->layout.u.chunk.ndims - 1; u++) HDfprintf(stdout, "%s%Hd", u ? ", " : "", count[u]); HDfputs("]\n", stdout); #endif @@ -2852,13 +2844,13 @@ H5F_istore_initialize_by_extent(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_ca if(H5S_select_fill(fill.buf, (size_t)size[rank], space_chunk, chunk) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTENCODE, FAIL, "filling selection failed"); - if(H5F_istore_unlock(f, dxpl_cache, dxpl_id, layout, &pline, TRUE, - &store, idx_hint, chunk, (size_t)naccessed) < 0) + if(H5D_istore_unlock(f, dxpl_cache, dxpl_id, dset, &store, + TRUE, idx_hint, chunk, (size_t)naccessed) < 0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to unlock raw data chunk"); } /*found */ /* Increment indices */ - for(i = layout->u.chunk.ndims - 1, carry = 1; i >= 0 && carry; --i) { + for(i = dset->layout.u.chunk.ndims - 1, carry = 1; i >= 0 && carry; --i) { if(++idx_cur[i] >= idx_max[i]) idx_cur[i] = 0; else @@ -2871,11 +2863,11 @@ done: H5S_close(space_chunk); FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_initialize_by_extent() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_delete + * Function: H5D_istore_delete * * Purpose: Delete raw data storage for entire dataset (i.e. all chunks) * @@ -2890,34 +2882,15 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_delete(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout) +H5D_istore_delete(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout) { - H5D_dxpl_cache_t dxpl_cache; /* Cached data transfer properties */ - H5F_istore_ud1_t udata; /* User data for B-tree iterator call */ - H5F_rdcc_t *rdcc = &(f->shared->rdcc); /* File's raw data chunk cache */ - H5F_rdcc_ent_t *ent, *next; /* Pointers to cache entries */ + H5D_istore_ud1_t udata; /* User data for B-tree iterator call */ herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_delete, FAIL); - - /* Fill the DXPL cache values for later use */ - if (H5D_get_dxpl_cache(dxpl_id,&dxpl_cache)<0) - HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache") + FUNC_ENTER_NOAPI(H5D_istore_delete, FAIL); /* Check if the B-tree has been created in the file */ if(H5F_addr_defined(layout->u.chunk.addr)) { - /* Iterate through the entries in the cache, checking for the chunks to be deleted */ - for (ent=rdcc->head; ent; ent=next) { - /* Get pointer to next node, in case this one is deleted */ - next=ent->next; - - /* Is the chunk to be deleted this cache entry? */ - if(layout->u.chunk.addr==ent->layout.u.chunk.addr) - /* Remove entry without flushing */ - if (H5F_istore_preempt(f, &dxpl_cache, dxpl_id, ent, FALSE )<0) - HGOTO_ERROR (H5E_IO, H5E_CANTFLUSH, FAIL, "unable to flush one or more raw data chunks"); - } /* end for */ - /* Set up user data for B-tree deletion */ HDmemset(&udata, 0, sizeof udata); udata.mesg = *layout; @@ -2929,11 +2902,11 @@ H5F_istore_delete(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout) done: FUNC_LEAVE_NOAPI(ret_value); -} /* end H5F_istore_delete() */ +} /* end H5D_istore_delete() */ /*------------------------------------------------------------------------- - * Function: H5F_istore_update_cache + * Function: H5D_istore_update_cache * * Purpose: Update any cached chunks index values after the dataspace * size has changed @@ -2949,11 +2922,11 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_update_cache(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, const H5S_t * space) +H5D_istore_update_cache(H5F_t *f, hid_t dxpl_id, H5D_t *dset) { - H5F_rdcc_t *rdcc = &(f->shared->rdcc); /*raw data chunk cache */ - H5F_rdcc_ent_t *ent, *next; /*cache entry */ - H5F_rdcc_ent_t *old_ent; /* Old cache entry */ + H5D_rdcc_t *rdcc = &(dset->cache.chunk); /*raw data chunk cache */ + H5D_rdcc_ent_t *ent, *next; /*cache entry */ + H5D_rdcc_ent_t *old_ent; /* Old cache entry */ H5D_dxpl_cache_t dxpl_cache; /* Cached data transfer properties */ int srank; /*current # of dimensions (signed) */ unsigned rank; /*current # of dimensions */ @@ -2961,29 +2934,25 @@ H5F_istore_update_cache(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, con hsize_t chunks[H5O_LAYOUT_NDIMS]; /*current number of chunks in each dimension */ hsize_t down_chunks[H5O_LAYOUT_NDIMS]; /* "down" size of number of elements in each dimension */ hsize_t idx; /* Chunk index */ - hsize_t temp_idx; /* temporary index number */ unsigned old_idx; /* Previous index number */ unsigned u; /*counters */ herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_update_cache, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_update_cache, FAIL); /* Check args */ assert(f); - assert(layout && H5D_CHUNKED == layout->type); - assert(layout->u.chunk.ndims > 0 && layout->u.chunk.ndims <= H5O_LAYOUT_NDIMS); - assert(space); + assert(dset && H5D_CHUNKED == dset->layout.type); + assert(dset->layout.u.chunk.ndims > 0 && dset->layout.u.chunk.ndims <= H5O_LAYOUT_NDIMS); /* Go get the rank & dimensions */ - if((srank = H5S_get_simple_extent_dims(space, curr_dims, NULL)) < 0) + if((srank = H5S_get_simple_extent_dims(dset->space, curr_dims, NULL)) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset dimensions"); H5_ASSIGN_OVERFLOW(rank,srank,int,unsigned); - /* Copy current dimensions */ - for(u = 0; u < rank; u++) { - /* Round up to the next integer # of chunks, to accomodate partial chunks */ - chunks[u] = ((curr_dims[u]+layout->u.chunk.dim[u])-1) / layout->u.chunk.dim[u]; - } /* end for */ + /* Round up to the next integer # of chunks, to accomodate partial chunks */ + for(u = 0; u < rank; u++) + chunks[u] = ((curr_dims[u]+dset->layout.u.chunk.dim[u])-1) / dset->layout.u.chunk.dim[u]; /* Get the "down" sizes for each dimension */ if(H5V_array_down(rank,chunks,down_chunks)<0) @@ -2997,38 +2966,34 @@ H5F_istore_update_cache(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout, con for(ent = rdcc->head; ent; ent = next) { next=ent->next; - /* Make certain we are dealing with the correct B-tree, etc */ - if (H5F_addr_eq(layout->u.chunk.addr, ent->layout.u.chunk.addr)) { - /* Calculate the index of this chunk */ - if(H5V_chunk_index(rank,ent->offset,layout->u.chunk.dim,down_chunks,&idx)<0) - HGOTO_ERROR (H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index") + /* Calculate the index of this chunk */ + if(H5V_chunk_index(rank,ent->offset,dset->layout.u.chunk.dim,down_chunks,&idx)<0) + HGOTO_ERROR (H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index") - /* Compute the index for the chunk entry */ - temp_idx = idx + (hsize_t)(layout->u.chunk.addr); - old_idx=ent->idx; /* Save for later */ - ent->idx=H5F_HASH(f,temp_idx); + /* Compute the index for the chunk entry */ + old_idx=ent->idx; /* Save for later */ + ent->idx=H5D_HASH(dset,idx); - if(old_idx!=ent->idx) { - /* Check if there is already a chunk at this chunk's new location */ - old_ent = rdcc->slot[ent->idx]; - if(old_ent!=NULL) { - assert(old_ent->locked==0); + if(old_idx!=ent->idx) { + /* Check if there is already a chunk at this chunk's new location */ + old_ent = rdcc->slot[ent->idx]; + if(old_ent!=NULL) { + assert(old_ent->locked==0); - /* Check if we are removing the entry we would walk to next */ - if(old_ent==next) - next=old_ent->next; + /* Check if we are removing the entry we would walk to next */ + if(old_ent==next) + next=old_ent->next; - /* Remove the old entry from the cache */ - if (H5F_istore_preempt(f, &dxpl_cache, dxpl_id, old_ent, TRUE )<0) - HGOTO_ERROR (H5E_IO, H5E_CANTFLUSH, FAIL, "unable to flush one or more raw data chunks"); - } /* end if */ + /* Remove the old entry from the cache */ + if (H5D_istore_preempt(f, &dxpl_cache, dxpl_id, dset, old_ent, TRUE )<0) + HGOTO_ERROR (H5E_IO, H5E_CANTFLUSH, FAIL, "unable to flush one or more raw data chunks"); + } /* end if */ - /* Insert this chunk into correct location in hash table */ - rdcc->slot[ent->idx]=ent; + /* Insert this chunk into correct location in hash table */ + rdcc->slot[ent->idx]=ent; - /* Null out previous location */ - rdcc->slot[old_idx]=NULL; - } /* end if */ + /* Null out previous location */ + rdcc->slot[old_idx]=NULL; } /* end if */ } /* end for */ @@ -3038,7 +3003,7 @@ done: /*------------------------------------------------------------------------- - * Function: H5F_istore_dump_btree + * Function: H5D_istore_dump_btree * * Purpose: Prints information about the storage B-tree to the specified * stream. @@ -3056,29 +3021,29 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_dump_btree(H5F_t *f, hid_t dxpl_id, FILE *stream, unsigned ndims, haddr_t addr) +H5D_istore_dump_btree(H5F_t *f, hid_t dxpl_id, FILE *stream, unsigned ndims, haddr_t addr) { - H5F_istore_ud1_t udata; + H5D_istore_ud1_t udata; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_dump_btree, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_dump_btree, FAIL); HDmemset(&udata, 0, sizeof udata); udata.mesg.u.chunk.ndims = ndims; udata.stream = stream; if(stream) HDfprintf(stream, " Address: %a\n",addr); - if(H5B_iterate(f, dxpl_id, H5B_ISTORE, H5F_istore_iter_dump, addr, &udata)<0) + if(H5B_iterate(f, dxpl_id, H5B_ISTORE, H5D_istore_iter_dump, addr, &udata)<0) HGOTO_ERROR(H5E_IO, H5E_CANTINIT, 0, "unable to iterate over chunk B-tree"); done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5D_istore_dump_btree() */ -#ifdef H5F_ISTORE_DEBUG +#ifdef H5D_ISTORE_DEBUG /*------------------------------------------------------------------------- - * Function: H5F_istore_stats + * Function: H5D_istore_stats * * Purpose: Print raw data cache statistics to the debug stream. If * HEADERS is non-zero then print table column headers, @@ -3094,21 +3059,20 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_stats (H5F_t *f, hbool_t headers) +H5D_istore_stats (H5D_t *dset, hbool_t headers) { - H5F_rdcc_t *rdcc = &(f->shared->rdcc); + H5D_rdcc_t *rdcc = &(dset->cache.chunk); double miss_rate; char ascii[32]; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_stats, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_stats, FAIL); if (!H5DEBUG(AC)) HGOTO_DONE(SUCCEED); if (headers) { - fprintf(H5DEBUG(AC), "H5F: raw data cache statistics for file %s\n", - f->name); + fprintf(H5DEBUG(AC), "H5D: raw data cache statistics\n"); fprintf(H5DEBUG(AC), " %-18s %8s %8s %8s %8s+%-8s\n", "Layer", "Hits", "Misses", "MissRate", "Inits", "Flushes"); fprintf(H5DEBUG(AC), " %-18s %8s %8s %8s %8s-%-8s\n", @@ -3139,12 +3103,12 @@ H5F_istore_stats (H5F_t *f, hbool_t headers) done: FUNC_LEAVE_NOAPI(ret_value); -} -#endif /* H5F_ISTORE_DEBUG */ +} /* end H5D_istore_stats() */ +#endif /* H5D_ISTORE_DEBUG */ /*------------------------------------------------------------------------- - * Function: H5F_istore_debug + * Function: H5D_istore_debug * * Purpose: Debugs a B-tree node for indexed raw data storage. * @@ -3159,13 +3123,13 @@ done: *------------------------------------------------------------------------- */ herr_t -H5F_istore_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent, +H5D_istore_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent, int fwidth, int ndims) { - H5F_istore_ud1_t udata; + H5D_istore_ud1_t udata; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5F_istore_debug, FAIL); + FUNC_ENTER_NOAPI(H5D_istore_debug, FAIL); HDmemset (&udata, 0, sizeof udata); udata.mesg.u.chunk.ndims = ndims; @@ -3174,5 +3138,4 @@ H5F_istore_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int inden done: FUNC_LEAVE_NOAPI(ret_value); -} - +} /* end H5D_istore_debug() */ diff --git a/src/H5Fpkg.h b/src/H5Fpkg.h index 94655f9..ce850ab 100644 --- a/src/H5Fpkg.h +++ b/src/H5Fpkg.h @@ -86,20 +86,6 @@ # define H5F_OVERFLOW_HSIZET2OFFT(X) 0 #endif -/* The raw data chunk cache */ -typedef struct H5F_rdcc_t { - unsigned ninits; /* Number of chunk creations */ - unsigned nhits; /* Number of cache hits */ - unsigned nmisses;/* Number of cache misses */ - unsigned nflushes;/* Number of cache flushes */ - size_t nbytes; /* Current cached raw data in bytes */ - size_t nslots; /* Number of chunk slots allocated */ - struct H5F_rdcc_ent_t *head; /* Head of doubly linked list */ - struct H5F_rdcc_ent_t *tail; /* Tail of doubly linked list */ - int nused; /* Number of chunk slots in use */ - struct H5F_rdcc_ent_t **slot; /* Chunk slots, each points to a chunk*/ -} H5F_rdcc_t; - /* * Define the structure to store the file information for HDF5 files. One of * these structures is allocated per file, not per H5Fopen(). That is, set of @@ -118,19 +104,20 @@ typedef struct H5F_file_t { size_t sizeof_size; /* Size of offsets in file */ unsigned sym_leaf_k; /* Size of leaves in symbol tables */ unsigned btree_k[H5B_NUM_BTREE_ID]; /* B-tree key values for each type */ - haddr_t super_addr; /* Absolute address of super block */ haddr_t base_addr; /* Absolute base address for rel.addrs. */ haddr_t freespace_addr; /* Relative address of free-space info */ haddr_t driver_addr; /* File driver information block address*/ + unsigned super_chksum; /* Superblock checksum */ unsigned drvr_chksum; /* Driver info block checksum */ struct H5AC_t *cache; /* The object cache */ hid_t fcpl_id; /* File creation property list ID */ - int mdc_nelmts; /* Size of meta data cache (elements) */ + int mdc_nelmts; /* Size of meta data cache (elements) */ size_t rdcc_nelmts; /* Size of raw data chunk cache (elmts) */ size_t rdcc_nbytes; /* Size of raw data chunk cache (bytes) */ double rdcc_w0; /* Preempt read chunks first? [0.0..1.0]*/ + size_t sieve_buf_size; /* Size of the data sieve buffer allocated (in bytes) */ hsize_t threshold; /* Threshold for alignment */ hsize_t alignment; /* Alignment */ unsigned gc_ref; /* Garbage-collect references? */ @@ -138,15 +125,6 @@ typedef struct H5F_file_t { int ncwfs; /* Num entries on cwfs list */ struct H5HG_heap_t **cwfs; /* Global heap cache */ H5FO_t *open_objs; /* Open objects in file */ - - /* Data Sieve Buffering fields */ - unsigned char *sieve_buf; /* Buffer to hold data sieve buffer */ - haddr_t sieve_loc; /* File location (offset) of the data sieve buffer */ - size_t sieve_size; /* Size of the data sieve buffer used (in bytes) */ - size_t sieve_buf_size; /* Size of the data sieve buffer allocated (in bytes) */ - unsigned sieve_dirty; /* Flag to indicate that the data sieve buffer is dirty */ - - H5F_rdcc_t rdcc; /* Raw data chunk cache */ H5F_close_degree_t fc_degree; /* File close behavior degree */ } H5F_file_t; @@ -196,50 +174,6 @@ union H5D_storage_t; H5_DLL void H5F_encode_length_unusual(const H5F_t *f, uint8_t **p, uint8_t *l); #endif /* NOT_YET */ H5_DLL herr_t H5F_mountpoint(struct H5G_entry_t *find/*in,out*/); -H5_DLL herr_t H5F_sieve_overlap_clear(const H5F_t *f, hid_t dxpl_id, haddr_t addr, hsize_t size); - -/* Functions that operate on indexed storage */ -H5_DLL herr_t H5F_istore_init (H5F_t *f); -H5_DLL herr_t H5F_istore_flush (H5F_t *f, hid_t dxpl_id, unsigned flags); -H5_DLL herr_t H5F_istore_dest (H5F_t *f, hid_t dxpl_id); -H5_DLL ssize_t H5F_istore_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, - const struct H5O_layout_t *layout, const struct H5D_dcpl_cache_t *dcpl_cache, - const union H5D_storage_t *store, - size_t chunk_max_nseq, size_t *chunk_curr_seq, size_t chunk_len_arr[], hsize_t chunk_offset_arr[], - size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], - void *buf); -H5_DLL ssize_t H5F_istore_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, - const struct H5O_layout_t *layout, const struct H5D_dcpl_cache_t *dcpl_cache, - const union H5D_storage_t *store, - size_t chunk_max_nseq, size_t *chunk_curr_seq, size_t chunk_len_arr[], hsize_t chunk_offset_arr[], - size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], - const void *buf); -#ifdef H5F_ISTORE_DEBUG -H5_DLL herr_t H5F_istore_stats (H5F_t *f, hbool_t headers); -#endif /* H5F_ISTORE_DEBUG */ -H5_DLL herr_t H5F_istore_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, - int indent, int fwidth, int ndims); - -/* Functions that operate on contiguous storage wrt superblock */ -H5_DLL ssize_t H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr, - size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[], - size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], - hid_t dxpl_id, void *buf); -H5_DLL ssize_t H5F_contig_writevv(H5F_t *f, hsize_t _max_data, haddr_t _addr, - size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[], - size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], - hid_t dxpl_id, const void *buf); - -/* Functions that operate on compact dataset storage */ -H5_DLL ssize_t H5F_compact_readvv(H5F_t *f, const struct H5O_layout_t *layout, - size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_size_arr[], hsize_t dset_offset_arr[], - size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_size_arr[], hsize_t mem_offset_arr[], - hid_t dxpl_id, void *buf); -H5_DLL ssize_t H5F_compact_writevv(H5F_t *f, struct H5O_layout_t *layout, - size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_size_arr[], hsize_t dset_offset_arr[], - size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_size_arr[], hsize_t mem_offset_arr[], - hid_t dxpl_id, const void *buf); + #endif diff --git a/src/H5Fprivate.h b/src/H5Fprivate.h index c16c9f1..6950178 100644 --- a/src/H5Fprivate.h +++ b/src/H5Fprivate.h @@ -204,11 +204,21 @@ typedef struct H5F_t H5F_t; #define H5F_SYM_LEAF_K(F) ((F)->shared->sym_leaf_k) /* B-tree key value size */ #define H5F_KVALUE(F,T) ((F)->shared->btree_k[(T)->id]) +/* Raw data cache values */ +#define H5F_RDCC_NELMTS(F) ((F)->shared->rdcc_nelmts) +#define H5F_RDCC_NBYTES(F) ((F)->shared->rdcc_nbytes) +#define H5F_RDCC_W0(F) ((F)->shared->rdcc_w0) +/* Check for file driver feature enabled */ +#define H5F_HAS_FEATURE(F,FL) ((F)->shared->lf->feature_flags&(FL)) #else /* H5F_PACKAGE */ #define H5F_SIZEOF_ADDR(F) (H5F_sizeof_addr(F)) #define H5F_SIZEOF_SIZE(F) (H5F_sizeof_size(F)) #define H5F_SYM_LEAF_K(F) (H5F_sym_leaf_k(F)) #define H5F_KVALUE(F,T) (H5F_Kvalue(F,T)) +#define H5F_RDCC_NELMTS(F) (H5F_rdcc_nelmts(F)) +#define H5F_RDCC_NBYTES(F) (H5F_rdcc_nbytes(F)) +#define H5F_RDCC_W0(F) (H5F_rdcc_w0(F)) +#define H5F_HAS_FEATURE(F,FL) (H5F_has_feature(F,FL)) #endif /* H5F_PACKAGE */ @@ -374,13 +384,6 @@ typedef struct H5F_t H5F_t; /* Forward declarations for prototype arguments */ struct H5B_class_t; -union H5D_storage_t; -struct H5O_fill_t; -struct H5O_layout_t; -struct H5P_genplist_t; -struct H5S_t; -struct H5D_dxpl_cache_t; -struct H5D_dcpl_cache_t; /* Private functions, not part of the publicly documented API */ H5_DLL herr_t H5F_init(void); @@ -391,6 +394,12 @@ H5_DLL hid_t H5F_get_id(H5F_t *file); H5_DLL int H5F_get_obj_count(const H5F_t *f, unsigned types); H5_DLL int H5F_get_obj_ids(const H5F_t *f, unsigned types, int max_objs, hid_t *obj_id_list); H5_DLL haddr_t H5F_get_base_addr(const H5F_t *f); +H5_DLL haddr_t H5F_get_eoa(const H5F_t *f); +#ifdef H5_HAVE_PARALLEL +H5_DLL int H5F_mpi_get_rank(const H5F_t *f); +H5_DLL int H5F_mpi_get_size(const H5F_t *f); +H5_DLL MPI_Comm H5F_mpi_get_comm(const H5F_t *f); +#endif /* H5_HAVE_PARALLEL */ /* Functions than check file mounting information */ H5_DLL htri_t H5F_is_mount(const H5F_t *file); @@ -401,6 +410,10 @@ H5_DLL size_t H5F_sizeof_addr(const H5F_t *f); H5_DLL size_t H5F_sizeof_size(const H5F_t *f); H5_DLL unsigned H5F_sym_leaf_k(const H5F_t *f); H5_DLL unsigned H5F_Kvalue(const H5F_t *f, const struct H5B_class_t *type); +H5_DLL hbool_t H5F_has_feature(const H5F_t *f, unsigned feature); +H5_DLL size_t H5F_rdcc_nbytes(const H5F_t *f); +H5_DLL size_t H5F_rdcc_nelmts(const H5F_t *f); +H5_DLL double H5F_rdcc_w0(const H5F_t *f); /* Functions that operate on blocks of bytes wrt super block */ H5_DLL herr_t H5F_block_read(const H5F_t *f, H5FD_mem_t type, haddr_t addr, @@ -408,60 +421,6 @@ H5_DLL herr_t H5F_block_read(const H5F_t *f, H5FD_mem_t type, haddr_t addr, H5_DLL 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); -/* Functions that operate on byte sequences */ -H5_DLL herr_t H5F_seq_read(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, const struct H5O_layout_t *layout, - const struct H5D_dcpl_cache_t *dcpl_cache, const union H5D_storage_t *store, - size_t seq_len, hsize_t file_offset, void *_buf/*out*/); -H5_DLL herr_t H5F_seq_write (H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, struct H5O_layout_t *layout, - const struct H5D_dcpl_cache_t *dcpl_cache, const union H5D_storage_t *store, - size_t seq_len, hsize_t file_offset, const void *_buf); - -/* Functions that operate on byte sequences in memory and on disk */ -H5_DLL ssize_t H5F_seq_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, const struct H5O_layout_t *layout, - const struct H5D_dcpl_cache_t *dcpl_cache, const union H5D_storage_t *store, - size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[], - size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], - void *buf); -H5_DLL ssize_t H5F_seq_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, struct H5O_layout_t *layout, - const struct H5D_dcpl_cache_t *dcpl_cache, const union H5D_storage_t *store, - size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[], - size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], - const void *buf); - -/* Functions that operate on contiguous storage */ -H5_DLL herr_t H5F_contig_create(H5F_t *f, hid_t dxpl_id, - struct H5O_layout_t *layout); -H5_DLL herr_t H5F_contig_fill(H5F_t *f, hid_t dxpl_id, - struct H5O_layout_t *layout, const struct H5S_t *space, - const struct H5O_fill_t *fill, size_t elmt_size); -H5_DLL herr_t H5F_contig_delete(H5F_t *f, hid_t dxpl_id, - const struct H5O_layout_t *layout); - -/* Functions that operate on indexed storage */ -H5_DLL herr_t H5F_istore_create(H5F_t *f, hid_t dxpl_id, - struct H5O_layout_t *layout/*in,out*/); -H5_DLL herr_t H5F_istore_allocate (H5F_t *f, hid_t dxpl_id, - const struct H5O_layout_t *layout, const hsize_t *space_dim, - struct H5P_genplist_t *dc_plist, hbool_t full_overwrite); -H5_DLL hsize_t H5F_istore_allocated(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout); -H5_DLL herr_t H5F_istore_dump_btree(H5F_t *f, hid_t dxpl_id, FILE *stream, unsigned ndims, - haddr_t addr); -H5_DLL herr_t H5F_istore_prune_by_extent( H5F_t *f, - const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, - const struct H5O_layout_t *layout, const struct H5S_t *space); -H5_DLL herr_t H5F_istore_initialize_by_extent( H5F_t *f, - const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, - const struct H5O_layout_t *layout, struct H5P_genplist_t *dc_plist, - const struct H5S_t *space ); -H5_DLL herr_t H5F_istore_delete(H5F_t *f, hid_t dxpl_id, - const struct H5O_layout_t *layout); -H5_DLL herr_t H5F_istore_update_cache(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout, - const struct H5S_t * space); - /* Address-related functions */ H5_DLL void H5F_addr_encode(const H5F_t *, uint8_t** /*in,out*/, haddr_t); H5_DLL void H5F_addr_decode(const H5F_t *, const uint8_t** /*in,out*/, diff --git a/src/H5Fseq.c b/src/H5Fseq.c index f8ecf00..5585315 100644 --- a/src/H5Fseq.c +++ b/src/H5Fseq.c @@ -23,16 +23,16 @@ * */ -#define H5F_PACKAGE /*suppress error about including H5Fpkg */ +#define H5D_PACKAGE /*suppress error about including H5Dpkg */ /* Pablo information */ /* (Put before include files to avoid problems with inline functions) */ -#define PABLO_MASK H5Fseq_mask +#define PABLO_MASK H5Dseq_mask #include "H5private.h" /* Generic Functions */ -#include "H5Dprivate.h" /* Datasets */ +#include "H5Dpkg.h" /* Datasets */ #include "H5Eprivate.h" /* Error handling */ -#include "H5Fpkg.h" /* Files */ +#include "H5Fprivate.h" /* Files */ #include "H5FDprivate.h" /* File drivers */ #include "H5Iprivate.h" /* IDs */ #include "H5MFprivate.h" /* File space management */ @@ -47,105 +47,7 @@ static int interface_initialize_g = 0; /*------------------------------------------------------------------------- - * Function: H5F_seq_read - * - * Purpose: Reads a sequence of bytes from a file dataset into a buffer in - * in memory. The data is read from file F and the array's size and - * storage information is in LAYOUT. External files are described - * according to the external file list, EFL. The sequence offset is - * DSET_OFFSET in the dataset (offsets are in terms of bytes) and the - * size of the hyperslab is SEQ_LEN. The total size of the file array - * is implied in the LAYOUT argument. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Quincey Koziol - * Thursday, September 28, 2000 - * - * Modifications: - * Re-written to use new vector I/O call - QAK, 7/7/01 - * - *------------------------------------------------------------------------- - */ -herr_t -H5F_seq_read(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, const H5O_layout_t *layout, - const struct H5D_dcpl_cache_t *dcpl_cache, const H5D_storage_t *store, - size_t seq_len, hsize_t dset_offset, void *buf/*out*/) -{ - hsize_t mem_off=0; /* Offset in memory */ - size_t mem_len=seq_len; /* Length in memory */ - size_t mem_curr_seq=0; /* "Current sequence" in memory */ - size_t dset_curr_seq=0; /* "Current sequence" in dataset */ - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5F_seq_read, FAIL); - - /* Check args */ - assert(f); - assert(layout); - assert(buf); - assert(TRUE==H5P_isa_class(dxpl_id,H5P_DATASET_XFER)); - - if (H5F_seq_readvv(f, dxpl_cache, dxpl_id, layout, dcpl_cache, store, 1, &dset_curr_seq, &seq_len, &dset_offset, 1, &mem_curr_seq, &mem_len, &mem_off, buf)<0) - HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "vector read failed"); - -done: - FUNC_LEAVE_NOAPI(ret_value); -} /* H5F_seq_read() */ - - -/*------------------------------------------------------------------------- - * Function: H5F_seq_write - * - * Purpose: Writes a sequence of bytes to a file dataset from a buffer in - * in memory. The data is written to file F and the array's size and - * storage information is in LAYOUT. External files are described - * according to the external file list, EFL. The sequence offset is - * DSET_OFFSET in the dataset (offsets are in terms of bytes) and the - * size of the hyperslab is SEQ_LEN. The total size of the file array - * is implied in the LAYOUT argument. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Quincey Koziol - * Monday, October 9, 2000 - * - * Modifications: - * Re-written to use new vector I/O routine - QAK, 7/7/01 - * - *------------------------------------------------------------------------- - */ -herr_t -H5F_seq_write(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, H5O_layout_t *layout, - const struct H5D_dcpl_cache_t *dcpl_cache, const H5D_storage_t *store, - size_t seq_len, hsize_t dset_offset, const void *buf) -{ - hsize_t mem_off=0; /* Offset in memory */ - size_t mem_len=seq_len; /* Length in memory */ - size_t mem_curr_seq=0; /* "Current sequence" in memory */ - size_t dset_curr_seq=0; /* "Current sequence" in dataset */ - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5F_seq_write, FAIL); - - /* Check args */ - assert(f); - assert(layout); - assert(buf); - assert(TRUE==H5P_isa_class(dxpl_id,H5P_DATASET_XFER)); - - if (H5F_seq_writevv(f, dxpl_cache, dxpl_id, layout, dcpl_cache, store, 1, &dset_curr_seq, &seq_len, &dset_offset, 1, &mem_curr_seq, &mem_len, &mem_off, buf)<0) - HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "vector write failed"); - -done: - FUNC_LEAVE_NOAPI(ret_value); -} /* H5F_seq_write() */ - - -/*------------------------------------------------------------------------- - * Function: H5F_seq_readvv + * Function: H5D_seq_readvv * * Purpose: Reads in a vector of byte sequences from a file dataset into a * buffer in in memory. The data is read from file F and the array's size @@ -185,22 +87,20 @@ done: *------------------------------------------------------------------------- */ ssize_t -H5F_seq_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, - const struct H5O_layout_t *layout, - const struct H5D_dcpl_cache_t *dcpl_cache, const H5D_storage_t *store, +H5D_seq_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[], size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], void *buf/*out*/) { ssize_t ret_value; /* Return value */ - FUNC_ENTER_NOAPI(H5F_seq_readvv, FAIL); + FUNC_ENTER_NOAPI(H5D_seq_readvv, FAIL); /* Check args */ assert(f); assert(TRUE==H5P_isa_class(dxpl_id,H5P_DATASET_XFER)); /* Make certain we have the correct type of property list */ - assert(layout); - assert(dcpl_cache); + assert(dset); assert(dset_curr_seq); assert(*dset_curr_seqtype) { + switch (dset->layout.type) { case H5D_CONTIGUOUS: /* Read directly from file if the dataset is in an external file */ if (store && store->efl.nused>0) { @@ -227,17 +127,18 @@ H5F_seq_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_i HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "external data read failed"); } else { /* Pass along the vector of sequences to read */ - if((ret_value=H5F_contig_readvv(f, layout->u.contig.size, layout->u.contig.addr, + if((ret_value=H5D_contig_readvv(f, dxpl_id, dset, + dset->layout.u.contig.addr, dset->layout.u.contig.size, dset_max_nseq, dset_curr_seq, dset_len_arr, dset_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, - dxpl_id, buf))<0) + buf))<0) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "block read failed"); } /* end else */ break; case H5D_CHUNKED: assert(store); - if((ret_value=H5F_istore_readvv(f, dxpl_cache, dxpl_id, layout, dcpl_cache, store, + if((ret_value=H5D_istore_readvv(f, dxpl_cache, dxpl_id, dset, store, dset_max_nseq, dset_curr_seq, dset_len_arr, dset_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, buf))<0) @@ -246,10 +147,10 @@ H5F_seq_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_i case H5D_COMPACT: /* Pass along the vector of sequences to read */ - if((ret_value=H5F_compact_readvv(f, layout, + if((ret_value=H5D_compact_readvv(f, dxpl_id, dset, dset_max_nseq, dset_curr_seq, dset_len_arr, dset_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, - dxpl_id, buf))<0) + buf))<0) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "compact read failed"); break; @@ -260,11 +161,11 @@ H5F_seq_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_i done: FUNC_LEAVE_NOAPI(ret_value); -} /* H5F_seq_readvv() */ +} /* H5D_seq_readvv() */ /*------------------------------------------------------------------------- - * Function: H5F_seq_writevv + * Function: H5D_seq_writevv * * Purpose: Writes a vector of byte sequences from a buffer in memory into * a vector of byte sequences in a file dataset. The data is written to @@ -294,22 +195,20 @@ done: *------------------------------------------------------------------------- */ ssize_t -H5F_seq_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, struct H5O_layout_t *layout, - const struct H5D_dcpl_cache_t *dcpl_cache, const H5D_storage_t *store, +H5D_seq_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, + hid_t dxpl_id, struct H5D_t *dset, const H5D_storage_t *store, size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[], size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[], const void *buf) { ssize_t ret_value; /* Return value */ - FUNC_ENTER_NOAPI(H5F_seq_writevv, FAIL); + FUNC_ENTER_NOAPI(H5D_seq_writevv, FAIL); /* Check args */ assert(f); assert(TRUE==H5P_isa_class(dxpl_id,H5P_DATASET_XFER)); /* Make certain we have the correct type of property list */ - assert(layout); - assert(dcpl_cache); + assert(dset); assert(dset_curr_seq); assert(*dset_curr_seqtype) { + switch (dset->layout.type) { case H5D_CONTIGUOUS: /* Write directly to file if the dataset is in an external file */ if (store && store->efl.nused>0) { @@ -336,17 +235,18 @@ H5F_seq_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "external data write failed"); } else { /* Pass along the vector of sequences to write */ - if ((ret_value=H5F_contig_writevv(f, layout->u.contig.size, layout->u.contig.addr, + if ((ret_value=H5D_contig_writevv(f, dxpl_id, dset, + dset->layout.u.contig.addr, dset->layout.u.contig.size, dset_max_nseq, dset_curr_seq, dset_len_arr, dset_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, - dxpl_id, buf))<0) + buf))<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "block write failed"); } /* end else */ break; case H5D_CHUNKED: assert(store); - if((ret_value=H5F_istore_writevv(f, dxpl_cache, dxpl_id, layout, dcpl_cache, store, + if((ret_value=H5D_istore_writevv(f, dxpl_cache, dxpl_id, dset, store, dset_max_nseq, dset_curr_seq, dset_len_arr, dset_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, buf))<0) @@ -355,10 +255,10 @@ H5F_seq_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, case H5D_COMPACT: /* Pass along the vector of sequences to write */ - if((ret_value=H5F_compact_writevv(f, layout, + if((ret_value=H5D_compact_writevv(f, dxpl_id, dset, dset_max_nseq, dset_curr_seq, dset_len_arr, dset_offset_arr, mem_max_nseq, mem_curr_seq, mem_len_arr, mem_offset_arr, - dxpl_id, buf))<0) + buf))<0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "compact write failed"); break; @@ -369,4 +269,4 @@ H5F_seq_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, done: FUNC_LEAVE_NOAPI(ret_value); -} /* H5F_seq_writevv() */ +} /* H5D_seq_writevv() */ diff --git a/src/H5Olayout.c b/src/H5Olayout.c index 63c41bc..1077a37 100644 --- a/src/H5Olayout.c +++ b/src/H5Olayout.c @@ -589,13 +589,13 @@ H5O_layout_delete(H5F_t *f, hid_t dxpl_id, const void *_mesg) case H5D_CONTIGUOUS: /* Contiguous block on disk */ /* Free the file space for the raw data */ - if (H5F_contig_delete(f, dxpl_id, mesg)<0) + if (H5D_contig_delete(f, dxpl_id, mesg)<0) HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free raw data"); break; case H5D_CHUNKED: /* Chunked blocks on disk */ /* Free the file space for the raw data */ - if (H5F_istore_delete(f, dxpl_id, mesg)<0) + if (H5D_istore_delete(f, dxpl_id, mesg)<0) HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free raw data"); break; diff --git a/src/H5Smpio.c b/src/H5Smpio.c index 0d8b537..f32cf7a 100644 --- a/src/H5Smpio.c +++ b/src/H5Smpio.c @@ -68,7 +68,7 @@ H5S_mpio_space_type( const H5S_t *space, size_t elmt_size, hsize_t *extra_offset, hbool_t *is_derived_type ); static herr_t -H5S_mpio_spaces_xfer(H5F_t *f, const H5O_layout_t *layout, size_t elmt_size, +H5S_mpio_spaces_xfer(H5F_t *f, const H5D_t *dset, size_t elmt_size, const H5S_t *file_space, const H5S_t *mem_space, hid_t dxpl_id, void *buf/*out*/, hbool_t do_write); @@ -627,7 +627,7 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5S_mpio_spaces_xfer(H5F_t *f, const H5O_layout_t *layout, size_t elmt_size, +H5S_mpio_spaces_xfer(H5F_t *f, const H5D_t *dset, size_t elmt_size, const H5S_t *file_space, const H5S_t *mem_space, hid_t dxpl_id, void *_buf /*out*/, hbool_t do_write ) @@ -647,7 +647,7 @@ H5S_mpio_spaces_xfer(H5F_t *f, const H5O_layout_t *layout, size_t elmt_size, /* Check args */ assert (f); - assert (layout); + assert (dset); assert (file_space); assert (mem_space); assert (buf); @@ -673,14 +673,9 @@ H5S_mpio_spaces_xfer(H5F_t *f, const H5O_layout_t *layout, size_t elmt_size, &mft_is_derived )<0) HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL,"couldn't create MPI file type"); - /* Use the absolute base address of the dataset (or chunk, eventually) as - * the address to read from. This should be used as the diplacement for - * a call to MPI_File_set_view() in the read or write call. - */ - assert(layout->type==H5D_CONTIGUOUS); - addr = f->shared->base_addr + layout->u.contig.addr + mpi_file_offset; + addr = H5D_contig_get_addr(dset) + mpi_file_offset; #ifdef H5Smpi_DEBUG - HDfprintf(stderr, "spaces_xfer: addr=%a\n", addr ); + HDfprintf(stderr, "spaces_xfer: relative addr=%a\n", addr ); #endif /* @@ -696,10 +691,10 @@ H5S_mpio_spaces_xfer(H5F_t *f, const H5O_layout_t *layout, size_t elmt_size, /* transfer the data */ if (do_write) { - if (H5FD_write(f->shared->lf, H5FD_MEM_DRAW, dxpl_id, addr, mpi_buf_count, buf) <0) + if (H5F_block_write(f, H5FD_MEM_DRAW, addr, mpi_buf_count, dxpl_id, buf) <0) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL,"MPI write failed"); } else { - if ( H5FD_read (f->shared->lf, H5FD_MEM_DRAW, dxpl_id, addr, mpi_buf_count, buf) <0) + if (H5F_block_read (f, H5FD_MEM_DRAW, addr, mpi_buf_count, dxpl_id, buf) <0) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL,"MPI read failed"); } @@ -721,7 +716,7 @@ done: } FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5S_mpio_spaces_xfer() */ /*------------------------------------------------------------------------- @@ -745,22 +740,22 @@ done: *------------------------------------------------------------------------- */ herr_t -H5S_mpio_spaces_read(H5F_t *f, const H5O_layout_t *layout, - const H5D_dcpl_cache_t UNUSED *dcpl_cache, const H5D_storage_t UNUSED *store, +H5S_mpio_spaces_read(H5F_t *f, const H5D_dxpl_cache_t UNUSED *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t UNUSED *store, size_t UNUSED nelmts, size_t elmt_size, - const H5S_t *file_space, const H5S_t *mem_space, const H5D_dxpl_cache_t UNUSED *dxpl_cache, - hid_t dxpl_id, void *buf/*out*/) + const H5S_t *file_space, const H5S_t *mem_space, + void *buf/*out*/) { herr_t ret_value; FUNC_ENTER_NOAPI(H5S_mpio_spaces_read, FAIL); - ret_value = H5S_mpio_spaces_xfer(f, layout, elmt_size, file_space, + ret_value = H5S_mpio_spaces_xfer(f, dset, elmt_size, file_space, mem_space, dxpl_id, buf, 0/*read*/); done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5S_mpio_spaces_read() */ /*------------------------------------------------------------------------- @@ -784,23 +779,23 @@ done: *------------------------------------------------------------------------- */ herr_t -H5S_mpio_spaces_write(H5F_t *f, H5O_layout_t *layout, - const H5D_dcpl_cache_t UNUSED *dcpl_cache, const H5D_storage_t UNUSED *store, +H5S_mpio_spaces_write(H5F_t *f, const H5D_dxpl_cache_t UNUSED *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t UNUSED *store, size_t UNUSED nelmts, size_t elmt_size, - const H5S_t *file_space, const H5S_t *mem_space, const H5D_dxpl_cache_t UNUSED *dxpl_cache, - hid_t dxpl_id, const void *buf) + const H5S_t *file_space, const H5S_t *mem_space, + const void *buf) { herr_t ret_value; FUNC_ENTER_NOAPI(H5S_mpio_spaces_write, FAIL); /*OKAY: CAST DISCARDS CONST QUALIFIER*/ - ret_value = H5S_mpio_spaces_xfer(f, layout, elmt_size, file_space, + ret_value = H5S_mpio_spaces_xfer(f, dset, elmt_size, file_space, mem_space, dxpl_id, (void*)buf, 1/*write*/); done: FUNC_LEAVE_NOAPI(ret_value); -} +} /* end H5S_mpio_spaces_write() */ /*------------------------------------------------------------------------- diff --git a/src/H5Spkg.h b/src/H5Spkg.h index 48548e7..24fc8f3 100644 --- a/src/H5Spkg.h +++ b/src/H5Spkg.h @@ -245,17 +245,17 @@ H5_DLL herr_t H5S_none_get_seq_list(const H5S_t *space, unsigned flags, #ifdef H5_HAVE_PARALLEL /* MPI-IO function to read directly from app buffer to file rky980813 */ -H5_DLL herr_t H5S_mpio_spaces_read(H5F_t *f, const struct H5O_layout_t *layout, - const H5D_dcpl_cache_t *dcpl_cache, const H5D_storage_t *store, - size_t nelmts, size_t elmt_size, const H5S_t *file_space, - const H5S_t *mem_space, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, +H5_DLL herr_t H5S_mpio_spaces_read(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, + size_t nelmts, size_t elmt_size, + const H5S_t *file_space, const H5S_t *mem_space, void *buf/*out*/); /* MPI-IO function to write directly from app buffer to file rky980813 */ -H5_DLL herr_t H5S_mpio_spaces_write(H5F_t *f, struct H5O_layout_t *layout, - const H5D_dcpl_cache_t *dcpl_cache, const H5D_storage_t *store, - size_t nelmts, size_t elmt_size, const H5S_t *file_space, - const H5S_t *mem_space, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, +H5_DLL herr_t H5S_mpio_spaces_write(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, + size_t nelmts, size_t elmt_size, + const H5S_t *file_space, const H5S_t *mem_space, const void *buf); /* MPI-IO function to check if a direct I/O transfer is possible between diff --git a/src/H5Sprivate.h b/src/H5Sprivate.h index 59174fc..11fd2f6 100644 --- a/src/H5Sprivate.h +++ b/src/H5Sprivate.h @@ -137,19 +137,19 @@ typedef struct H5S_conv_t { */ /* Read from file to application w/o intermediate scratch buffer */ - herr_t (*read)(H5F_t *f, const struct H5O_layout_t *layout, - const H5D_dcpl_cache_t *dcpl_cache, const union H5D_storage_t *store, - size_t nelmts, size_t elmt_size, const H5S_t *file_space, - const H5S_t *mem_space, const H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, void *buf/*out*/); + herr_t (*read)(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, + size_t nelmts, size_t elmt_size, + const H5S_t *file_space, const H5S_t *mem_space, + void *buf/*out*/); /* Write directly from app buffer to file */ - herr_t (*write)(H5F_t *f, struct H5O_layout_t *layout, - const H5D_dcpl_cache_t *dcpl_cache, const union H5D_storage_t *store, - size_t nelmts, size_t elmt_size, const H5S_t *file_space, - const H5S_t *mem_space, const H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, const void *buf); + herr_t (*write)(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, + size_t nelmts, size_t elmt_size, + const H5S_t *file_space, const H5S_t *mem_space, + const void *buf); #ifdef H5S_DEBUG struct { @@ -250,28 +250,30 @@ H5_DLL herr_t H5S_select_iterate(void *buf, hid_t type_id, const H5S_t *space, H5D_operator_t op, void *operator_data); H5_DLL herr_t H5S_select_fill(void *fill, size_t fill_size, const H5S_t *space, void *buf); -H5_DLL herr_t H5S_select_fscat (H5F_t *f, struct H5O_layout_t *layout, - const H5D_dcpl_cache_t *dcpl_cache, const union H5D_storage_t *store, - const H5S_t *file_space, H5S_sel_iter_t *file_iter, hsize_t nelmts, - const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, const void *_buf); -H5_DLL hsize_t H5S_select_fgath (H5F_t *f, const struct H5O_layout_t *layout, - const H5D_dcpl_cache_t *dcpl_cache, const union H5D_storage_t *store, - const H5S_t *file_space, H5S_sel_iter_t *file_iter, hsize_t nelmts, - const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, void *buf); +H5_DLL herr_t H5S_select_fscat (H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, + const H5S_t *file_space, H5S_sel_iter_t *file_iter, hsize_t nelmts, + const void *_buf); +H5_DLL hsize_t H5S_select_fgath (H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, + const H5S_t *file_space, H5S_sel_iter_t *file_iter, hsize_t nelmts, + void *buf); H5_DLL herr_t H5S_select_mscat (const void *_tscat_buf, const H5S_t *space, H5S_sel_iter_t *iter, hsize_t nelmts, const H5D_dxpl_cache_t *dxpl_cache, void *_buf/*out*/); H5_DLL hsize_t H5S_select_mgath (const void *_buf, const H5S_t *space, H5S_sel_iter_t *iter, hsize_t nelmts, const H5D_dxpl_cache_t *dxpl_cache, void *_tgath_buf/*out*/); -H5_DLL herr_t H5S_select_read(H5F_t *f, const struct H5O_layout_t *layout, - const H5D_dcpl_cache_t *dcpl_cache, const union H5D_storage_t *store, size_t nelmts, size_t elmt_size, - const H5S_t *file_space, const H5S_t *mem_space, const H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, void *buf/*out*/); -H5_DLL herr_t H5S_select_write(H5F_t *f, struct H5O_layout_t *layout, - const H5D_dcpl_cache_t *dcpl_cache, const union H5D_storage_t *store, size_t nelmts, size_t elmt_size, - const H5S_t *file_space, const H5S_t *mem_space, const H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, const void *buf/*out*/); +H5_DLL herr_t H5S_select_read(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, + size_t nelmts, size_t elmt_size, + const H5S_t *file_space, const H5S_t *mem_space, + void *buf/*out*/); +H5_DLL herr_t H5S_select_write(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, + size_t nelmts, size_t elmt_size, + const H5S_t *file_space, const H5S_t *mem_space, + const void *buf/*out*/); H5_DLL htri_t H5S_select_valid(const H5S_t *space); H5_DLL hssize_t H5S_get_select_npoints(const H5S_t *space); H5_DLL herr_t H5S_get_select_bounds(const H5S_t *space, hssize_t *start, hssize_t *end); diff --git a/src/H5Sselect.c b/src/H5Sselect.c index e5edeee..8fb73cc 100644 --- a/src/H5Sselect.c +++ b/src/H5Sselect.c @@ -1662,10 +1662,9 @@ done: *------------------------------------------------------------------------- */ herr_t -H5S_select_fscat (H5F_t *f, struct H5O_layout_t *layout, - const H5D_dcpl_cache_t *dcpl_cache, const H5D_storage_t *store, - const H5S_t *space, H5S_sel_iter_t *iter, - hsize_t nelmts, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, +H5S_select_fscat (H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, + const H5S_t *space, H5S_sel_iter_t *iter, hsize_t nelmts, const void *_buf) { const uint8_t *buf=_buf; /* Alias for pointer arithmetic */ @@ -1686,7 +1685,7 @@ H5S_select_fscat (H5F_t *f, struct H5O_layout_t *layout, /* Check args */ assert (f); - assert (layout); + assert (dset); assert (store); assert (space); assert (iter); @@ -1721,7 +1720,7 @@ H5S_select_fscat (H5F_t *f, struct H5O_layout_t *layout, mem_off=0; /* Write sequence list out */ - if (H5F_seq_writevv(f, dxpl_cache, dxpl_id, layout, dcpl_cache, store, nseq, &dset_curr_seq, len, off, 1, &mem_curr_seq, &mem_len, &mem_off, buf)<0) + if (H5D_seq_writevv(f, dxpl_cache, dxpl_id, dset, store, nseq, &dset_curr_seq, len, off, 1, &mem_curr_seq, &mem_len, &mem_off, buf)<0) HGOTO_ERROR(H5E_DATASPACE, H5E_WRITEERROR, FAIL, "write error"); /* Update buffer */ @@ -1766,11 +1765,10 @@ done: *------------------------------------------------------------------------- */ hsize_t -H5S_select_fgath (H5F_t *f, const struct H5O_layout_t *layout, - const H5D_dcpl_cache_t *dcpl_cache, const H5D_storage_t *store, - const H5S_t *space, H5S_sel_iter_t *iter, - hsize_t nelmts, const H5D_dxpl_cache_t *dxpl_cache, - hid_t dxpl_id, void *_buf/*out*/) +H5S_select_fgath (H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, + const H5S_t *space, H5S_sel_iter_t *iter, hsize_t nelmts, + void *_buf/*out*/) { uint8_t *buf=_buf; /* Alias for pointer arithmetic */ hsize_t _off[H5D_XFER_HYPER_VECTOR_SIZE_DEF]; /* Array to store sequence offsets */ @@ -1790,7 +1788,7 @@ H5S_select_fgath (H5F_t *f, const struct H5O_layout_t *layout, /* Check args */ assert (f); - assert (layout); + assert (dset); assert (store); assert (space); assert (iter); @@ -1824,7 +1822,7 @@ H5S_select_fgath (H5F_t *f, const struct H5O_layout_t *layout, mem_off=0; /* Read sequence list in */ - if (H5F_seq_readvv(f, dxpl_cache, dxpl_id, layout, dcpl_cache, store, nseq, &dset_curr_seq, len, off, 1, &mem_curr_seq, &mem_len, &mem_off, buf)<0) + if (H5D_seq_readvv(f, dxpl_cache, dxpl_id, dset, store, nseq, &dset_curr_seq, len, off, 1, &mem_curr_seq, &mem_len, &mem_off, buf)<0) HGOTO_ERROR(H5E_DATASPACE, H5E_READERROR, 0, "read error"); /* Update buffer */ @@ -2044,10 +2042,10 @@ done: *------------------------------------------------------------------------- */ herr_t -H5S_select_read(H5F_t *f, const H5O_layout_t *layout, const H5D_dcpl_cache_t *dcpl_cache, - const H5D_storage_t *store, size_t nelmts, size_t elmt_size, +H5S_select_read(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, + size_t nelmts, size_t elmt_size, const H5S_t *file_space, const H5S_t *mem_space, - const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, void *buf/*out*/) { H5S_sel_iter_t mem_iter; /* Memory selection iteration info */ @@ -2140,7 +2138,7 @@ HDfprintf(stderr,"%s: file_off[%Zu]=%Hu, file_len[%Zu]=%Zu\n",FUNC,curr_file_seq HDfprintf(stderr,"%s: mem_off[%Zu]=%Hu, mem_len[%Zu]=%Zu\n",FUNC,curr_mem_seq,mem_off[curr_mem_seq],curr_mem_seq,mem_len[curr_mem_seq]); #endif /* QAK */ /* Read file sequences into current memory sequence */ - if ((tmp_file_len=H5F_seq_readvv(f, dxpl_cache, dxpl_id, layout, dcpl_cache, store, + if ((tmp_file_len=H5D_seq_readvv(f, dxpl_cache, dxpl_id, dset, store, file_nseq, &curr_file_seq, file_len, file_off, mem_nseq, &curr_mem_seq, mem_len, mem_off, buf))<0) @@ -2194,10 +2192,10 @@ done: *------------------------------------------------------------------------- */ herr_t -H5S_select_write(H5F_t *f, H5O_layout_t *layout, const H5D_dcpl_cache_t *dcpl_cache, - const H5D_storage_t *store, size_t nelmts, size_t elmt_size, +H5S_select_write(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, + H5D_t *dset, const H5D_storage_t *store, + size_t nelmts, size_t elmt_size, const H5S_t *file_space, const H5S_t *mem_space, - const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id, const void *buf/*out*/) { H5S_sel_iter_t mem_iter; /* Memory selection iteration info */ @@ -2332,7 +2330,7 @@ for(u=curr_mem_seq; u