From a4c2e0624d37ef04ca7f37714de97453a714e364 Mon Sep 17 00:00:00 2001 From: tbeu Date: Mon, 23 Oct 2023 18:12:52 +0200 Subject: [PATCH] Fixed read performance of cell/struct array from HDF5 MAT file * The performance gain is obtained by removing the slow HDF5 API function H5Iget_name being the main bottleneck. Handles of HDF5 groups or datasets are now kept open for the lifetime of the matvar_t instance. * As a side-effect, the hdf5_name could be removed from matvar_t.internal, too. * Fix reference counting in Mat_VarDuplicate * As reported by https://github.com/tbeu/matio/issues/65 and https://github.com/tbeu/matio/pull/198 --- src/mat.c | 19 +++----- src/mat73.c | 107 +++++++++++++------------------------------- src/matio_private.h | 1 - test/test_mat.c | 84 +++++++++++++++++----------------- 4 files changed, 80 insertions(+), 131 deletions(-) diff --git a/src/mat.c b/src/mat.c index 12a77d04..29754ee6 100644 --- a/src/mat.c +++ b/src/mat.c @@ -935,9 +935,8 @@ Mat_VarCalloc(void) matvar = NULL; } else { #if defined(MAT73) && MAT73 - matvar->internal->hdf5_name = NULL; matvar->internal->hdf5_ref = 0; - matvar->internal->id = -1; + matvar->internal->id = H5I_INVALID_HID; #endif matvar->internal->datapos = 0; matvar->internal->num_fields = 0; @@ -1468,11 +1467,11 @@ Mat_VarDuplicate(const matvar_t *in, int opt) if ( NULL != in->internal ) { #if defined(MAT73) && MAT73 - if ( NULL != in->internal->hdf5_name ) - out->internal->hdf5_name = strdup(in->internal->hdf5_name); - out->internal->hdf5_ref = in->internal->hdf5_ref; out->internal->id = in->internal->id; + if ( out->internal->id >= 0 ) { + H5Iinc_ref(out->internal->id); + } #endif out->internal->datapos = in->internal->datapos; #if HAVE_ZLIB @@ -1771,24 +1770,20 @@ Mat_VarFree(matvar_t *matvar) } #endif #if defined(MAT73) && MAT73 - if ( -1 < matvar->internal->id ) { + if ( H5I_INVALID_HID != matvar->internal->id ) { switch ( H5Iget_type(matvar->internal->id) ) { case H5I_GROUP: H5Gclose(matvar->internal->id); - matvar->internal->id = -1; + matvar->internal->id = H5I_INVALID_HID; break; case H5I_DATASET: H5Dclose(matvar->internal->id); - matvar->internal->id = -1; + matvar->internal->id = H5I_INVALID_HID; break; default: break; } } - if ( NULL != matvar->internal->hdf5_name ) { - free(matvar->internal->hdf5_name); - matvar->internal->hdf5_name = NULL; - } #endif if ( NULL != matvar->internal->fieldnames && matvar->internal->num_fields > 0 ) { size_t i; diff --git a/src/mat73.c b/src/mat73.c index a39b4ec5..2fe082cf 100644 --- a/src/mat73.c +++ b/src/mat73.c @@ -460,20 +460,10 @@ static int Mat_H5ReadVarInfo(matvar_t *matvar, hid_t dset_id) { hid_t attr_id, type_id; - ssize_t name_len; int err = MATIO_E_NO_ERROR; char *class_str; - /* Get the HDF5 name of the variable */ - name_len = H5Iget_name(dset_id, NULL, 0); - if ( name_len > 0 ) { - matvar->internal->hdf5_name = (char *)malloc(name_len + 1); - (void)H5Iget_name(dset_id, matvar->internal->hdf5_name, name_len + 1); - } else { - /* Can not get an internal name, so leave the identifier open */ - matvar->internal->id = dset_id; - } - + matvar->internal->id = dset_id; attr_id = H5Aopen_by_name(dset_id, ".", "MATLAB_class", H5P_DEFAULT, H5P_DEFAULT); type_id = H5Aget_type(attr_id); class_str = (char *)calloc(H5Tget_size(type_id) + 1, 1); @@ -922,9 +912,8 @@ Mat_H5ReadGroupInfo(mat_t *mat, matvar_t *matvar, hid_t dset_id) struct ReadGroupInfoIterData group_data = {0, NULL}; /* First iteration to retrieve number of relevant links */ - herr = H5Literate_by_name(dset_id, matvar->internal->hdf5_name, H5_INDEX_NAME, - H5_ITER_NATIVE, NULL, Mat_H5ReadGroupInfoIterate, - (void *)&group_data, H5P_DEFAULT); + herr = H5Literate(dset_id, H5_INDEX_NAME, H5_ITER_NATIVE, NULL, + Mat_H5ReadGroupInfoIterate, (void *)&group_data); if ( herr > 0 && group_data.nfields > 0 ) { matvar->internal->fieldnames = (char **)calloc( (size_t)(group_data.nfields), sizeof(*matvar->internal->fieldnames)); @@ -932,9 +921,8 @@ Mat_H5ReadGroupInfo(mat_t *mat, matvar_t *matvar, hid_t dset_id) group_data.matvar = matvar; if ( matvar->internal->fieldnames != NULL ) { /* Second iteration to fill fieldnames */ - H5Literate_by_name(dset_id, matvar->internal->hdf5_name, H5_INDEX_NAME, - H5_ITER_NATIVE, NULL, Mat_H5ReadGroupInfoIterate, - (void *)&group_data, H5P_DEFAULT); + H5Literate(dset_id, H5_INDEX_NAME, H5_ITER_NATIVE, NULL, + Mat_H5ReadGroupInfoIterate, (void *)&group_data); } matvar->internal->num_fields = (unsigned)group_data.nfields; nfields = group_data.nfields; @@ -1085,19 +1073,18 @@ Mat_H5ReadGroupInfo(mat_t *mat, matvar_t *matvar, hid_t dset_id) } else { err = MATIO_E_OUT_OF_MEMORY; } + H5Dclose(field_id); } else { fields[k] = Mat_VarCalloc(); fields[k]->name = strdup(matvar->internal->fieldnames[k]); err = Mat_H5ReadDatasetInfo(mat, fields[k], field_id); } - H5Dclose(field_id); } else if ( object_info.type == H5O_TYPE_GROUP ) { field_id = H5Gopen(dset_id, matvar->internal->fieldnames[k], H5P_DEFAULT); if ( -1 < field_id ) { fields[k] = Mat_VarCalloc(); fields[k]->name = strdup(matvar->internal->fieldnames[k]); err = Mat_H5ReadGroupInfo(mat, fields[k], field_id); - H5Gclose(field_id); } } if ( err ) { @@ -1225,8 +1212,10 @@ Mat_H5ReadNextReferenceData(matvar_t *matvar, mat_t *mat) int err = MATIO_E_NO_ERROR; size_t nelems = 1; - if ( NULL == matvar || NULL == matvar->internal || matvar->internal->id < 0 ) - return err; + if ( NULL == mat || NULL == matvar ) + return MATIO_E_BAD_ARGUMENT; + if ( matvar->internal->id < 0 ) + return MATIO_E_FAIL_TO_IDENTIFY; /* If the datatype with references is a cell, we've already read info into * the variable data, so just loop over each cell element and call @@ -1273,7 +1262,7 @@ Mat_H5ReadNextReferenceData(matvar_t *matvar, mat_t *mat) err |= Mul(&matvar->nbytes, nelems, matvar->data_size); if ( err || matvar->nbytes < 1 ) { H5Dclose(matvar->internal->id); - matvar->internal->id = -1; + matvar->internal->id = H5I_INVALID_HID; break; } @@ -1286,8 +1275,6 @@ Mat_H5ReadNextReferenceData(matvar_t *matvar, mat_t *mat) err = Mat_H5ReadData(matvar->internal->id, data_type_id, H5S_ALL, H5S_ALL, matvar->isComplex, matvar->data); } - H5Dclose(matvar->internal->id); - matvar->internal->id = -1; break; } case H5I_GROUP: { @@ -1303,7 +1290,7 @@ Mat_H5ReadNextReferenceData(matvar_t *matvar, mat_t *mat) fields = (matvar_t **)matvar->data; for ( i = 0; i < nelems; i++ ) { if ( NULL != fields[i] && 0 < fields[i]->internal->hdf5_ref && - -1 < fields[i]->internal->id ) { + fields[i]->internal->id >= 0 ) { /* Dataset of references */ err = Mat_H5ReadNextReferenceData(fields[i], mat); } else { @@ -2679,8 +2666,8 @@ Mat_VarRead73(mat_t *mat, matvar_t *matvar) if ( NULL == mat || NULL == matvar ) return MATIO_E_BAD_ARGUMENT; - else if ( NULL == matvar->internal->hdf5_name && 0 > matvar->internal->id ) - return MATIO_E_READ_VARIABLE_DOES_NOT_EXIST; + else if ( matvar->internal->id < 0 ) + return MATIO_E_FAIL_TO_IDENTIFY; fid = *(hid_t *)mat->fp; @@ -2711,15 +2698,9 @@ Mat_VarRead73(mat_t *mat, matvar_t *matvar) if ( nelems < 1 ) break; - if ( NULL != matvar->internal->hdf5_name ) { - ref_id = H5Dopen(fid, matvar->internal->hdf5_name, H5P_DEFAULT); - if ( ref_id == H5I_INVALID_HID ) { - Mat_Critical("Unexpected error from H5Dopen"); - } - } else { - ref_id = matvar->internal->id; - H5Iinc_ref(ref_id); - } + ref_id = matvar->internal->id; + H5Iinc_ref(ref_id); + if ( 0 < matvar->internal->hdf5_ref ) { dset_id = H5RDEREFERENCE(ref_id, H5R_OBJECT, &matvar->internal->hdf5_ref); } else { @@ -2754,15 +2735,9 @@ Mat_VarRead73(mat_t *mat, matvar_t *matvar) return err; } - if ( NULL != matvar->internal->hdf5_name ) { - dset_id = H5Dopen(fid, matvar->internal->hdf5_name, H5P_DEFAULT); - if ( dset_id == H5I_INVALID_HID ) { - Mat_Critical("Unexpected error from H5Dopen"); - } - } else { - dset_id = matvar->internal->id; - H5Iinc_ref(dset_id); - } + dset_id = matvar->internal->id; + H5Iinc_ref(dset_id); + if ( matvar->nbytes > 0 ) { matvar->data = malloc(matvar->nbytes); if ( NULL != matvar->data ) { @@ -2799,7 +2774,7 @@ Mat_VarRead73(mat_t *mat, matvar_t *matvar) fields = (matvar_t **)matvar->data; for ( i = 0; i < nelems_x_nfields; i++ ) { if ( NULL != fields[i] && 0 < fields[i]->internal->hdf5_ref && - -1 < fields[i]->internal->id ) { + fields[i]->internal->id >= 0 ) { /* Dataset of references */ err = Mat_H5ReadNextReferenceData(fields[i], mat); } else { @@ -2836,15 +2811,8 @@ Mat_VarRead73(mat_t *mat, matvar_t *matvar) hid_t sparse_dset_id; mat_sparse_t *sparse_data = (mat_sparse_t *)calloc(1, sizeof(*sparse_data)); - if ( NULL != matvar->internal->hdf5_name ) { - dset_id = H5Gopen(fid, matvar->internal->hdf5_name, H5P_DEFAULT); - if ( dset_id == H5I_INVALID_HID ) { - Mat_Critical("Unexpected error from H5Dopen"); - } - } else { - dset_id = matvar->internal->id; - H5Iinc_ref(dset_id); - } + dset_id = matvar->internal->id; + H5Iinc_ref(dset_id); if ( H5Lexists(dset_id, "ir", H5P_DEFAULT) ) { size_t *dims; @@ -3010,7 +2978,7 @@ Mat_VarReadData73(mat_t *mat, matvar_t *matvar, void *data, int *start, int *str if ( NULL == mat || NULL == matvar || NULL == data || NULL == start || NULL == stride || NULL == edge ) return MATIO_E_BAD_ARGUMENT; - else if ( NULL == matvar->internal->hdf5_name && 0 > matvar->internal->id ) + else if ( matvar->internal->id < 0 ) return MATIO_E_FAIL_TO_IDENTIFY; fid = *(hid_t *)mat->fp; @@ -3041,15 +3009,9 @@ Mat_VarReadData73(mat_t *mat, matvar_t *matvar, void *data, int *start, int *str case MAT_C_UINT16: case MAT_C_INT8: case MAT_C_UINT8: - if ( NULL != matvar->internal->hdf5_name ) { - ref_id = H5Dopen(fid, matvar->internal->hdf5_name, H5P_DEFAULT); - if ( ref_id == H5I_INVALID_HID ) { - Mat_Critical("Unexpected error from H5Dopen"); - } - } else { - ref_id = matvar->internal->id; - H5Iinc_ref(ref_id); - } + ref_id = matvar->internal->id; + H5Iinc_ref(ref_id); + if ( 0 < matvar->internal->hdf5_ref ) { dset_id = H5RDEREFERENCE(ref_id, H5R_OBJECT, &matvar->internal->hdf5_ref); } else { @@ -3101,7 +3063,7 @@ Mat_VarReadDataLinear73(mat_t *mat, matvar_t *matvar, void *data, int start, int if ( NULL == mat || NULL == matvar || NULL == data ) return MATIO_E_BAD_ARGUMENT; - else if ( NULL == matvar->internal->hdf5_name && 0 > matvar->internal->id ) + else if ( matvar->internal->id < 0 ) return MATIO_E_FAIL_TO_IDENTIFY; fid = *(hid_t *)mat->fp; @@ -3145,15 +3107,9 @@ Mat_VarReadDataLinear73(mat_t *mat, matvar_t *matvar, void *data, int start, int } free(dimp); - if ( NULL != matvar->internal->hdf5_name ) { - dset_id = H5Dopen(fid, matvar->internal->hdf5_name, H5P_DEFAULT); - if ( dset_id == H5I_INVALID_HID ) { - Mat_Critical("Unexpected error from H5Dopen"); - } - } else { - dset_id = matvar->internal->id; - H5Iinc_ref(dset_id); - } + dset_id = matvar->internal->id; + H5Iinc_ref(dset_id); + dset_space = H5Dget_space(dset_id); H5Sselect_elements(dset_space, H5S_SELECT_SET, (size_t)dset_edge, points); free(points); @@ -3280,7 +3236,6 @@ Mat_VarReadNextInfoIterate(hid_t id, const char *name, const H5L_info_t *info, v dset_id = H5Gopen(id, name, H5P_DEFAULT); err = Mat_H5ReadGroupInfo(mat, matvar, dset_id); - H5Gclose(dset_id); if ( err ) { Mat_VarFree(matvar); return -1; diff --git a/src/matio_private.h b/src/matio_private.h index 56eddb71..68aaed0e 100644 --- a/src/matio_private.h +++ b/src/matio_private.h @@ -127,7 +127,6 @@ struct _mat_t struct matvar_internal { #if defined(MAT73) && MAT73 - char *hdf5_name; /**< Name */ hobj_ref_t hdf5_ref; /**< Reference */ hid_t id; /**< Id */ #endif diff --git a/test/test_mat.c b/test/test_mat.c index f31b076d..b91533bc 100644 --- a/test/test_mat.c +++ b/test/test_mat.c @@ -2930,7 +2930,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class double ptr[4], pti[4]; c.Re = ptr; c.Im = pti; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); printf("%g + %gi %g + %gi\n%g + %gi %g + %gi\n", ptr[0], pti[0], ptr[2], pti[2], ptr[1], pti[1], ptr[3], pti[3]); if ( MAT_FT_MAT73 != mat->version ) { @@ -2939,14 +2939,14 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); } } printf("%g + %gi %g + %gi\n%g + %gi %g + %gi\n", ptr[0], pti[0], ptr[2], pti[2], ptr[1], pti[1], ptr[3], pti[3]); } else { double ptr[4]; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); printf("%g %g\n%g %g\n", ptr[0], ptr[2], ptr[1], ptr[3]); if ( MAT_FT_MAT73 != mat->version ) { size_t *tmp = realloc(matvar->dims, 3 * sizeof(size_t)); @@ -2954,7 +2954,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); } } printf("%g %g\n%g %g\n", ptr[0], ptr[2], ptr[1], ptr[3]); @@ -2967,7 +2967,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class float ptr[4], pti[4]; c.Re = ptr; c.Im = pti; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); printf("%g + %gi %g + %gi\n%g + %gi %g + %gi\n", ptr[0], pti[0], ptr[2], pti[2], ptr[1], pti[1], ptr[3], pti[3]); if ( MAT_FT_MAT73 != mat->version ) { @@ -2976,14 +2976,14 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); } } printf("%g + %gi %g + %gi\n%g + %gi %g + %gi\n", ptr[0], pti[0], ptr[2], pti[2], ptr[1], pti[1], ptr[3], pti[3]); } else { float ptr[4]; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); printf("%g %g\n%g %g\n", ptr[0], ptr[2], ptr[1], ptr[3]); if ( MAT_FT_MAT73 != mat->version ) { size_t *tmp = realloc(matvar->dims, 3 * sizeof(size_t)); @@ -2991,7 +2991,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); } } printf("%g %g\n%g %g\n", ptr[0], ptr[2], ptr[1], ptr[3]); @@ -3005,7 +3005,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class mat_int64_t ptr[4], pti[4]; c.Re = ptr; c.Im = pti; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); #if HAVE_INTTYPES_H printf("%" PRIi64 " + %" PRIi64 "i %" PRIi64 " + %" PRIi64 "i\n" @@ -3022,7 +3022,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); } } #if HAVE_INTTYPES_H @@ -3037,7 +3037,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class #endif } else { mat_int64_t ptr[4]; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); #if HAVE_INTTYPES_H printf("%" PRIi64 " %" PRIi64 "\n%" PRIi64 " %" PRIi64 "\n", ptr[0], ptr[2], ptr[1], ptr[3]); @@ -3051,7 +3051,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); } } #if HAVE_INTTYPES_H @@ -3072,7 +3072,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class mat_uint64_t ptr[4], pti[4]; c.Re = ptr; c.Im = pti; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); #if HAVE_INTTYPES_H printf("%" PRIu64 " + %" PRIu64 "i %" PRIu64 " + %" PRIu64 "i\n" @@ -3090,7 +3090,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); } } #if HAVE_INTTYPES_H @@ -3106,7 +3106,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class #endif } else { mat_uint64_t ptr[4]; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); #if HAVE_INTTYPES_H printf("%" PRIu64 " %" PRIu64 "\n%" PRIu64 " %" PRIu64 "\n", ptr[0], ptr[2], ptr[1], ptr[3]); @@ -3120,7 +3120,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); } } #if HAVE_INTTYPES_H @@ -3140,7 +3140,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class mat_int32_t ptr[4], pti[4]; c.Re = ptr; c.Im = pti; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); printf("%d + %di %d + %di\n%d + %di %d + %di\n", ptr[0], pti[0], ptr[2], pti[2], ptr[1], pti[1], ptr[3], pti[3]); if ( MAT_FT_MAT73 != mat->version ) { @@ -3149,14 +3149,14 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); } } printf("%d + %di %d + %di\n%d + %di %d + %di\n", ptr[0], pti[0], ptr[2], pti[2], ptr[1], pti[1], ptr[3], pti[3]); } else { mat_int32_t ptr[4]; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); printf("%d %d\n%d %d\n", ptr[0], ptr[2], ptr[1], ptr[3]); if ( MAT_FT_MAT73 != mat->version ) { size_t *tmp = realloc(matvar->dims, 3 * sizeof(size_t)); @@ -3164,7 +3164,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); } } printf("%d %d\n%d %d\n", ptr[0], ptr[2], ptr[1], ptr[3]); @@ -3177,7 +3177,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class mat_uint32_t ptr[4], pti[4]; c.Re = ptr; c.Im = pti; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); printf("%u + %ui %u + %ui\n%u + %ui %u + %ui\n", ptr[0], pti[0], ptr[2], pti[2], ptr[1], pti[1], ptr[3], pti[3]); if ( MAT_FT_MAT73 != mat->version ) { @@ -3186,14 +3186,14 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); } } printf("%u + %ui %u + %ui\n%u + %ui %u + %ui\n", ptr[0], pti[0], ptr[2], pti[2], ptr[1], pti[1], ptr[3], pti[3]); } else { mat_uint32_t ptr[4]; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); printf("%u %u\n%u %u\n", ptr[0], ptr[2], ptr[1], ptr[3]); if ( MAT_FT_MAT73 != mat->version ) { size_t *tmp = realloc(matvar->dims, 3 * sizeof(size_t)); @@ -3201,7 +3201,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); } } printf("%u %u\n%u %u\n", ptr[0], ptr[2], ptr[1], ptr[3]); @@ -3214,7 +3214,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class mat_int16_t ptr[4], pti[4]; c.Re = ptr; c.Im = pti; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); printf("%hd + %hdi %hd + %hdi\n%hd + %hdi %hd + %hdi\n", ptr[0], pti[0], ptr[2], pti[2], ptr[1], pti[1], ptr[3], pti[3]); if ( MAT_FT_MAT73 != mat->version ) { @@ -3223,14 +3223,14 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); } } printf("%hd + %hdi %hd + %hdi\n%hd + %hdi %hd + %hdi\n", ptr[0], pti[0], ptr[2], pti[2], ptr[1], pti[1], ptr[3], pti[3]); } else { mat_int16_t ptr[4]; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); printf("%hd %hd\n%hd %hd\n", ptr[0], ptr[2], ptr[1], ptr[3]); if ( MAT_FT_MAT73 != mat->version ) { size_t *tmp = realloc(matvar->dims, 3 * sizeof(size_t)); @@ -3238,7 +3238,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); } } printf("%hd %hd\n%hd %hd\n", ptr[0], ptr[2], ptr[1], ptr[3]); @@ -3251,7 +3251,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class mat_uint16_t ptr[4], pti[4]; c.Re = ptr; c.Im = pti; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); printf("%hu + %hui %hu + %hui\n%hu + %hui %hu + %hui\n", ptr[0], pti[0], ptr[2], pti[2], ptr[1], pti[1], ptr[3], pti[3]); if ( MAT_FT_MAT73 != mat->version ) { @@ -3260,14 +3260,14 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); } } printf("%hu + %hui %hu + %hui\n%hu + %hui %hu + %hui\n", ptr[0], pti[0], ptr[2], pti[2], ptr[1], pti[1], ptr[3], pti[3]); } else { mat_uint16_t ptr[4]; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); printf("%hu %hu\n%hu %hu\n", ptr[0], ptr[2], ptr[1], ptr[3]); if ( MAT_FT_MAT73 != mat->version ) { size_t *tmp = realloc(matvar->dims, 3 * sizeof(size_t)); @@ -3275,7 +3275,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); } } printf("%hu %hu\n%hu %hu\n", ptr[0], ptr[2], ptr[1], ptr[3]); @@ -3288,7 +3288,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class mat_int8_t ptr[4], pti[4]; c.Re = ptr; c.Im = pti; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); printf("%hhd + %hhdi %hhd + %hhdi\n%hhd + %hhdi %hhd + %hhdi\n", ptr[0], pti[0], ptr[2], pti[2], ptr[1], pti[1], ptr[3], pti[3]); if ( MAT_FT_MAT73 != mat->version ) { @@ -3297,14 +3297,14 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); } } printf("%hhd + %hhdi %hhd + %hhdi\n%hhd + %hhdi %hhd + %hhdi\n", ptr[0], pti[0], ptr[2], pti[2], ptr[1], pti[1], ptr[3], pti[3]); } else { mat_int8_t ptr[4]; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); printf("%hhd %hhd\n%hhd %hhd\n", ptr[0], ptr[2], ptr[1], ptr[3]); if ( MAT_FT_MAT73 != mat->version ) { size_t *tmp = realloc(matvar->dims, 3 * sizeof(size_t)); @@ -3312,7 +3312,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); } } printf("%hhd %hhd\n%hhd %hhd\n", ptr[0], ptr[2], ptr[1], ptr[3]); @@ -3325,7 +3325,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class mat_uint8_t ptr[4], pti[4]; c.Re = ptr; c.Im = pti; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); printf("%hhu + %hhui %hhu + %hhui\n%hhu + %hhui %hhu + %hhui\n", ptr[0], pti[0], ptr[2], pti[2], ptr[1], pti[1], ptr[3], pti[3]); if ( MAT_FT_MAT73 != mat->version ) { @@ -3334,14 +3334,14 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, &c, start, stride, edge); + err += Mat_VarReadData(mat, matvar, &c, start, stride, edge); } } printf("%hhu + %hhui %hhu + %hhui\n%hhu + %hhui %hhu + %hhui\n", ptr[0], pti[0], ptr[2], pti[2], ptr[1], pti[1], ptr[3], pti[3]); } else { mat_uint8_t ptr[4]; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); printf("%hhu %hhu\n%hhu %hhu\n", ptr[0], ptr[2], ptr[1], ptr[3]); if ( MAT_FT_MAT73 != mat->version ) { size_t *tmp = realloc(matvar->dims, 3 * sizeof(size_t)); @@ -3349,7 +3349,7 @@ test_readslab(const char *file, const char *var, enum matio_classes matvar_class matvar->rank++; matvar->dims = tmp; matvar->dims[2] = 1; - Mat_VarReadData(mat, matvar, ptr, start, stride, edge); + err += Mat_VarReadData(mat, matvar, ptr, start, stride, edge); } } printf("%hhu %hhu\n%hhu %hhu\n", ptr[0], ptr[2], ptr[1], ptr[3]); @@ -3908,7 +3908,7 @@ main(int argc, char *argv[]) matvar_t *copy = Mat_VarDuplicate(matvar, 1); Mat_VarFree(matvar); if ( NULL != copy ) { - Mat_VarWrite(mat, copy, compression); + err += Mat_VarWrite(mat, copy, compression); Mat_VarFree(copy); } else { err++; @@ -4180,7 +4180,7 @@ main(int argc, char *argv[]) output_name = "test_write_reshape32x32x32.mat"; mat2 = Mat_CreateVer(output_name, NULL, mat_file_ver); if ( NULL != mat2 ) { - Mat_VarWrite(mat2, matvar, compression); + err += Mat_VarWrite(mat2, matvar, compression); Mat_Close(mat2); } }