So the ooo3migration thing was a red herring alright, so here's my
second stab at fdo#37195

http://cgit.freedesktop.org/libreoffice/core/commit/?id=a78a6e013b8d97891aa2b9c9a5dce64a82dc2f06

a) If CreateProcessServiceFactory is called, then common.rdb of
"Users/YOU/AppData/Roaming/LibreOffice/3/user/extensions/bundled/registry/
com.sun.star.comp.deployment.component.PackageRegistryBackend/common.rdb" is 
opened mmapped on windows

b) On a new start of an LibreOffice which wants to synchronize new
config over an old config, then it will want do a copy of
"install/share/prereg/bundled/registry/
com.sun.star.comp.deployment.component.PackageRegistryBackend/common.rdb"
over
"Users/YOU/AppData/Roaming/LibreOffice/3/user/extensions/bundled/registry/
com.sun.star.comp.deployment.component.PackageRegistryBackend/common.rdb"
which will fail on windows with error 1224, i.e. ERROR_USER_MAPPED_FILE

c) That aborts the copy_bundled_recursive copy, leaving an old config
pointing to the old location of dictionaries.

d) So for windows at least, CreateProcessServiceFactory shouldn't happen
before copy_bundled_recursive.

This appears to be a (wildly unexpected and impossible to predict)
side-effect of c3ccdabb where it happened to be the case in the past
that CreateProcessServiceFactory didn't get called before
synchronization under windows.

Attached is the backport for 3-4 as this code changed a little between
3-4 and master.

caolanm->Andras: could you arrange to have the attached tested ?

C.
>From f9036d7c0b6b8ee00de618f33083ec11cc0e1c7f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caol...@redhat.com>
Date: Thu, 1 Sep 2011 13:43:35 +0100
Subject: [PATCH] Resolves: fdo#37195 CreateProcessServiceFactory can't happen
 before sync

If CreateProcessServiceFactory is called, then common.rdb of
"Users/YOU/AppData/Roaming/LibreOffice/3/user/extensions/bundled/registry/
com.sun.star.comp.deployment.component.PackageRegistryBackend/common.rdb" is
opened mmapped

On a new start of an LibreOffice which wants to synchronize new config over an
old config, then it will want do a copy of
"install/share/prereg/bundled/registry/
com.sun.star.comp.deployment.component.PackageRegistryBackend/common.rdb"
over
"Users/YOU/AppData/Roaming/LibreOffice/3/user/extensions/bundled/registry/
com.sun.star.comp.deployment.component.PackageRegistryBackend/common.rdb"
which will fail on windows with error 1224, i.e. ERROR_USER_MAPPED_FILE

That aborts the copy_bundled_recursive copy, leaving an old config
pointing to the old location of dictionaries.

So for windows at least, CreateProcessServiceFactory shouldn't happen before
copy_bundled_recursive.
---
 desktop/inc/app.hxx                |    4 ++--
 desktop/source/app/app.cxx         |   17 +++++++++++++++--
 desktop/source/app/sofficemain.cxx |    1 -
 3 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/desktop/inc/app.hxx b/desktop/inc/app.hxx
index 7f9a7ef..e13283d 100644
--- a/desktop/inc/app.hxx
+++ b/desktop/inc/app.hxx
@@ -139,11 +139,11 @@ class Desktop : public Application
         void                    SetSplashScreenText( const ::rtl::OUString& rText );
         void                    SetSplashScreenProgress( sal_Int32 );
 
-        void                    CreateProcessServiceFactory();
+        static void             ensureProcessServiceFactory();
 
     private:
         // Bootstrap methods
-        ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > CreateApplicationServiceManager();
+        static ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > CreateApplicationServiceManager();
 
         void					RegisterServices( ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xSMgr );
         void					DeregisterServices();
diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx
index 873588d..1a8fb2f 100644
--- a/desktop/source/app/app.cxx
+++ b/desktop/source/app/app.cxx
@@ -322,7 +322,10 @@ CommandLineArgs* Desktop::GetCommandLineArgs()
     {
         ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
         if ( !pArgs )
+        {
+            ensureProcessServiceFactory();
             pArgs = new CommandLineArgs;
+        }
     }
 
     return pArgs;
@@ -711,8 +714,15 @@ void Desktop::Init()
             copy_bundled_recursive( aPreregBundledPath, aUserPath, +1 );
         }
     }
-    
+
     // We need to have service factory before going further.
+    // We need to have service factory before going further, but see fdo#37195.
+    // Doing this will mmap common.rdb, making it not overwritable on windows,
+    // so this can't happen before the synchronization above. Lets rework this
+    // so that the above is called *from* ensureProcessServiceFactory or
+    // something to enforce this gotcha
+    ensureProcessServiceFactory();
+
     if( !::comphelper::getProcessServiceFactory().is())
     {
         OSL_FAIL("Service factory should have been crated in soffice_main().");
@@ -764,8 +774,11 @@ void Desktop::InitFinished()
 
 // GetCommandLineArgs() requires this code to work, otherwise it will abort, and
 // on Unix command line args needs to be checked before Desktop::Init()
-void Desktop::CreateProcessServiceFactory()
+void Desktop::ensureProcessServiceFactory()
 {
+    if( ::comphelper::getProcessServiceFactory().is())
+        return;
+
     Reference < XMultiServiceFactory > rSMgr = CreateApplicationServiceManager();
     if( rSMgr.is() )
     {
diff --git a/desktop/source/app/sofficemain.cxx b/desktop/source/app/sofficemain.cxx
index 1e640c5..214fcdf 100644
--- a/desktop/source/app/sofficemain.cxx
+++ b/desktop/source/app/sofficemain.cxx
@@ -49,7 +49,6 @@ extern "C" int soffice_main()
     desktop::Desktop aDesktop;
     // This string is used during initialization of the Gtk+ VCL module
     aDesktop.SetAppName( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("soffice")) );
-    aDesktop.CreateProcessServiceFactory();
 #ifdef UNX
     // handle --version and --help already here, otherwise they would be handled
     // after VCL initialization that might fail if $DISPLAY is not set
-- 
1.7.6

_______________________________________________
LibreOffice mailing list
LibreOffice@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice

Reply via email to