[Libreoffice] Solving an introduced runtime dependency on unreleased Qt version (KDE4 vcl backend)

Michael Meeks michael.meeks at suse.com
Tue Nov 22 09:54:27 PST 2011


Hi Lubos,

On Tue, 2011-11-22 at 18:26 +0100, Lubos Lunak wrote:
>  Since 3.4 at least, when run with KDE4 integration, LO kind of happens to 
> have a runtime dependency on a yet unreleased Qt version, otherwise LO will
> abort during some reasonably commonplace operations

	Urk.
	
> That doesn't quite fit with LO, which occassionally will do UI stuff even 
> from other threads.

	Right - but we guarentee that only one thread at a time will do that -
protected by the solar mutex. So there should never be two threads
concurrently inside the X libraries or the Qt toolkit.

	Are you suggesting that Qt stores the thread-id of the thread it is
initialized in, and then compares that all over the shop to check it is
the same one ? If so, that seems heinously broken - is there a way we
can turn that off more generally ?, if not - we shouldn't have a problem
- vcl should -never- enter Qt or X from more than one thread
concurrently.

> I also don't know how exactly thread safety is supposed to work in LO, so I 
> cannot quite guess. I've been told that VCL only works with Solar mutex 
> grabbed

	Right. Of course, sometimes there are bugs - and people may forget to
take the solar mutex ;-) but that is easier to fix - we need to add
that.

>  which means that Qt usage from it should be safe, if the way to 
> avoid the QPixmap check is avoided. But there are other UI elements in LO, 
> such as the fpicker, which AFAIK are not triggered using VCL and I don't know 
> how that is supposed to work.

	IIRC the fpicker for KDE is (was) an out-of-process helper
(program/kdefilepicker), so that should not be an issue.

>  What do you suggest to do about it?
> 
> PS: I've attached a backport of the Qt change to 
> https://bugs.freedesktop.org/show_bug.cgi?id=40298 .

	Reading the patch, we shouldn't need to XInitThreads, IIRC vcl does
this for us. The real breakage looks like:

-    if (qApp->thread() != QThread::currentThread()) {

	all instances of that in Qt look highly suspect to me :-)

	Working around them, particularly on older systems may be a problem.
Short of having a "Qt thread" - and proxying all API calls (somehow)
into that in order to dispatch them with a given threadid might be one
approach [ but it is a ton of work I suspect ]. 

	Wait - now I read the QObject header file - each QObject seems to have
this thread property.

	I suspect that what we really want to do is to do a:

	qApp->moveToThread(QThread::currentThread());

	before we start calling Qt methods each time. Hopefully that is
reasonably efficient (surely it's just a member variable).

	To do that I would do something similar to the GtkHookedYieldMutex
[ rather more complicated than what you want ], and pass a pointer to
your SalYieldMutex sub-class to the X11SalInstance constructor. You'd
want to switch the thread to the currentThread pots first successful
acquire I suspect.

	Might be simpler :-)

	HTH,

		Michael.

-- 
michael.meeks at suse.com  <><, Pseudo Engineer, itinerant idiot



More information about the LibreOffice mailing list