[PATCH xlib] Add support for a display-specific error handler

Uli Schlachter psychon at znc.in
Mon Nov 16 12:39:03 PST 2015


Am 16.11.2015 um 18:06 schrieb Jasper St. Pierre:
[...]
> We currently use a behavior like:
> 
>     SetErrorHandler();
>     Request1();
>     Request2();
>     Request3();
>     if (UnsetErrorHandlerAndCheck())
>         goto error;
> 
> UnsetErrorHandlerAndCheck will XSync, and look at any newly incoming
> errors, check their serials so that they match up, and if they are
> inside those bounds, we return the error to the user and return that
> no error happened. Fairly standard trick.
> 
> With xcb, I can do:
> 
>     if (check_request(request_1_checked(), &err) {
>         free(err);
>         goto error;
>     }
>     if (check_request(request_2_checked(), &err) {
>         free(err);
>         goto error;
>     }
>     if (check_request(request_3_checked(), &err) {
>         free(err);
>         goto error;
>     }
>
> So that's clearly unusable.

Well, why?

How about this version:

xcb_void_cookie_t cookies[3];

cookies[0] = request_1_checked();
cookies[1] = request_2_checked();
cookies[2] = request_3_checked();

bool had_error = false;
for (int i = 0; i < 3; i++) {
  xcb_generic_error_t *err = xcb_request_check(c, cookies[i]);
  had_error |= err != NULL;
  free(NULL);
}

This only syncs once during the first call to xcb_request_check() and afterwards
it's done. This even improves parallelism, because you do not have to
XLockDisplay() to lock out other threads (which also means that "just a range of
sequence numbers" isn't enough and an array is needed).

You could even generalize this with some helper functions to make it nicer,
similar to your SetErrorHandler() and UnsetErrorHandlerAndCheck() above.

Uli

[...]
> The Display-specific error handler solves my needs here by giving me a
> callback to that above model that's locked to that local section that
> works well from a library -- this code runs in a different thread, and
> we had issues where we overwrite another thread's error handler (in my
> case, the two threads were using different Displays, as they should).
>
> On Sun, Nov 15, 2015 at 11:56 PM, Keith Packard <keithp at keithp.com> wrote:
>> "Jasper St. Pierre" <jstpierre at mecheye.net> writes:
>>
>>> Writing error-safe code that uses Xlib is too obnoxious, and using XCB
>>> is tedious and not performant, as we can't catch events on a giant
>>> stream -- we have to check every operation manually.
>>
>> You get errors returned in the event stream; is there something fancier
>> you'd like from xcb to make it faster?
>>
>> --
>> -keith

-- 
"Every once in a while, declare peace. It confuses the hell out of your enemies"
 - 79th Rule of Acquisition


More information about the xorg-devel mailing list