diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2002-04-02 20:51:41 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2002-04-02 20:51:41 (GMT) |
commit | d2232a345f36988f4a60034d63ddca25c476fc08 (patch) | |
tree | 2ba460735cb162b5ee94ae98f0d46873488fa454 /src/H5Sall.c | |
parent | c1e44699f0460cd5a675a71dc85296740f07063a (diff) | |
download | hdf5-d2232a345f36988f4a60034d63ddca25c476fc08.zip hdf5-d2232a345f36988f4a60034d63ddca25c476fc08.tar.gz hdf5-d2232a345f36988f4a60034d63ddca25c476fc08.tar.bz2 |
[svn-r5130] Purpose:
Bug Fix & Feature
Description:
The selection offset was being ignored for optimized hyperslab selection
I/O operations.
Additionally, I've found that the restrictions on optimized selection
I/O operations were too strict and found a way to allow more hyperslabs
to use the optimized I/O routines.
Solution:
Incorporate the selection offset into the selection location when performing
optimized I/O operations.
Allow optimized I/O on any single hyperslab selection and also allow
hyperslab operations on chunked datasets.
Platforms tested:
FreeBSD 4.5 (sleipnir)
Diffstat (limited to 'src/H5Sall.c')
-rw-r--r-- | src/H5Sall.c | 537 |
1 files changed, 160 insertions, 377 deletions
diff --git a/src/H5Sall.c b/src/H5Sall.c index 3c111f7..1692ff7 100644 --- a/src/H5Sall.c +++ b/src/H5Sall.c @@ -400,18 +400,13 @@ H5S_all_read(H5F_t *f, const H5O_layout_t *layout, const H5O_pline_t *pline, { H5S_hyper_span_t *file_span=NULL,*mem_span=NULL; /* Hyperslab span node */ char *buf=(char*)_buf; /* Get pointer to buffer */ - hsize_t mem_size,file_size; - hssize_t file_off,mem_off; - hssize_t count; /* Regular hyperslab count */ - hsize_t size[H5O_LAYOUT_NDIMS]; - hssize_t file_offset[H5O_LAYOUT_NDIMS]; - hssize_t mem_offset[H5O_LAYOUT_NDIMS]; - unsigned u; - unsigned small_contiguous=0, /* Flags for indicating contiguous hyperslabs */ - large_contiguous=0; - int i; - size_t down_size[H5O_LAYOUT_NDIMS]; - hsize_t acc; + hsize_t mem_elmts,file_elmts; /* Number of elements in each dimension of selection */ + hssize_t file_off,mem_off; /* Offset (in elements) of selection */ + hsize_t mem_size[H5O_LAYOUT_NDIMS]; /* Size of memory buffer */ + hsize_t size[H5O_LAYOUT_NDIMS]; /* Size of selection */ + hssize_t file_offset[H5O_LAYOUT_NDIMS]; /* Offset of selection in file */ + hssize_t mem_offset[H5O_LAYOUT_NDIMS]; /* Offset of selection in memory */ + unsigned u; /* Index variable */ herr_t ret_value=SUCCEED; FUNC_ENTER(H5S_all_read, FAIL); @@ -428,204 +423,95 @@ printf("%s: check 1.0\n",FUNC); if (mem_space->extent.u.simple.rank!=file_space->extent.u.simple.rank) HGOTO_DONE(SUCCEED); - /* Check for a single hyperslab block defined in memory dataspace */ - if (mem_space->select.type==H5S_SEL_HYPERSLABS) { - /* Check for a "regular" hyperslab selection */ - if(mem_space->select.sel_info.hslab.diminfo != NULL) { - /* Check each dimension */ - for(count=1,u=0; u<mem_space->extent.u.simple.rank; u++) - count*=mem_space->select.sel_info.hslab.diminfo[u].count; - /* If the regular hyperslab definition creates more than one hyperslab, fall through */ - if(count>1) - HGOTO_DONE(SUCCEED); - } /* end if */ - else { - /* Get the pointer to the hyperslab spans to check */ - mem_span=mem_space->select.sel_info.hslab.span_lst->head; - - /* Spin through the spans, checking for more than one span in each dimension */ - while(mem_span!=NULL) { - /* If there are more than one span in the dimension, we can't use this routine */ - if(mem_span->next!=NULL) - HGOTO_DONE(SUCCEED); - - /* Advance to the next span, if it's available */ - if(mem_span->down==NULL) - break; - else - mem_span=mem_span->down->head; - } /* end while */ - - /* Get the pointer to the hyperslab spans to use */ - mem_span=mem_space->select.sel_info.hslab.span_lst->head; - } /* end else */ - } /* end if */ - else - if(mem_space->select.type!=H5S_SEL_ALL) - HGOTO_DONE(SUCCEED); - - /* Check for a single hyperslab block defined in file dataspace */ - if (file_space->select.type==H5S_SEL_HYPERSLABS) { - /* Check for a "regular" hyperslab selection */ - if(file_space->select.sel_info.hslab.diminfo != NULL) { - /* Check each dimension */ - for(count=1,u=0; u<file_space->extent.u.simple.rank; u++) - count*=file_space->select.sel_info.hslab.diminfo[u].count; - /* If the regular hyperslab definition creates more than one hyperslab, fall through */ - if(count>1) - HGOTO_DONE(SUCCEED); - } /* end if */ - else { - /* Get the pointer to the hyperslab spans to check */ - file_span=file_space->select.sel_info.hslab.span_lst->head; - - /* Spin through the spans, checking for more than one span in each dimension */ - while(file_span!=NULL) { - /* If there are more than one span in the dimension, we can't use this routine */ - if(file_span->next!=NULL) - HGOTO_DONE(SUCCEED); - - /* Advance to the next span, if it's available */ - if(file_span->down==NULL) - break; - else - file_span=file_span->down->head; - } /* end while */ - - /* Get the pointer to the hyperslab spans to use */ - file_span=file_space->select.sel_info.hslab.span_lst->head; - } /* end else */ - } /* end if */ - else - if(file_space->select.type!=H5S_SEL_ALL) - HGOTO_DONE(SUCCEED); - /* Get information about memory and file */ for (u=0; u<mem_space->extent.u.simple.rank; u++) { - if(mem_space->select.type==H5S_SEL_HYPERSLABS) { - /* Check for a "regular" hyperslab selection */ - if(mem_space->select.sel_info.hslab.diminfo != NULL) { - mem_size=mem_space->select.sel_info.hslab.diminfo[u].block; - mem_off=mem_space->select.sel_info.hslab.diminfo[u].start; - } /* end if */ - else { - mem_size=(mem_span->high-mem_span->low)+1; - mem_off=mem_span->low; - mem_span=mem_span->down->head; - } /* end else */ - } /* end if */ - else { - mem_size=mem_space->extent.u.simple.size[u]; - mem_off=0; - } /* end else */ - - if(file_space->select.type==H5S_SEL_HYPERSLABS) { - /* Check for a "regular" hyperslab selection */ - if(file_space->select.sel_info.hslab.diminfo != NULL) { - file_size=file_space->select.sel_info.hslab.diminfo[u].block; - file_off=file_space->select.sel_info.hslab.diminfo[u].start; - } /* end if */ - else { - file_size=(file_span->high-file_span->low)+1; - file_off=file_span->low; - file_span=file_span->down->head; - } /* end else */ - } /* end if */ - else { - file_size=file_space->extent.u.simple.size[u]; - file_off=0; - } /* end else */ - - if (mem_size!=file_size) + switch(mem_space->select.type) { + case H5S_SEL_HYPERSLABS: + /* Check for a "regular" hyperslab selection */ + if(mem_space->select.sel_info.hslab.diminfo != NULL) { + mem_elmts=mem_space->select.sel_info.hslab.diminfo[u].block; + mem_off=mem_space->select.sel_info.hslab.diminfo[u].start; + } /* end if */ + else { + mem_elmts=(mem_span->high-mem_span->low)+1; + mem_off=mem_span->low; + mem_span=mem_span->down->head; + } /* end else */ + mem_off+=mem_space->select.offset[u]; + break; + + case H5S_SEL_ALL: + mem_elmts=mem_space->extent.u.simple.size[u]; + mem_off=0; + break; + + case H5S_SEL_POINTS: + mem_elmts=1; + mem_off=mem_space->select.sel_info.pnt_lst->head->pnt[u] + +mem_space->select.offset[u]; + break; + + default: + assert(0 && "Invalid selection type!"); + } /* end switch */ + + switch(file_space->select.type) { + case H5S_SEL_HYPERSLABS: + /* Check for a "regular" hyperslab selection */ + if(file_space->select.sel_info.hslab.diminfo != NULL) { + file_elmts=file_space->select.sel_info.hslab.diminfo[u].block; + file_off=file_space->select.sel_info.hslab.diminfo[u].start; + } /* end if */ + else { + file_elmts=(file_span->high-file_span->low)+1; + file_off=file_span->low; + file_span=file_span->down->head; + } /* end else */ + file_off+=file_space->select.offset[u]; + break; + + case H5S_SEL_ALL: + file_elmts=file_space->extent.u.simple.size[u]; + file_off=0; + break; + + case H5S_SEL_POINTS: + file_elmts=1; + file_off=file_space->select.sel_info.pnt_lst->head->pnt[u] + +file_space->select.offset[u]; + break; + + default: + assert(0 && "Invalid selection type!"); + } /* end switch */ + + if (mem_elmts!=file_elmts) HGOTO_DONE(SUCCEED); - size[u] = file_size; + mem_size[u]=mem_space->extent.u.simple.size[u]; + size[u] = file_elmts; file_offset[u] = file_off; mem_offset[u] = mem_off; } + mem_size[u]=elmt_size; size[u] = elmt_size; file_offset[u] = 0; mem_offset[u] = 0; - /* Disallow reading a memory hyperslab in the "middle" of a dataset which */ - /* spans multiple rows in "interior" dimensions, but allow reading a */ - /* hyperslab which is in the "middle" of the fastest or slowest changing */ - /* dimension because a hyperslab which "fills" the interior dimensions is */ - /* contiguous in memory. i.e. these are allowed: */ - /* --------------------- --------------------- */ - /* | | | | */ - /* |*******************| | ********* | */ - /* |*******************| | | */ - /* | | | | */ - /* | | | | */ - /* --------------------- --------------------- */ - /* ("large" contiguous block) ("small" contiguous block) */ - /* But this is not: */ - /* --------------------- */ - /* | | */ - /* | ********* | */ - /* | ********* | */ - /* | | */ - /* | | */ - /* --------------------- */ - /* (not contiguous in memory) */ - if(mem_space->select.type==H5S_SEL_HYPERSLABS) { - /* Check for a "small" contiguous block */ - if(size[0]==1) { - small_contiguous=1; - /* size of block in all dimensions except the fastest must be '1' */ - for (u=0; u<(mem_space->extent.u.simple.rank-1); u++) { - if(size[u]>1) { - small_contiguous=0; - break; - } /* end if */ - } /* end for */ - } /* end if */ - /* Check for a "large" contiguous block */ - else { - large_contiguous=1; - /* size of block in all dimensions except the slowest must be the */ - /* full size of the dimension */ - for (u=1; u<mem_space->extent.u.simple.rank; u++) { - if(size[u]!=mem_space->extent.u.simple.size[u]) { - large_contiguous=0; - break; - } /* end if */ - } /* end for */ - } /* end else */ - - /* Check for contiguous block */ - if(small_contiguous || large_contiguous) { - /* Compute the "down sizes" for each dimension */ - for (acc=elmt_size, i=(mem_space->extent.u.simple.rank-1); i>=0; i--) { - H5_ASSIGN_OVERFLOW(down_size[i],acc,hsize_t,size_t); - acc*=mem_space->extent.u.simple.size[i]; - } /* end for */ - - /* Adjust the buffer offset and memory offsets by the proper amount */ - for (u=0; u<mem_space->extent.u.simple.rank; u++) { - buf+=mem_offset[u]*down_size[u]; - mem_offset[u]=0; - } /* end for */ - } /* end if */ - else { - /* Non-contiguous hyperslab block */ - HGOTO_DONE(SUCCEED); - } /* end else */ - } /* end if */ - #ifdef QAK printf("%s: check 2.0\n",FUNC); for (u=0; u<mem_space->extent.u.simple.rank; u++) printf("size[%u]=%lu\n",u,(unsigned long)size[u]); for (u=0; u<=mem_space->extent.u.simple.rank; u++) + printf("mem_size[%u]=%lu\n",u,(unsigned long)mem_size[u]); +for (u=0; u<=mem_space->extent.u.simple.rank; u++) printf("mem_offset[%u]=%lu\n",u,(unsigned long)mem_offset[u]); for (u=0; u<=mem_space->extent.u.simple.rank; u++) printf("file_offset[%u]=%lu\n",u,(unsigned long)file_offset[u]); #endif /* QAK */ /* Read data from the file */ if (H5F_arr_read(f, dxpl_id, layout, pline, fill, efl, size, - size, mem_offset, file_offset, buf/*out*/)<0) { + mem_size, mem_offset, file_offset, buf/*out*/)<0) { HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to read data from the file"); } @@ -671,23 +557,21 @@ H5S_all_write(H5F_t *f, const struct H5O_layout_t *layout, { H5S_hyper_span_t *file_span=NULL,*mem_span=NULL; /* Hyperslab span node */ const char *buf=(const char*)_buf; /* Get pointer to buffer */ - hsize_t mem_size,file_size; - hssize_t file_off,mem_off; - hssize_t count; /* Regular hyperslab count */ - hsize_t size[H5O_LAYOUT_NDIMS]; - hssize_t file_offset[H5O_LAYOUT_NDIMS]; - hssize_t mem_offset[H5O_LAYOUT_NDIMS]; - unsigned u; - unsigned small_contiguous=0, /* Flags for indicating contiguous hyperslabs */ - large_contiguous=0; - int i; - size_t down_size[H5O_LAYOUT_NDIMS]; - hsize_t acc; + hsize_t mem_elmts,file_elmts; /* Number of elements in each dimension of selection */ + hssize_t file_off,mem_off; /* Offset (in elements) of selection */ + hsize_t mem_size[H5O_LAYOUT_NDIMS]; /* Size of memory buffer */ + hsize_t size[H5O_LAYOUT_NDIMS]; /* Size of selection */ + hssize_t file_offset[H5O_LAYOUT_NDIMS]; /* Offset of selection in file */ + hssize_t mem_offset[H5O_LAYOUT_NDIMS]; /* Offset of selection in memory */ + unsigned u; /* Index variable */ herr_t ret_value=SUCCEED; FUNC_ENTER(H5S_all_write, FAIL); *must_convert = TRUE; +#ifdef QAK +printf("%s: check 1.0\n",FUNC); +#endif /* QAK */ /* Check whether we can handle this */ if (H5S_SIMPLE!=mem_space->extent.type) HGOTO_DONE(SUCCEED); @@ -696,201 +580,100 @@ H5S_all_write(H5F_t *f, const struct H5O_layout_t *layout, if (mem_space->extent.u.simple.rank!=file_space->extent.u.simple.rank) HGOTO_DONE(SUCCEED); - /* Check for a single hyperslab block defined in memory dataspace */ - if (mem_space->select.type==H5S_SEL_HYPERSLABS) { - /* Check for a "regular" hyperslab selection */ - if(mem_space->select.sel_info.hslab.diminfo != NULL) { - /* Check each dimension */ - for(count=1,u=0; u<mem_space->extent.u.simple.rank; u++) - count*=mem_space->select.sel_info.hslab.diminfo[u].count; - /* If the regular hyperslab definition creates more than one hyperslab, fall through */ - if(count>1) - HGOTO_DONE(SUCCEED); - } /* end if */ - else { - /* Get the pointer to the hyperslab spans to check */ - mem_span=mem_space->select.sel_info.hslab.span_lst->head; - - /* Spin through the spans, checking for more than one span in each dimension */ - while(mem_span!=NULL) { - /* If there are more than one span in the dimension, we can't use this routine */ - if(mem_span->next!=NULL) - HGOTO_DONE(SUCCEED); - - /* Advance to the next span, if it's available */ - if(mem_span->down==NULL) - break; - else - mem_span=mem_span->down->head; - } /* end while */ - - /* Get the pointer to the hyperslab spans to use */ - mem_span=mem_space->select.sel_info.hslab.span_lst->head; - } /* end else */ - } /* end if */ - else - if(mem_space->select.type!=H5S_SEL_ALL) - HGOTO_DONE(SUCCEED); - - /* Check for a single hyperslab block defined in file dataspace */ - if (file_space->select.type==H5S_SEL_HYPERSLABS) { - /* Check for a "regular" hyperslab selection */ - if(file_space->select.sel_info.hslab.diminfo != NULL) { - /* Check each dimension */ - for(count=1,u=0; u<file_space->extent.u.simple.rank; u++) - count*=file_space->select.sel_info.hslab.diminfo[u].count; - /* If the regular hyperslab definition creates more than one hyperslab, fall through */ - if(count>1) - HGOTO_DONE(SUCCEED); - } /* end if */ - else { - /* Get the pointer to the hyperslab spans to check */ - file_span=file_space->select.sel_info.hslab.span_lst->head; - - /* Spin through the spans, checking for more than one span in each dimension */ - while(file_span!=NULL) { - /* If there are more than one span in the dimension, we can't use this routine */ - if(file_span->next!=NULL) - HGOTO_DONE(SUCCEED); - - /* Advance to the next span, if it's available */ - if(file_span->down==NULL) - break; - else - file_span=file_span->down->head; - } /* end while */ - - /* Get the pointer to the hyperslab spans to use */ - file_span=file_space->select.sel_info.hslab.span_lst->head; - } /* end else */ - } /* end if */ - else - if(file_space->select.type!=H5S_SEL_ALL) - HGOTO_DONE(SUCCEED); - /* Get information about memory and file */ for (u=0; u<mem_space->extent.u.simple.rank; u++) { - if(mem_space->select.type==H5S_SEL_HYPERSLABS) { - /* Check for a "regular" hyperslab selection */ - if(mem_space->select.sel_info.hslab.diminfo != NULL) { - mem_size=mem_space->select.sel_info.hslab.diminfo[u].block; - mem_off=mem_space->select.sel_info.hslab.diminfo[u].start; - } /* end if */ - else { - mem_size=(mem_span->high-mem_span->low)+1; - mem_off=mem_span->low; - mem_span=mem_span->down->head; - } /* end else */ - } /* end if */ - else { - mem_size=mem_space->extent.u.simple.size[u]; - mem_off=0; - } /* end else */ - - if(file_space->select.type==H5S_SEL_HYPERSLABS) { - /* Check for a "regular" hyperslab selection */ - if(file_space->select.sel_info.hslab.diminfo != NULL) { - file_size=file_space->select.sel_info.hslab.diminfo[u].block; - file_off=file_space->select.sel_info.hslab.diminfo[u].start; - } /* end if */ - else { - file_size=(file_span->high-file_span->low)+1; - file_off=file_span->low; - file_span=file_span->down->head; - } /* end else */ - } /* end if */ - else { - file_size=file_space->extent.u.simple.size[u]; - file_off=0; - } /* end else */ - - if (mem_size!=file_size) + switch(mem_space->select.type) { + case H5S_SEL_HYPERSLABS: + /* Check for a "regular" hyperslab selection */ + if(mem_space->select.sel_info.hslab.diminfo != NULL) { + mem_elmts=mem_space->select.sel_info.hslab.diminfo[u].block; + mem_off=mem_space->select.sel_info.hslab.diminfo[u].start; + } /* end if */ + else { + mem_elmts=(mem_span->high-mem_span->low)+1; + mem_off=mem_span->low; + mem_span=mem_span->down->head; + } /* end else */ + mem_off+=mem_space->select.offset[u]; + break; + + case H5S_SEL_ALL: + mem_elmts=mem_space->extent.u.simple.size[u]; + mem_off=0; + break; + + case H5S_SEL_POINTS: + mem_elmts=1; + mem_off=mem_space->select.sel_info.pnt_lst->head->pnt[u] + +mem_space->select.offset[u]; + break; + + default: + assert(0 && "Invalid selection type!"); + } /* end switch */ + + switch(file_space->select.type) { + case H5S_SEL_HYPERSLABS: + /* Check for a "regular" hyperslab selection */ + if(file_space->select.sel_info.hslab.diminfo != NULL) { + file_elmts=file_space->select.sel_info.hslab.diminfo[u].block; + file_off=file_space->select.sel_info.hslab.diminfo[u].start; + } /* end if */ + else { + file_elmts=(file_span->high-file_span->low)+1; + file_off=file_span->low; + file_span=file_span->down->head; + } /* end else */ + file_off+=file_space->select.offset[u]; + break; + + case H5S_SEL_ALL: + file_elmts=file_space->extent.u.simple.size[u]; + file_off=0; + break; + + case H5S_SEL_POINTS: + file_elmts=1; + file_off=file_space->select.sel_info.pnt_lst->head->pnt[u] + +file_space->select.offset[u]; + break; + + default: + assert(0 && "Invalid selection type!"); + } /* end switch */ + + if (mem_elmts!=file_elmts) HGOTO_DONE(SUCCEED); - size[u] = file_size; + mem_size[u]=mem_space->extent.u.simple.size[u]; + size[u] = file_elmts; file_offset[u] = file_off; mem_offset[u] = mem_off; } + mem_size[u]=elmt_size; size[u] = elmt_size; file_offset[u] = 0; mem_offset[u] = 0; - /* Disallow reading a memory hyperslab in the "middle" of a dataset which */ - /* spans multiple rows in "interior" dimensions, but allow reading a */ - /* hyperslab which is in the "middle" of the fastest or slowest changing */ - /* dimension because a hyperslab which "fills" the interior dimensions is */ - /* contiguous in memory. i.e. these are allowed: */ - /* --------------------- --------------------- */ - /* | | | | */ - /* |*******************| | ********* | */ - /* |*******************| | | */ - /* | | | | */ - /* | | | | */ - /* --------------------- --------------------- */ - /* ("large" contiguous block) ("small" contiguous block) */ - /* But this is not: */ - /* --------------------- */ - /* | | */ - /* | ********* | */ - /* | ********* | */ - /* | | */ - /* | | */ - /* --------------------- */ - /* (not contiguous in memory) */ - if(mem_space->select.type==H5S_SEL_HYPERSLABS) { - /* Check for a "small" contiguous block */ - if(size[0]==1) { - small_contiguous=1; - /* size of block in all dimensions except the fastest must be '1' */ - for (u=0; u<(mem_space->extent.u.simple.rank-1); u++) { - if(size[u]>1) { - small_contiguous=0; - break; - } /* end if */ - } /* end for */ - } /* end if */ - /* Check for a "large" contiguous block */ - else { - large_contiguous=1; - /* size of block in all dimensions except the slowest must be the */ - /* full size of the dimension */ - for (u=1; u<mem_space->extent.u.simple.rank; u++) { - if(size[u]!=mem_space->extent.u.simple.size[u]) { - large_contiguous=0; - break; - } /* end if */ - } /* end for */ - } /* end else */ - - /* Check for contiguous block */ - if(small_contiguous || large_contiguous) { - /* Compute the "down sizes" for each dimension */ - for (acc=elmt_size, i=(mem_space->extent.u.simple.rank-1); i>=0; i--) { - H5_ASSIGN_OVERFLOW(down_size[i],acc,hsize_t,size_t); - acc*=mem_space->extent.u.simple.size[i]; - } /* end for */ - - /* Adjust the buffer offset and memory offsets by the proper amount */ - for (u=0; u<mem_space->extent.u.simple.rank; u++) { - buf+=mem_offset[u]*down_size[u]; - mem_offset[u]=0; - } /* end for */ - } /* end if */ - else { - /* Non-contiguous hyperslab block */ - HGOTO_DONE(SUCCEED); - } /* end else */ - } /* end if */ - +#ifdef QAK +printf("%s: check 2.0\n",FUNC); +for (u=0; u<mem_space->extent.u.simple.rank; u++) + printf("size[%u]=%lu\n",u,(unsigned long)size[u]); +for (u=0; u<=mem_space->extent.u.simple.rank; u++) + printf("mem_size[%u]=%lu\n",u,(unsigned long)mem_size[u]); +for (u=0; u<=mem_space->extent.u.simple.rank; u++) + printf("mem_offset[%u]=%lu\n",u,(unsigned long)mem_offset[u]); +for (u=0; u<=mem_space->extent.u.simple.rank; u++) + printf("file_offset[%u]=%lu\n",u,(unsigned long)file_offset[u]); +#endif /* QAK */ /* Write data to the file */ if (H5F_arr_write(f, dxpl_id, layout, pline, fill, efl, size, - size, mem_offset, file_offset, buf)<0) { + mem_size, mem_offset, file_offset, buf)<0) { HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to write data to the file"); } *must_convert = FALSE; - done: FUNC_LEAVE(ret_value); } |