Re: [g-a-devel]exceptionally bad behavior ...
- From: Bill Haneman <bill haneman sun com>
- To: Michael Meeks <michael ximian com>
- Cc: accessibility mailing list <gnome-accessibility-devel gnome org>
- Subject: Re: [g-a-devel]exceptionally bad behavior ...
- Date: 13 Jun 2003 13:07:03 +0100
Michael!
Thanks a lot for the fix (which I am about to install/test), and the
very clear explanation (even I could understand it ;-)
I agree about the 'ev' reuse. I hope that's just a matter of slogging
through the code, perhaps we can touch base on this at GUADEC and I can
prepare a patch to fix it sometime during the post-GUADEC week. I will
report on whether the immediate fix solves the SEGVs we are seeing in
GOK.
regards,
Bill
On Fri, 2003-06-13 at 12:52, Michael Meeks wrote:
> Hi Bill,
>
> Ok - so it turns out the oddness on exception is a _really_ silly
> at-spi/cspi bug ;-) [ you'll be pleased to know (and the ORB is doing
> the right thing ) ], but it throws up a more important / concerning bug
> IMHO - I'll see if it's feasible to knock up a patch for that shortly.
>
> get_child_at_index does:
>
> retval = cspi_object_add (
> Accessibility_Accessible_getChildAtIndex (CSPI_OBJREF (obj),
> childIndex, cspi_ev ()));
>
> cspi_return_val_if_ev ("getChildAtIndex", NULL);
>
>
> Which is fine: cspi_object_add does:
>
> else if (!cspi_check_ev ("pre method check: add"))
> retval = NULL;
>
> which is also correct;
>
> SPIBoolean
> cspi_check_ev (const char *error_string)
> {
> CORBA_Environment *ev = cspi_ev ();
>
> if (ev->_major != CORBA_NO_EXCEPTION)
> {
>
> Which is _fine_ _BUT_ cspi_ev does:
>
> CORBA_Environment *
> cspi_ev (void)
> {
> CORBA_exception_init (&ev);
> return &ev;
> }
>
> ie. it wipes out the exception as soon as we check it. Thus AFAICS in
> cspi we have not been returning defined values from CORBA calls which
> fire exceptions for literally ages. [ it looks like this is my fault ].
>
> So - an immediate fix to get it in is this:
>
> Index: ChangeLog
> ===================================================================
> RCS file: /cvs/gnome/at-spi/ChangeLog,v
> retrieving revision 1.317
> diff -u -p -u -r1.317 ChangeLog
> --- ChangeLog 11 Jun 2003 14:08:11 -0000 1.317
> +++ ChangeLog 13 Jun 2003 11:58:26 -0000
> @@ -1,3 +1,9 @@
> +2003-06-13 Michael Meeks <michael ximian com>
> +
> + * cspi/bonobo/cspi-bonobo.c (cspi_check_ev): use it.
> +
> + * cspi/spi_main.c (cspi_peek_ev): impl.
> +
> 2003-06-11 Padraig O'Briain <padraig obriain sun com>
>
> * cspi/spi-roletypes.h: Add role SPI_ROLE_AUTOCOMPLETE
> Index: cspi/spi-private.h
> ===================================================================
> RCS file: /cvs/gnome/at-spi/cspi/spi-private.h,v
> retrieving revision 1.14
> diff -u -p -u -r1.14 spi-private.h
> --- cspi/spi-private.h 11 Jun 2003 12:07:38 -0000 1.14
> +++ cspi/spi-private.h 13 Jun 2003 11:58:26 -0000
> @@ -68,6 +68,7 @@ struct _SPIException {
> #define CSPI_OBJREF(a) (((Accessible *)(a))->objref)
>
> CORBA_Environment *cspi_ev (void);
> +CORBA_Environment *cspi_peek_ev (void);
> SPIBoolean cspi_exception (void);
> Accessibility_Registry cspi_registry (void);
> Accessible *cspi_object_add (CORBA_Object
> corba_object);
> Index: cspi/spi_main.c
> ===================================================================
> RCS file: /cvs/gnome/at-spi/cspi/spi_main.c,v
> retrieving revision 1.35
> diff -u -p -u -r1.35 spi_main.c
> --- cspi/spi_main.c 11 Jun 2003 12:07:39 -0000 1.35
> +++ cspi/spi_main.c 13 Jun 2003 11:58:27 -0000
> @@ -157,6 +157,12 @@ cspi_get_live_refs (void)
> }
>
> CORBA_Environment *
> +cspi_peek_ev (void)
> +{
> + return &ev;
> +}
> +
> +CORBA_Environment *
> cspi_ev (void)
> {
> CORBA_exception_init (&ev);
> Index: cspi/bonobo/cspi-bonobo.c
> ===================================================================
> RCS file: /cvs/gnome/at-spi/cspi/bonobo/cspi-bonobo.c,v
> retrieving revision 1.9
> diff -u -p -u -r1.9 cspi-bonobo.c
> --- cspi/bonobo/cspi-bonobo.c 9 Jun 2003 22:32:50 -0000 1.9
> +++ cspi/bonobo/cspi-bonobo.c 13 Jun 2003 11:58:27 -0000
> @@ -41,7 +41,7 @@ cspi_release_unref (CORBA_Object object)
> SPIBoolean
> cspi_check_ev (const char *error_string)
> {
> - CORBA_Environment *ev = cspi_ev ();
> + CORBA_Environment *ev = cspi_peek_ev ();
>
> if (ev->_major != CORBA_NO_EXCEPTION)
> {
>
>
> This exposes a rather broader issue, which is that the continual re-use
> of that CORBA_Environment is quite badly broken;
>
> Consider:
>
> a) outgoing method with cspi_ev();
> b) incoming event
> c) outgoing method with cspi_ev returns
> an exception - sets cspi_ev.
> even returns
> method (apparently) fails with exception - although it completed
> cleanly - resulting in a leak / bad result.
>
> So - we really need to retro-fit the code en-masse to instantiate /
> initialize CORBA_Environments where we need them, rather than trying to
> re-use the system one.
>
> Anyhow - I hope the fix will solve the immediate problem.
>
> Regards,
>
> Michael.
>
> --
> michael ximian com <><, Pseudo Engineer, itinerant idiot
>
> _______________________________________________
> Gnome-accessibility-devel mailing list
> Gnome-accessibility-devel gnome org
> http://mail.gnome.org/mailman/listinfo/gnome-accessibility-devel
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]