[PATCH libX11] config: Add an option to initialize threads by default.
Rami Ylimäki
rami.ylimaki at vincit.fi
Tue Feb 1 04:29:06 PST 2011
On 01/31/2011 09:11 PM, Alan Coopersmith wrote:
> On 01/31/11 02:46 AM, Rami Ylimäki wrote:
>> It's sometimes impossible to know in advance whether an X client is
>> using Xlib from multiple threads or not. For example, there could be
>> some generic X client that acts as a plugin container. Plugins could
>> be loaded to the container at runtime, but the container doesn't know
>> whether the plugins are using Xlib from a separate thread or not.
> I don't know if it's a better answer, but an alternate solution we've
> been carrying around in Solaris libX11 since long before I got here is
> to allow XInitThreads() to be called by other plugins/libraries even after
> the X connection is up and running. I've not checked how well it works
> in the current world where half of XlibInt.c was ripped out and replaced
> by xcb calls, but the code is available if someone wants to look at it.
>
> Original version:
> http://people.freedesktop.org/~alanc/thread-fixes/
>
> Current version:
> http://src.opensolaris.org/source/xref/x-cons/xnv-clone/open-src/lib/libX11/1234757.patch
> http://src.opensolaris.org/source/xref/x-cons/xnv-clone/open-src/lib/libX11/4010755.patch
>
Thanks for the links.
The problem that your patches fix is very similar to what I have
encountered and which the current semantics of XInitThreads are
completely insufficient to solve. Libraries might find it convenient to
use threads and/or Xlib to implement some functionality. However, an
application linking to those libraries has no way of knowing that
XInitThreads should be called, because the application doesn't
necessarily even know that some of its libraries are using Xlib.
Therefore it's tempting to change the semantics as you have done.
However, this is still insufficient to solve the problem in general
case. It should be possible to guard against multiple simultaneous
XInitThreads calls and also against XInitThreads calls happening during
error handler and request/event processing. To make it work, you'd still
need to have some locks initialized before the first call to
XInitThreads is done, which pretty much reduces to enabling locking by
default.
I discussed this with Erkki and we came up with the following solution:
- add configuration option to initialize locking functions by default
- the initial locking functions call try_lock() instead of lock() and
assert on failure
- the locking functions are initialized as before in first call to
XInitThreads
So in practice we would be detecting incorrect usage of Xlib from
multiple threads reliably until XInitThreads is called. This solution
would at least give the application developer immediate feedback that
Xlib is used incorrectly so that he wouldn't have to file a bug about a
random crash in Xlib. What do you think?
-- Rami
More information about the xorg-devel
mailing list