gtk3-demo dies with EAGAIN when running under Weston
Pekka Paalanen
ppaalanen at gmail.com
Fri Mar 20 02:53:24 PDT 2015
On Fri, 20 Mar 2015 17:03:14 +0800
Jonas Ådahl <jadahl at gmail.com> wrote:
> On Fri, Mar 20, 2015 at 10:53:42AM +0200, Pekka Paalanen wrote:
> > On Thu, 19 Mar 2015 23:45:00 -0400
> > Lyude <thatslyude at gmail.com> wrote:
> >
> > > On Fri, 2015-03-20 at 11:37 +0800, Jonas Ådahl wrote:
> > > >
> > > > Try to apply this patch http://patchwork.freedesktop.org/patch/44994/ .
> > > >
> > > >
> > > > Jonas
> > >
> > > I just tried the patch and it fixed the issue. Thanks a ton for the
> > > quick reply to my e-mail and the patch :). Now I can finally get back to
> > > work.
> >
> > Now that seems odd.
> >
> > AFAIU, basically you get EAGAIN when the kernel doesn't have the space
> > to buffer your sent data. This means that either the receiver (the
> > compositor) is not reading the socket, or the client is flooding the
> > socket.
> >
> > I would suggest there may be two bugs in GTK+ here:
> >
> > 1. Flooding the socket to begin with. I really don't understand why
> > "input: Make setting the same pointer cursor state again a no-op"
> > would be fixing this issue. Does GTK+ send tons of requests for
> > every pointer enter/leave or something?
>
> When weston got a wl_pointer.set_cursor with the same cursor and the
> same hot spot, it unmapped the surface, sent wl_surfac.leave on the
> cursor surface, then mapped it again in the exact same position, sending
> a wl_surface.enter to that same surface. When GTK+ receives an
> enter/leave on a cursor surface it calculates the buffer scale it should
> use and and lazilly just sets the same cursor again because it doesn't
> keep track of that itself. In other words, we'd get a feedback loop that
> eventually fills the buffer. One could argue that GTK+ shouldn't be as
> lazy, but I don't think setting a cursor suface with an identical state
> should make the cursor leave the output and then enter immediately
> either.
I am not questioning your patch at all, it sounds totally the right
thing to do.
But doesn't that feedback loop require a roundtrip on every cycle? How
can that fill the send buffer?
Is it like some cascade where one no-op change causes one leave/enter,
which then causes two no-op changes, which causes two leave/enter and
so on exploding exponentially?
Btw. how can you ever get enter or leave on a *cursor* surface?
Is that another Weston bug?
> >
> > 2. Not dealing with EAGAIN. See the documentation for
> > wl_display_flush[1]. When hitting EAGAIN there, the event loop
> > should poll for writable and wait before issuing more Wayland
> > requests. Does GTK+ do this already?
>
> AFAICS GTK+ doesn't check for EAGIN, but in this particular sitation
> we'd just get an eternal busy loop instead of an abort.
Still, an item to add in GTK+'s todo.
Thanks,
pq
> > Now, 2. is if the error comes back from wl_display_flush(). The other
> > case is when calling a request function attempts to buffer the message
> > but wl_closure_send() fails because wl_connection_flush() fails. These
> > are libwayland-client internal functions. When wl_connection_flush()
> > fails, instead of failing everything, I think we should just allocate
> > more space until implicit flush succeeds or we can return EAGAIN from
> > wl_display_flush().
> >
> > Can you check if the failure comes from wl_display_flush() or the
> > internal failure of the implicit flush? A backtrace would tell.
> >
> > In any case, I think it might good to look into removing the abort()
> > from wl_proxy_marshal_array_constructor(), unless someone makes a case
> > the app being very broken if it sends that much data without spinning
> > the event loop.
> >
> > However, growing the send buffer unlimited is not a good idea, because
> > the bigger it gets, it means the more behind the app (the compositor
> > actually) is, and at some point that starts to indicate an app bug.
> >
> >
> > Thanks,
> > pq
> >
> > [1]
> > http://wayland.freedesktop.org/docs/html/apb.html#Client-classwl__display_1a8463b6e5f4cf9a2a3ad2d543aedcf429
More information about the wayland-devel
mailing list