summaryrefslogtreecommitdiffstats
path: root/src/H5Dio.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5Dio.c')
-rw-r--r--src/H5Dio.c50
1 files changed, 34 insertions, 16 deletions
diff --git a/src/H5Dio.c b/src/H5Dio.c
index 611518d..96d8999 100644
--- a/src/H5Dio.c
+++ b/src/H5Dio.c
@@ -362,27 +362,35 @@ H5D__read(size_t count, H5D_dset_io_info_t *dset_info)
} /* end if */
else {
haddr_t prev_tag = HADDR_UNDEF;
+ size_t piece_count = 0;
+
+ if (H5D_LAYOUT_CB_PERFORM_IO(&io_info) && io_info.full_io_chks_to_mds > 0)
+ piece_count = io_info.full_io_chks_to_mds;
+ else
+ piece_count = io_info.piece_count;
/* Allocate selection I/O parameter arrays if necessary */
- if (!H5D_LAYOUT_CB_PERFORM_IO(&io_info) && io_info.piece_count > 0) {
- if (NULL == (io_info.mem_spaces = H5MM_malloc(io_info.piece_count * sizeof(H5S_t *))))
+ if ((!H5D_LAYOUT_CB_PERFORM_IO(&io_info) && io_info.piece_count > 0) ||
+ (H5D_LAYOUT_CB_PERFORM_IO(&io_info) && io_info.full_io_chks_to_mds > 0)) {
+
+ if (NULL == (io_info.mem_spaces = H5MM_malloc(piece_count * sizeof(H5S_t *))))
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL,
"memory allocation failed for memory space list");
- if (NULL == (io_info.file_spaces = H5MM_malloc(io_info.piece_count * sizeof(H5S_t *))))
+ if (NULL == (io_info.file_spaces = H5MM_malloc(piece_count * sizeof(H5S_t *))))
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL,
"memory allocation failed for file space list");
- if (NULL == (io_info.addrs = H5MM_malloc(io_info.piece_count * sizeof(haddr_t))))
+ if (NULL == (io_info.addrs = H5MM_malloc(piece_count * sizeof(haddr_t))))
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL,
"memory allocation failed for piece address list");
- if (NULL == (io_info.element_sizes = H5MM_malloc(io_info.piece_count * sizeof(size_t))))
+ if (NULL == (io_info.element_sizes = H5MM_malloc(piece_count * sizeof(size_t))))
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL,
"memory allocation failed for element size list");
- if (NULL == (io_info.rbufs = H5MM_malloc(io_info.piece_count * sizeof(void *))))
+ if (NULL == (io_info.rbufs = H5MM_malloc(piece_count * sizeof(void *))))
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL,
"memory allocation failed for read buffer list");
if (io_info.max_tconv_type_size > 0)
if (NULL ==
- (io_info.sel_pieces = H5MM_malloc(io_info.piece_count * sizeof(io_info.sel_pieces[0]))))
+ (io_info.sel_pieces = H5MM_malloc(piece_count * sizeof(io_info.sel_pieces[0]))))
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL,
"unable to allocate array of selected pieces");
}
@@ -406,7 +414,8 @@ H5D__read(size_t count, H5D_dset_io_info_t *dset_info)
/* Make final selection I/O call if the multi_read callbacks did not perform the actual I/O
* (if using selection I/O and either multi dataset or type conversion) */
- if (!H5D_LAYOUT_CB_PERFORM_IO(&io_info)) {
+ if (!H5D_LAYOUT_CB_PERFORM_IO(&io_info) ||
+ (H5D_LAYOUT_CB_PERFORM_IO(&io_info) && io_info.full_io_chks_to_mds > 0)) {
/* Check for type conversion */
if (io_info.max_tconv_type_size > 0) {
/* Type conversion pathway */
@@ -787,27 +796,35 @@ H5D__write(size_t count, H5D_dset_io_info_t *dset_info)
} /* end if */
else {
haddr_t prev_tag = HADDR_UNDEF;
+ size_t piece_count = 0;
+
+ if (H5D_LAYOUT_CB_PERFORM_IO(&io_info) && io_info.full_io_chks_to_mds > 0)
+ piece_count = io_info.full_io_chks_to_mds;
+ else
+ piece_count = io_info.piece_count;
/* Allocate selection I/O parameter arrays if necessary */
- if (!H5D_LAYOUT_CB_PERFORM_IO(&io_info) && io_info.piece_count > 0) {
- if (NULL == (io_info.mem_spaces = H5MM_malloc(io_info.piece_count * sizeof(H5S_t *))))
+ if ((!H5D_LAYOUT_CB_PERFORM_IO(&io_info) && io_info.piece_count > 0) ||
+ (H5D_LAYOUT_CB_PERFORM_IO(&io_info) && io_info.full_io_chks_to_mds > 0)) {
+
+ if (NULL == (io_info.mem_spaces = H5MM_malloc(piece_count * sizeof(H5S_t *))))
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL,
"memory allocation failed for memory space list");
- if (NULL == (io_info.file_spaces = H5MM_malloc(io_info.piece_count * sizeof(H5S_t *))))
+ if (NULL == (io_info.file_spaces = H5MM_malloc(piece_count * sizeof(H5S_t *))))
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL,
"memory allocation failed for file space list");
- if (NULL == (io_info.addrs = H5MM_malloc(io_info.piece_count * sizeof(haddr_t))))
+ if (NULL == (io_info.addrs = H5MM_malloc(piece_count * sizeof(haddr_t))))
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL,
"memory allocation failed for piece address list");
- if (NULL == (io_info.element_sizes = H5MM_malloc(io_info.piece_count * sizeof(size_t))))
+ if (NULL == (io_info.element_sizes = H5MM_malloc(piece_count * sizeof(size_t))))
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL,
"memory allocation failed for element size list");
- if (NULL == (io_info.wbufs = H5MM_malloc(io_info.piece_count * sizeof(const void *))))
+ if (NULL == (io_info.wbufs = H5MM_malloc(piece_count * sizeof(const void *))))
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL,
"memory allocation failed for write buffer list");
if (io_info.max_tconv_type_size > 0)
if (NULL ==
- (io_info.sel_pieces = H5MM_malloc(io_info.piece_count * sizeof(io_info.sel_pieces[0]))))
+ (io_info.sel_pieces = H5MM_malloc(piece_count * sizeof(io_info.sel_pieces[0]))))
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL,
"unable to allocate array of selected pieces");
}
@@ -829,7 +846,8 @@ H5D__write(size_t count, H5D_dset_io_info_t *dset_info)
/* Make final selection I/O call if the multi_write callbacks did not perform the actual I/O
* (if using selection I/O and either multi dataset or type conversion) */
- if (!H5D_LAYOUT_CB_PERFORM_IO(&io_info)) {
+ if (!H5D_LAYOUT_CB_PERFORM_IO(&io_info) ||
+ (H5D_LAYOUT_CB_PERFORM_IO(&io_info) && io_info.full_io_chks_to_mds > 0)) {
/* Check for type conversion */
if (io_info.max_tconv_type_size > 0) {
/* Type conversion pathway */