H5Eget_msg() uses the FUNC_ENTER_API(FAIL) macro on entrance which clears
the error stack.

Interestingly the deprecated functions H5Eget_major() and H5Eget_minor()
uses FUNC_ENTER_API_NOCLEAR(NULL) instead which preserves the error stack.

In the manual Section 9.4.7, "Traverse an Error Stack with a Callback
Function" the example code uses H5Eget_msg() as though the stack is not
cleared which of course fails under the current implementation. Might it be
that at one point the intention was to have H5Eget_msg() not clear the
error stack so that using it in the callback for H5Ewalk() is possible? I
don't see any reasonable way to implement a walk callback without using the
deprecated functions instead.

David

On Fri, Oct 30, 2015 at 7:04 AM, Allen Byrne <[email protected]> wrote:

> David and Martijn,
>
> We use these calls in our Java wrapper library (and execute tests) that
> implement what you need. See the exceptionImp.c file in our hdf-java repo.
> Also available at;
>     http://www.hdfgroup.org/products/java/release/download.html
>
> Martijn is correct about the error stack being reset, which is why you
> need to
> save the stack and restore it on calls that will reset the stack.
>
> Allen
>
>
> On Friday, October 30, 2015 02:35:04 PM Martijn Jasperse wrote:
> > Hi David,
> > I also encountered this issue. My understanding is that *any *call to an
> H5
> > function resets the error stack because in principle that call could
> > produce its own error [see, e.g. H5E.c:871]. Since H5get_msg succeeds, it
> > wipes the error stack, so error_desc becomes invalid.
> >
> > The solution I used was to store the error code and translate to messages
> > after traversing the stack. If there are better solutions I'd love to
> hear
> > them!
> >
> > Cheers,
> > Martijn
> >
> > On 30 October 2015 at 01:26, David <[email protected]> wrote:
> > > Hi,
> > >
> > > I cannot figure out how to get H5Ewalk() to work. I get a good
> > > looking H5E_error2_t struct on the first entrance to my callback
> function
> > > but after I call H5Eget_msg() the strings are gone. The subsequent
> calls
> > > to
> > > the callback all have bad strings too. I'm guessing they are getting
> > > freed from the heap and overwritten with debug mode "deleted" values
> but
> > > is
> > > that what's supposed to happen?
> > >
> > > I'm using hdf5-1.8.15-patch1 and MSVS10.
> > >
> > > Thanks,
> > > David
> > >
> > > #include <hdf5/hdf5.h>
> > > #include <stdio.h>
> > >
> > > herr_t callback(unsigned n, const H5E_error2_t *err_desc, void*
> > > client_data)
> > > {
> > >
> > >   printf(err_desc->func_name); // prints the function name
> > >
> > >     H5Eget_msg(err_desc->maj_num, NULL, NULL, 0);
> > >
> > >   printf(err_desc->func_name); // prints garbage
> > >   return 0;
> > >
> > > }
> > >
> > > int main(int argc, char* argv[])
> > > {
> > >
> > >   H5Fopen("missingfile", H5F_ACC_RDWR, H5P_DEFAULT);
> > >   H5Ewalk(H5E_DEFAULT, H5E_WALK_UPWARD, callback, NULL);
> > >   return 0;
> > >
> > > }
> > >
> > >
> > > _______________________________________________
> > > Hdf-forum is for HDF software users discussion.
> > > [email protected]
> > >
> http://lists.hdfgroup.org/mailman/listinfo/hdf-forum_lists.hdfgroup.org
> > > Twitter: https://twitter.com/hdf5
>
>
> _______________________________________________
> Hdf-forum is for HDF software users discussion.
> [email protected]
> http://lists.hdfgroup.org/mailman/listinfo/hdf-forum_lists.hdfgroup.org
> Twitter: https://twitter.com/hdf5
>
_______________________________________________
Hdf-forum is for HDF software users discussion.
[email protected]
http://lists.hdfgroup.org/mailman/listinfo/hdf-forum_lists.hdfgroup.org
Twitter: https://twitter.com/hdf5

Reply via email to