LibreOfficeKit and the UserInstallation

Stephan Bergmann sbergman at
Wed Mar 23 14:30:50 UTC 2016

A LO UserInstallation must not be accessed concurrently by multiple 
processes (at least not when at least one of them potentially modifies 
it).  LO itself ensures that with the first soffice instance listening 
on a well-known pipe (whose name depends on the UserInstallation path, 
among other things), and any subsequently started ones dispatching their 
command line arguments to that first one (the "OfficeIPCThread" code, 

I don't know how LOK wants to ensure that, though.

One obvious approach is giving different processes different (throwaway) 
UserInstallations.  There is code that sets the UserInstallation 
bootstrap variable in LOK's lo_initialize (desktop/source/lib/init.cxx) 
when the passed-in pUserProfilePath is non-null.  However, tracing back 
the callers of lo_initialize:

* smoketest/libtest.cxx calls lok_preinit with a null user_profile_path
* sal/android/libreofficekit-jni.c calls libreofficekit_hook (implicitly 
passing null)
* ios/experimental/TiledLibreOffice/TiledLibreOffice/AppDelegate.m and 
libreofficekit/source/gtk/lokdocview.cxx call lok_init (implicitly 
passing null)
* libreofficekit/qa/tilebench/tilebench.cxx, 
libreofficekit/qa/unit/tiledrendering.cxx, and smoketest/libtest.cxx 
call lok_cpp_init with a (defaulted) null pUserProfilePath

That is, not overriding the default UserInstallation seems to be 
encouraged rather than being prevented when using LOK.

The next line of defence happens to be that LOK apparently bootstraps 
enough of the LO code to make the OfficeIPCThread code come into play, 
"Use OfficeIPCThread::WaitForReady rather than sleeping" etc.

However, "happens to" because that OfficeIPCThread code is rather a mess 
that, in addition to the pipe stuff explained above, also is central to 
LO's lifecycle management.  And it is rather this second part that LOK 
is interested in.  Or, rather, that it needs to get its head wrapped 
around, as the LO code that LOK bootstraps somewhat unhelpfully insists 
on getting the OfficeIPCThread code involved---all that the LOK code 
apparently wants is to be notified once the LO code is bootstrapped, and 
OfficeIPCThread::WaitForReady happens to be a convenient way to get that 

I think LOK would be better off not starting off that OfficeIPCThread 
pipe listening stuff at all.  (It is most certainly not intended that 
soffice and non-soffice LOK processes happily pass their command line 
arguments to each other for processing.)  And 
"Add a comment" appears to agree with me on that.

I got dragged into this when trying to untangle the OfficeIPCThread 
mess.  Running LO under xdg-app will require to optionally use DBus 
instead of a named pipe in the OfficeIPCThread code, but adding that is 
unnecessarily difficult with the current state of the code.  So, while 
at it, I thought I could just as well see to get LOK's unwanted 
dependency on OfficeIPCThread removed.

Therefore, I would like somebody overseeing the architecture of LOK to 
explain how LOK intends to solve its "multiple processes per 
UserInstallation" problem.

More information about the LibreOffice mailing list