diff options
Diffstat (limited to 'src/H5Dio.c')
-rw-r--r-- | src/H5Dio.c | 50 |
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 */ |