Hi there,

        After the mythically curious dbus socket code [ as Havoc says
~"re-writing it would be easier than understanding it" ] - I was full of
enthusiasm for the new gdbus.

        The new code, while more readable and promising, seems to have a few
drop-offs. The first I noticed was getting a raise (SIGABRT); when a
socket buffer is full, and sendmsg fails with EAGAIN (as seen in e-d-s).

        Sadly under strace the timings change and I no longer get the EAGAIN to
prove it (sad but true), but with this:

diff --git a/gio/gdbusprivate.c b/gio/gdbusprivate.c
index cd6eb91..c0b445d 100644
--- a/gio/gdbusprivate.c
+++ b/gio/gdbusprivate.c
@@ -997,6 +997,8 @@ write_message_in_idle_cb (gpointer user_data)
                           data,
                           &error))
         {
+         if (error && error->code == G_IO_ERROR_WOULD_BLOCK)
+               g_error ("crash and burn on EAGAIN\n");
           /* TODO: handle */
           _g_dbus_worker_emit_disconnected (worker, TRUE, error);
           g_error_free (error);

        I can get a nice console g_error of the same type before I get the
SIGTERM ;-) Since e-d-s shunts really quite a lot of data over the bus
this is rather a common case.

        In historic types in ORBit2 / linc - we had a custom GSource (which
IMHO is well worth stealing), for which we could strobe the poll
conditions easily [ though perhaps in glib that is easier anyway ].

        Thus - when we hit an EAGAIN on write, we would immediately switch our
poll to wait until there is space on the socket buffer (G_IO_OUT), and
get on with processing any other data / backlog and/or sleep.

        It -seems- as if the approach in gdbus (as of now) is to have an idle
handler running in the I/O thread [ the I/O thread model is a good one
IMHO ], that will rapidly turn into a busy loop - simply re-dispatching
the idle handler indefinitely [ assuming we don't fail on EAGAIN ;-]
until we can write the data.

        Is that the ultimately intention ? or is this just somewhat
under-finished ?

        I was also rather surprised to get this SIGTERM behaviour since all
calls to set_exit_on_close pass FALSE that I can see anywhere ;-)

        Thanks,

                Michael.

-- 
 michael.me...@novell.com  <><, Pseudo Engineer, itinerant idiot

_______________________________________________
gtk-devel-list mailing list
gtk-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-devel-list

Reply via email to