description: ============ exceptions throwing/catching is the high level error recovery mechanism of perl. however, dieing in a gtk callback now results in unexpected behaviour (that is from a perl programmer viewpoint, of course gtk+ as being developed in c is not supposed to support them):
===========================================================================================> GLib-GObject-ERROR **: file gsignal.c: line 646 (emission_pop): should not be reached > aborting... > zsh: abort logdrake > ===========================================================================================>
as for example, see gtk2-perl/misc-examples/exception-trapping.pl from
old inline tree.
short answer to this bug may be "do not do that" but:
- when you've some quite a big code base, it's sometimes easier to do
  error managment like this and anyway,
- this is one of perl way of doing it, and it really save some code
  and/or make code saner.
explanation:
============
the problem (as explained by guillaume) is that:
- gtk+, as being x11 client side, performs an active loop on x events,
  react to them, interpret them in terms of gtk events that need
  calling gtk callbacks
- there's some kind of gtk_main() call stack
- if we got a perl exception, we interrupt normal gtk execution and
  bypass normal gtk return from callback
- once we catch the exception from perl and try to perform more, we'll
  put glib/gtk+ in trouble as soon as we try to resume normal gtk+
  operation
old gtk-perl and gtk2-perl recovery systems:
============================================
guillaume implemented some recovery system in
gtk2-perl/Gtk2/src/Gtk2.c and in gtk2-perl/Gtk2/src/GClosure.c, that
is:
- each call to gtk_main result in incrementing a main call counter
- we run perl-gtk callback with G_EVAL
- if we catch an exception:
  o if we already cautgh another exception, print a "sorry folks"
    message
  o else we save the exception that need to be croaked again and we
    run gtk_main_quit
  o once c gtk_main had exited, perl gtk_main croak the pending
    exception
but this mechanism was not keeped when switching to inline to xs (due
to saner/better design of new tree).
old perl-GTK (that is gtk+-1.0/1.2 perl binding) also has such a
mechanism (die in callback did worked).
porting old recovery system:
============================
Compare GClosure.c from inline tree to Glib/GClosure.xs from new tree:
naive merging of  guillaume recovery system may look like this
regarding glib:
Attachment:
marshall.diff
Description: Text Data
however, note that:
- xs tree sanely separate glib from gtk, thus:
  o we cannot call gtk_main_quit from there
  o we cannot easily share variables between Glib.so and Gtk2.so (so
    that perl's gtk_main know there's an exception to croak)
- i've reach my limited knowledge of xs, so we need someone more
  intelligent than me to restore old perl-GTK-0.7xx and inline
  perl-GTK2 binding behaviour regarding perl exceptions throwed from
  gtk callbacks :-(