summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVailin Choi <vchoi@hdfgroup.org>2017-05-11 08:15:31 (GMT)
committerVailin Choi <vchoi@hdfgroup.org>2017-05-11 08:15:31 (GMT)
commita0e70a248e5e4de34ba2470654b3e220614970e3 (patch)
treed3dec6af592b66dd173fe14c16c392d1951dfac6 /src
parent9f78561bf1cc925b537f1bcf3ab1f881a7b46922 (diff)
parent8c2d4c354413d4f3578aa30cf28ee4c4f5c137cf (diff)
downloadhdf5-a0e70a248e5e4de34ba2470654b3e220614970e3.zip
hdf5-a0e70a248e5e4de34ba2470654b3e220614970e3.tar.gz
hdf5-a0e70a248e5e4de34ba2470654b3e220614970e3.tar.bz2
Merge pull request #485 in HDFFV/hdf5 from ~VCHOI/my_hdf5_fork:hdf5_1_8 to hdf5_1_8
* commit '8c2d4c354413d4f3578aa30cf28ee4c4f5c137cf': Incorporate additional code changes for the H5DOread_chunk patch from GE healthcare (HDFFV-9934) Modifications made based on pull request (#485) comments. Incorporate additional code changes for the H5DOread_chunk patch from GE healthcare (HDFFV-9934) Incorporate the code changes that were missing from the original patch: (1) Additional tests in hl/test/test_dset_opt.c (2) Fix in src/H5Dchunk.c for direct access when an entry is in chunk cache but not dirty Tested on playtpus, ostrich, kituo, mayll, osx1010test, quail, emu.
Diffstat (limited to 'src')
-rw-r--r--src/H5Dchunk.c74
-rw-r--r--src/H5private.h3
2 files changed, 41 insertions, 36 deletions
diff --git a/src/H5Dchunk.c b/src/H5Dchunk.c
index ab2cb8f..f024be3 100644
--- a/src/H5Dchunk.c
+++ b/src/H5Dchunk.c
@@ -431,6 +431,8 @@ H5D__chunk_direct_read(const H5D_t *dset, hid_t dxpl_id, hsize_t *offset,
HDassert(filters);
HDassert(buf);
+ *filters = 0;
+
/* Retrieve the dataset dimensions */
space_ndims = dset->shared->layout.u.chunk.ndims - 1;
@@ -460,31 +462,31 @@ H5D__chunk_direct_read(const H5D_t *dset, hid_t dxpl_id, hsize_t *offset,
/* Check if the requested chunk exists in the chunk cache */
if(UINT_MAX != udata.idx_hint) {
H5D_rdcc_ent_t *ent = rdcc->slot[udata.idx_hint];
+ hbool_t flush;
/* Sanity checks */
HDassert(udata.idx_hint < rdcc->nslots);
HDassert(rdcc->slot[udata.idx_hint]);
- /* If the cached chunk is dirty, it must be flushed to get accurate size */
- if( ent->dirty == TRUE ) {
- /* 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")
+ flush = (ent->dirty == TRUE) ? TRUE : FALSE;
- /* Flush the chunk to disk and clear the cache entry */
- if(H5D__chunk_cache_evict(dset, dxpl_id, dxpl_cache, rdcc->slot[udata.idx_hint], TRUE) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_CANTREMOVE, FAIL, "unable to evict chunk")
+ /* 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")
- /* Reset fields about the chunk we are looking for */
- udata.nbytes = 0;
- udata.filter_mask = 0;
- udata.addr = HADDR_UNDEF;
- udata.idx_hint = UINT_MAX;
+ /* Flush the chunk to disk and clear the cache entry */
+ if(H5D__chunk_cache_evict(dset, dxpl_id, dxpl_cache, rdcc->slot[udata.idx_hint], flush) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_CANTREMOVE, FAIL, "unable to evict chunk")
- /* Get the new file address / chunk size after flushing */
- if(H5D__chunk_lookup(dset, dxpl_id, chunk_offset, chunk_idx, &udata) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error looking up chunk address")
- }
+ /* Reset fields about the chunk we are looking for */
+ udata.nbytes = 0;
+ udata.filter_mask = 0;
+ udata.addr = HADDR_UNDEF;
+ udata.idx_hint = UINT_MAX;
+
+ /* Get the new file address / chunk size after flushing */
+ if(H5D__chunk_lookup(dset, dxpl_id, chunk_offset, chunk_idx, &udata) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error looking up chunk address")
}
/* Make sure the address of the chunk is returned. */
@@ -526,6 +528,7 @@ H5D__get_chunk_storage_size(H5D_t *dset, hid_t dxpl_id, const hsize_t *offset, h
hsize_t chunk_idx; /* Index of chunk cache entry */
H5D_dxpl_cache_t _dxpl_cache; /* Data transfer property cache buffer */
H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache; /* Data transfer property cache */
+ hbool_t flush; /* Flush cache or not */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_PACKAGE
@@ -535,13 +538,13 @@ H5D__get_chunk_storage_size(H5D_t *dset, hid_t dxpl_id, const hsize_t *offset, h
HDassert(offset);
HDassert(storage_size);
+ *storage_size = 0;
+
/* Retrieve the dataset dimensions */
space_ndims = dset->shared->layout.u.chunk.ndims - 1;
- if(H5D__chunk_is_space_alloc(&(layout->storage)) == FALSE) {
- *storage_size = 0;
+ if(H5D__chunk_is_space_alloc(&(layout->storage)) == FALSE)
HGOTO_DONE(SUCCEED)
- }
/* Initialize the chunk offset */
HDmemcpy(chunk_offset, offset, (space_ndims * sizeof(chunk_offset[0])));
@@ -574,25 +577,24 @@ H5D__get_chunk_storage_size(H5D_t *dset, hid_t dxpl_id, const hsize_t *offset, h
HDassert(rdcc->slot[udata.idx_hint]);
H5D_rdcc_ent_t *ent = rdcc->slot[udata.idx_hint];
- /* If the cached chunk is dirty, it must be flushed to get accurate size */
- if( ent->dirty == TRUE ) {
- /* 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")
+ flush = (ent->dirty == TRUE) ? TRUE : FALSE;
+
+ /* 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")
- /* Flush the chunk to disk and clear the cache entry */
- if(H5D__chunk_cache_evict(dset, dxpl_id, dxpl_cache, rdcc->slot[udata.idx_hint], TRUE) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_CANTREMOVE, FAIL, "unable to evict chunk")
+ /* Flush the chunk to disk and clear the cache entry */
+ if(H5D__chunk_cache_evict(dset, dxpl_id, dxpl_cache, rdcc->slot[udata.idx_hint], flush) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_CANTREMOVE, FAIL, "unable to evict chunk")
- /* Reset fields about the chunk we are looking for */
- udata.nbytes = 0;
- udata.addr = HADDR_UNDEF;
- udata.idx_hint = UINT_MAX;
+ /* Reset fields about the chunk we are looking for */
+ udata.nbytes = 0;
+ udata.addr = HADDR_UNDEF;
+ udata.idx_hint = UINT_MAX;
- /* Get the new file address / chunk size after flushing */
- if(H5D__chunk_lookup(dset, dxpl_id, chunk_offset, chunk_idx, &udata) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error looking up chunk address")
- }
+ /* Get the new file address / chunk size after flushing */
+ if(H5D__chunk_lookup(dset, dxpl_id, chunk_offset, chunk_idx, &udata) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error looking up chunk address")
}
/* Make sure the address of the chunk is returned. */
diff --git a/src/H5private.h b/src/H5private.h
index 3c0cb75..b079136 100644
--- a/src/H5private.h
+++ b/src/H5private.h
@@ -1048,6 +1048,9 @@ typedef off_t h5_stat_size_t;
#define HDpow(X,Y) pow(X,Y)
#endif /* HDpow */
/* printf() variable arguments */
+#ifndef HDprintf
+ #define HDprintf(...) HDfprintf(stdout, __VA_ARGS__)
+#endif /* HDprintf */
#ifndef HDputc
#define HDputc(C,F) putc(C,F)
#endif /* HDputc*/