From 51da322882c72fa1c9e5c173b6e60ec283f7b4a1 Mon Sep 17 00:00:00 2001 From: Pedro Vicente Nunes Date: Mon, 20 Nov 2006 16:31:06 -0500 Subject: [svn-r12953] h5repack code revision, avoid one unnecessary call to file open/close in the cheking of objects when there are none requested by the user --- tools/h5repack/h5repack_list.c | 285 ++++++++++++++--------------- tools/lib/h5trav.c | 402 +++++++++++++++++++++-------------------- 2 files changed, 351 insertions(+), 336 deletions(-) diff --git a/tools/h5repack/h5repack_list.c b/tools/h5repack/h5repack_list.c index cb9cad9..71c1798 100644 --- a/tools/h5repack/h5repack_list.c +++ b/tools/h5repack/h5repack_list.c @@ -38,125 +38,128 @@ extern char *progname; int check_objects(const char* fname, pack_opt_t *options) { - hid_t fid; - unsigned int i; - trav_table_t *travt=NULL; - -/*------------------------------------------------------------------------- - * open the file - *------------------------------------------------------------------------- - */ - if ((fid=h5tools_fopen(fname, NULL, NULL, 0))<0){ - printf("<%s>: %s\n", fname, H5FOPENERROR ); - return -1; - } - -/*------------------------------------------------------------------------- - * get the list of objects in the file - *------------------------------------------------------------------------- - */ - - /* init table */ - trav_table_init(&travt); - - /* get the list of objects in the file */ - if (h5trav_gettable(fid,travt)<0) - goto out; - -/*------------------------------------------------------------------------- - * compare with user supplied list - *------------------------------------------------------------------------- - */ - - if (options->verbose) - { - printf("Opening file <%s>. Searching for objects to modify...\n",fname); - } - - for ( i = 0; i < options->op_tbl->nelems; i++) - { - char* name=options->op_tbl->objs[i].path; - if (options->verbose) - printf(" <%s>",name); - - /* the input object names are present in the file and are valid */ - if (h5trav_getindext(name,travt)<0) - { - error_msg(progname, "%s Could not find <%s> in file <%s>. Exiting...\n", - (options->verbose?"\n":""),name,fname); - goto out; - } - if (options->verbose) - printf("...Found\n"); - - - /* check for extra filter conditions */ - switch (options->op_tbl->objs[i].filter->filtn) - { - - /* chunk size must be smaller than pixels per block */ - case H5Z_FILTER_SZIP: - { - int j; - int csize=1; - int ppb=options->op_tbl->objs[i].filter->cd_values[0]; - hsize_t dims[H5S_MAX_RANK]; - int rank; - hid_t did; - hid_t sid; - - if (options->op_tbl->objs[i].chunk.rank>0) - { - rank=options->op_tbl->objs[i].chunk.rank; - for (j=0; jop_tbl->objs[i].chunk.chunk_lengths[j]; + hid_t fid; + unsigned int i; + trav_table_t *travt=NULL; + + /* nothing to do */ + if (options->op_tbl->nelems==0) + return 0; + + /*------------------------------------------------------------------------- + * open the file + *------------------------------------------------------------------------- + */ + if ((fid=h5tools_fopen(fname, NULL, NULL, 0))<0){ + printf("<%s>: %s\n", fname, H5FOPENERROR ); + return -1; } - else + + /*------------------------------------------------------------------------- + * get the list of objects in the file + *------------------------------------------------------------------------- + */ + + /* init table */ + trav_table_init(&travt); + + /* get the list of objects in the file */ + if (h5trav_gettable(fid,travt)<0) + goto out; + + /*------------------------------------------------------------------------- + * compare with user supplied list + *------------------------------------------------------------------------- + */ + + if (options->verbose) { - if ((did=H5Dopen(fid,travt->objs[i].name))<0) - goto out; - if ((sid=H5Dget_space(did))<0) - goto out; - if ( (rank=H5Sget_simple_extent_ndims(sid))<0) - goto out; - HDmemset(dims, 0, sizeof dims); - if ( H5Sget_simple_extent_dims(sid,dims,NULL)<0) - goto out; - for (j=0; j. Searching for objects to modify...\n",fname); } - - if (csize < ppb ) + + for ( i = 0; i < options->op_tbl->nelems; i++) { - printf(" \n"); - goto out; - } - - - } - break; - - } - - - - } /* i */ -/*------------------------------------------------------------------------- - * close - *------------------------------------------------------------------------- - */ - H5Fclose(fid); - trav_table_free(travt); - return 0; - + char* name=options->op_tbl->objs[i].path; + if (options->verbose) + printf(" <%s>",name); + + /* the input object names are present in the file and are valid */ + if (h5trav_getindext(name,travt)<0) + { + error_msg(progname, "%s Could not find <%s> in file <%s>. Exiting...\n", + (options->verbose?"\n":""),name,fname); + goto out; + } + if (options->verbose) + printf("...Found\n"); + + + /* check for extra filter conditions */ + switch (options->op_tbl->objs[i].filter->filtn) + { + + /* chunk size must be smaller than pixels per block */ + case H5Z_FILTER_SZIP: + { + int j; + int csize=1; + int ppb=options->op_tbl->objs[i].filter->cd_values[0]; + hsize_t dims[H5S_MAX_RANK]; + int rank; + hid_t did; + hid_t sid; + + if (options->op_tbl->objs[i].chunk.rank>0) + { + rank=options->op_tbl->objs[i].chunk.rank; + for (j=0; jop_tbl->objs[i].chunk.chunk_lengths[j]; + } + else + { + if ((did=H5Dopen(fid,travt->objs[i].name))<0) + goto out; + if ((sid=H5Dget_space(did))<0) + goto out; + if ( (rank=H5Sget_simple_extent_ndims(sid))<0) + goto out; + HDmemset(dims, 0, sizeof dims); + if ( H5Sget_simple_extent_dims(sid,dims,NULL)<0) + goto out; + for (j=0; j\n"); + goto out; + } + + + } + break; + + } + + } /* i */ + + /*------------------------------------------------------------------------- + * close + *------------------------------------------------------------------------- + */ + H5Fclose(fid); + trav_table_free(travt); + return 0; + out: - H5Fclose(fid); - trav_table_free(travt); - return -1; + H5Fclose(fid); + trav_table_free(travt); + return -1; } @@ -178,33 +181,33 @@ void print_objlist(const char *filename, int nobjects, trav_info_t *info ) { - int i; - - printf("File <%s>: # of entries = %d\n", filename, nobjects ); - for ( i = 0; i < nobjects; i++) - { - switch ( info[i].type ) - { - case H5G_GROUP: - printf(" %-10s %s\n", "group", info[i].name ); - break; - case H5G_DATASET: - printf(" %-10s %s\n", "dataset", info[i].name ); - break; - case H5G_TYPE: - printf(" %-10s %s\n", "datatype", info[i].name ); - break; - case H5G_LINK: - printf(" %-10s %s\n", "link", info[i].name ); - break; - case H5G_UDLINK: - printf(" %-10s %s\n", "User defined link", info[i].name ); - break; - default: - printf(" %-10s %s\n", "User defined object", info[i].name ); - break; - } - } + int i; + + printf("File <%s>: # of entries = %d\n", filename, nobjects ); + for ( i = 0; i < nobjects; i++) + { + switch ( info[i].type ) + { + case H5G_GROUP: + printf(" %-10s %s\n", "group", info[i].name ); + break; + case H5G_DATASET: + printf(" %-10s %s\n", "dataset", info[i].name ); + break; + case H5G_TYPE: + printf(" %-10s %s\n", "datatype", info[i].name ); + break; + case H5G_LINK: + printf(" %-10s %s\n", "link", info[i].name ); + break; + case H5G_UDLINK: + printf(" %-10s %s\n", "User defined link", info[i].name ); + break; + default: + printf(" %-10s %s\n", "User defined object", info[i].name ); + break; + } + } } diff --git a/tools/lib/h5trav.c b/tools/lib/h5trav.c index 4ef495d..3da1ee0 100644 --- a/tools/lib/h5trav.c +++ b/tools/lib/h5trav.c @@ -16,22 +16,31 @@ #include "h5trav.h" #include "H5private.h" -/* functions for traversal */ +/*------------------------------------------------------------------------- + * local functions + *------------------------------------------------------------------------- + */ static int traverse( hid_t loc_id, - const char *group_name, - trav_table_t *table, - trav_info_t *info, - int *idx, - int print); + const char *group_name, + trav_table_t *table, + trav_info_t *info, + int *idx, + int print); static hssize_t get_nnames( hid_t loc_id, - const char *group_name ); + const char *group_name ); -herr_t get_name_type( hid_t loc_id, - const char *group_name, - int idx, - char **name, - H5G_obj_t *type ); +static herr_t get_name_type( hid_t loc_id, + const char *group_name, + int idx, + char **name, + H5G_obj_t *type ); + + +/*------------------------------------------------------------------------- + * "h5trav info" public functions. used in h5diff + *------------------------------------------------------------------------- + */ /*------------------------------------------------------------------------- * Function: h5trav_getinfo @@ -67,37 +76,8 @@ int h5trav_getinfo(hid_t file_id, trav_table_free( table ); return nnames; - } - -/*------------------------------------------------------------------------- - * Function: h5trav_gettable - * - * Purpose: get the trav_table_t struct - * - * Return: 0, -1 on error - * - * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu - * - * Date: December 17, 2003 - * - *------------------------------------------------------------------------- - */ - -int h5trav_gettable(hid_t fid, trav_table_t *travt) -{ - int nnames=0; - - /* iterate starting on the root group */ - if (( nnames = traverse(fid,"/",travt,NULL,&nnames,0))<0) - return -1; - - return 0; - -} - - /*------------------------------------------------------------------------- * Function: h5trav_getindex * @@ -133,8 +113,6 @@ int h5trav_getindex( const char *obj, int nobjs, trav_info_t *info ) return -1; } - - /*------------------------------------------------------------------------- * Function: h5trav_freeinfo * @@ -157,6 +135,182 @@ void h5trav_freeinfo( trav_info_t *info, int nobjs ) } } +/*------------------------------------------------------------------------- + * Function: h5trav_printinfo + * + * Purpose: print list of names in file + * + * Return: void + * + * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu + * + * Date: May 9, 2003 + * + *------------------------------------------------------------------------- + */ +void h5trav_printinfo(int nobjs, trav_info_t *travi) +{ + int i; + for ( i = 0; i < nobjs; i++) + { + switch ( travi[i].type ) + { + case H5G_GROUP: + printf(" %-10s %s\n", "group", travi[i].name ); + break; + case H5G_DATASET: + printf(" %-10s %s\n", "dataset", travi[i].name ); + break; + case H5G_TYPE: + printf(" %-10s %s\n", "datatype", travi[i].name ); + break; + case H5G_LINK: + printf(" %-10s %s\n", "link", travi[i].name ); + break; + case H5G_UDLINK: + printf(" %-10s %s\n", "User defined link", travi[i].name ); + break; + default: + printf(" %-10s %s\n", "User defined object", travi[i].name ); + break; + } + } +} + +/*------------------------------------------------------------------------- + * "h5trav table" public functions. used in h5repack + *------------------------------------------------------------------------- + */ + +/*------------------------------------------------------------------------- + * Function: h5trav_getindext + * + * Purpose: get index of NAME in list + * + * Return: index, -1 if not found + * + * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu + * + * Date: December 18, 2003 + * + *------------------------------------------------------------------------- + */ + +int h5trav_getindext(const char *name, trav_table_t *table) +{ + char *pdest; + int result; + unsigned int i, j; + + for ( i = 0; i < table->nobjs; i++) + { + if ( strcmp(name,table->objs[i].name)==0 ) + return i; + + pdest = strstr( table->objs[i].name, name ); + result = (int)(pdest - table->objs[i].name); + + /* found at position 1, meaning without '/' */ + if( pdest != NULL && result==1 && strlen(table->objs[i].name)-1==strlen(name)) + return i; + + /* search also in the list of links */ + if (table->objs[i].nlinks) + { + for ( j=0; jobjs[i].nlinks; j++) + { + if ( strcmp(name,table->objs[i].links[j].new_name)==0 ) + return i; + + pdest = strstr( table->objs[i].links[j].new_name, name ); + result = (int)(pdest - table->objs[i].links[j].new_name); + + /* found at position 1, meaning without '/' */ + if( pdest != NULL && result==1 ) + return i; + + } + } + + } + return -1; +} + +/*------------------------------------------------------------------------- + * Function: h5trav_gettable + * + * Purpose: get the trav_table_t struct + * + * Return: 0, -1 on error + * + * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu + * + * Date: December 17, 2003 + * + *------------------------------------------------------------------------- + */ + +int h5trav_gettable(hid_t fid, trav_table_t *travt) +{ + int nnames=0; + + /* iterate starting on the root group */ + if (( nnames = traverse(fid,"/",travt,NULL,&nnames,0))<0) + return -1; + + return 0; + +} + +/*------------------------------------------------------------------------- + * Function: h5trav_printtable + * + * Purpose: print list of objects in file + * + * Return: void + * + * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu + * + * Date: May 9, 2003 + * + *------------------------------------------------------------------------- + */ +void h5trav_printtable(trav_table_t *table) +{ + unsigned int i, j; + + for ( i = 0; i < table->nobjs; i++) + { + switch ( table->objs[i].type ) + { + case H5G_GROUP: + printf(" %-10s %s\n", "group", table->objs[i].name ); + break; + case H5G_DATASET: + printf(" %-10s %s\n", "dataset", table->objs[i].name ); + break; + case H5G_TYPE: + printf(" %-10s %s\n", "datatype", table->objs[i].name ); + break; + case H5G_LINK: + printf(" %-10s %s\n", "link", table->objs[i].name ); + break; + default: + printf(" %-10s %s\n", "User defined object", table->objs[i].name ); + break; + } + + if (table->objs[i].nlinks) + { + for ( j=0; jobjs[i].nlinks; j++) + { + printf(" %-10s %s\n", " hardlink", table->objs[i].links[j].new_name ); + } + } + + } +} + /*------------------------------------------------------------------------- * Function: get_nnames @@ -253,11 +407,11 @@ static herr_t opget_info( hid_t loc_id, const char *name, void *op_data) *------------------------------------------------------------------------- */ -herr_t get_name_type( hid_t loc_id, - const char *group_name, - int idx, - char **name, - H5G_obj_t *type ) +static herr_t get_name_type( hid_t loc_id, + const char *group_name, + int idx, + char **name, + H5G_obj_t *type ) { trav_info_t info; @@ -286,11 +440,11 @@ herr_t get_name_type( hid_t loc_id, */ static int traverse( hid_t loc_id, - const char *group_name, - trav_table_t *table, - trav_info_t *info, - int *idx, - int print) + const char *group_name, + trav_table_t *table, + trav_info_t *info, + int *idx, + int print) { haddr_t objno; /* Compact form of object's location */ char *name=NULL; @@ -566,151 +720,9 @@ static int traverse( hid_t loc_id, -/*------------------------------------------------------------------------- - * Function: h5trav_printinfo - * - * Purpose: print list of names in file - * - * Return: void - * - * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu - * - * Date: May 9, 2003 - * - *------------------------------------------------------------------------- - */ -void h5trav_printinfo(int nobjs, trav_info_t *travi) -{ - int i; - for ( i = 0; i < nobjs; i++) - { - switch ( travi[i].type ) - { - case H5G_GROUP: - printf(" %-10s %s\n", "group", travi[i].name ); - break; - case H5G_DATASET: - printf(" %-10s %s\n", "dataset", travi[i].name ); - break; - case H5G_TYPE: - printf(" %-10s %s\n", "datatype", travi[i].name ); - break; - case H5G_LINK: - printf(" %-10s %s\n", "link", travi[i].name ); - break; - case H5G_UDLINK: - printf(" %-10s %s\n", "User defined link", travi[i].name ); - break; - default: - printf(" %-10s %s\n", "User defined object", travi[i].name ); - break; - } - } -} - - - -/*------------------------------------------------------------------------- - * Function: h5trav_printtable - * - * Purpose: print list of objects in file - * - * Return: void - * - * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu - * - * Date: May 9, 2003 - * - *------------------------------------------------------------------------- - */ -void h5trav_printtable(trav_table_t *table) -{ - unsigned int i, j; - - for ( i = 0; i < table->nobjs; i++) - { - switch ( table->objs[i].type ) - { - case H5G_GROUP: - printf(" %-10s %s\n", "group", table->objs[i].name ); - break; - case H5G_DATASET: - printf(" %-10s %s\n", "dataset", table->objs[i].name ); - break; - case H5G_TYPE: - printf(" %-10s %s\n", "datatype", table->objs[i].name ); - break; - case H5G_LINK: - printf(" %-10s %s\n", "link", table->objs[i].name ); - break; - default: - printf(" %-10s %s\n", "User defined object", table->objs[i].name ); - break; - } - - if (table->objs[i].nlinks) - { - for ( j=0; jobjs[i].nlinks; j++) - { - printf(" %-10s %s\n", " hardlink", table->objs[i].links[j].new_name ); - } - } - - } -} - - -/*------------------------------------------------------------------------- - * Function: h5trav_getindext - * - * Purpose: get index of NAME in list - * - * Return: index, -1 if not found - * - * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu - * - * Date: December 18, 2003 - * - *------------------------------------------------------------------------- - */ - -int h5trav_getindext(const char *name, trav_table_t *table) -{ - char *pdest; - int result; - unsigned int i, j; - - for ( i = 0; i < table->nobjs; i++) - { - if ( strcmp(name,table->objs[i].name)==0 ) - return i; - - pdest = strstr( table->objs[i].name, name ); - result = (int)(pdest - table->objs[i].name); - - /* found at position 1, meaning without '/' */ - if( pdest != NULL && result==1 && strlen(table->objs[i].name)-1==strlen(name)) - return i; - /* search also in the list of links */ - if (table->objs[i].nlinks) - { - for ( j=0; jobjs[i].nlinks; j++) - { - if ( strcmp(name,table->objs[i].links[j].new_name)==0 ) - return i; - pdest = strstr( table->objs[i].links[j].new_name, name ); - result = (int)(pdest - table->objs[i].links[j].new_name); - /* found at position 1, meaning without '/' */ - if( pdest != NULL && result==1 ) - return i; - } - } - } - return -1; -} -- cgit v0.12