X11 protocol: error handling best practices for async requests
Adam Jackson
ajax at nwnk.net
Wed Oct 24 13:48:25 PDT 2012
On 10/24/12 2:09 PM, halfdog wrote:
> Could someone please point me to the documentation about best practice
> when dealing with asynchronous requests on client side. If I understand
> [1] correctly, some requests, when successful, will not produce any
> reply. Hence a client side library cannot wait on a reply or error from
> the server, there might never be any.
>
> What is the best practice for client-side implementation, when receiving
> an unexpected error for such a request? Abort immediately since
> connection might be out of sync? Pass it to the user side of the
> client-side API via some error handler? How should user-side handle it?
The default Xlib error handler simply aborts. In most cases there's no
recovering anyway, like if someone else destroys the Window you were
hoping to render to.
Most toolkits have a "critical section" pattern where, if doing
something sufficiently complicated that error handling is warranted,
they will push an error handler, do some stuff, force a reply with
XSync(), and pop. Since replies/events/errors are guaranteed to be
in-order, either the error handler gets called or everything succeeded.
This has a modest performance penalty since it forces a roundtrip.
It's also annoying to get right in the face of multiple threads and
multiple display connections, since Xlib's error handler is global
across both threads and Displays.
If instead you have a callback system based on the wire sequence number,
the client library could call back to the application when the protocol
has received an r/e/e for a request later than the one whose errors you
wanted to trap. I believe it's possible to build this in XCB, but
again, most apps can't meaningfully recover anyway.
- ajax
More information about the xorg-devel
mailing list