diff options
Diffstat (limited to 'tools/lib/h5diff.c')
-rw-r--r-- | tools/lib/h5diff.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/tools/lib/h5diff.c b/tools/lib/h5diff.c index a4d8469..4f82906 100644 --- a/tools/lib/h5diff.c +++ b/tools/lib/h5diff.c @@ -932,6 +932,19 @@ hsize_t h5diff(const char *fname1, /* if both obj1 and obj2 are group */ if (obj1type == H5TRAV_TYPE_GROUP && obj2type == H5TRAV_TYPE_GROUP) { + + /* + * Use h5tools_is_obj_same() to improve performance by skipping + * comparing details of same objects. If verbose options is used, + * need to traverse thorugh the list of objects in the group and + * print out object information. Details of same objects will be + * skipped at diff() function. + */ + if(!(options->m_verbose || options->m_report)) { + if (h5tools_is_obj_same(file1_id,obj1fullname,file2_id,obj2fullname)!=0) + goto out; + } + /* * traverse group1 */ @@ -1773,6 +1786,7 @@ hsize_t diff(hid_t file1_id, int ret; int is_dangle_link1 = 0; int is_dangle_link2 = 0; + int is_hard_link = 0; hsize_t nfound = 0; @@ -1834,6 +1848,58 @@ hsize_t diff(hid_t file1_id, /* found dangling link */ if (is_dangle_link1 || is_dangle_link2) goto out2; + + /* + * Use h5tools_is_obj_same() to improve performance by skipping + * comparing details of same objects, + * + * check if two paths point to the same object for hard links or + * the option of follow link is used. h5tools_is_obj_same() is not + * needed for other cases. + */ + is_hard_link = (type==H5TRAV_TYPE_DATASET || + type==H5TRAV_TYPE_NAMED_DATATYPE || + type==H5TRAV_TYPE_GROUP); + if (options->follow_links || is_hard_link) + { + if (h5tools_is_obj_same(file1_id, path1, file2_id, path2)!=0) + { + /* print information is only verbose option is used */ + if(options->m_verbose || options->m_report) + { + switch(type) + { + case H5TRAV_TYPE_DATASET: + do_print_objname("dataset", path1, path2, options); + break; + case H5TRAV_TYPE_NAMED_DATATYPE: + do_print_objname("datatype", path1, path2, options); + break; + case H5TRAV_TYPE_GROUP: + do_print_objname("group", path1, path2, options); + break; + case H5TRAV_TYPE_LINK: + do_print_objname("link", path1, path2, options); + break; + case H5TRAV_TYPE_UDLINK: + if(linkinfo1.linfo.type == H5L_TYPE_EXTERNAL && linkinfo2.linfo.type == H5L_TYPE_EXTERNAL) + do_print_objname("external link", path1, path2, options); + else + do_print_objname ("user defined link", path1, path2, options); + break; + default: + parallel_print("Comparison not supported: <%s> and <%s> are of type %s\n", + path1, path2, get_type(type) ); + options->not_cmp = 1; + break; + } /* switch(type)*/ + + print_found(nfound); + } /* if(options->m_verbose || options->m_report) */ + + goto out2; + } /* h5tools_is_obj_same */ + } switch(type) { |