[Libreoffice-commits] .: editeng/inc editeng/qa editeng/source

Kohei Yoshida kohei at kemper.freedesktop.org
Wed Apr 11 20:41:30 PDT 2012


 editeng/inc/editeng/eerdll.hxx    |    1 +
 editeng/qa/unit/core-test.cxx     |    5 +++--
 editeng/source/editeng/eerdll.cxx |   19 ++++++++++++++-----
 3 files changed, 18 insertions(+), 7 deletions(-)

New commits:
commit b5800fac1d57b80772823bd8bc288a6cebe82e6f
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Wed Apr 11 23:29:01 2012 -0400

    We need to delete EditDLL before de-initialize vcl to avoid crash.
    
    Without manually releasing the EditDLL singleton instance, it gets
    deleted *after* the cppunit does its cleanup, which de-initializes VCL.
    The problem is, when the EditDLL instance is destroyed, its member
    GlobalEditData instance deletes the OutputDevice instance that it owns,
    which in turn accesses font caches in VCL.  But by the time we reach
    that point, VCL is already de-initialized, hence the problem.

diff --git a/editeng/inc/editeng/eerdll.hxx b/editeng/inc/editeng/eerdll.hxx
index 00094cf..226aefe 100644
--- a/editeng/inc/editeng/eerdll.hxx
+++ b/editeng/inc/editeng/eerdll.hxx
@@ -53,6 +53,7 @@ public:
     ResMgr*         GetResMgr() const       { return pResMgr; }
     GlobalEditData* GetGlobalData() const   { return pGlobalData; }
     static EditDLL& Get();
+    static void Release();
 };
 
 #define EE_DLL() EditDLL::Get()
diff --git a/editeng/qa/unit/core-test.cxx b/editeng/qa/unit/core-test.cxx
index b8e3111..49a6efb 100644
--- a/editeng/qa/unit/core-test.cxx
+++ b/editeng/qa/unit/core-test.cxx
@@ -74,6 +74,7 @@ void Test::setUp()
 void Test::tearDown()
 {
     SfxItemPool::Free(mpItemPool);
+    EditDLL::Release();
 
     test::BootstrapFixture::tearDown();
 }
@@ -83,8 +84,8 @@ void Test::testConstruction()
     EditEngine aEngine(mpItemPool);
 
     // TODO: This currently causes segfault in vcl.
-//  rtl::OUString aParaText = "I am Edit Engine.";
-//  aEngine.SetText(aParaText);
+    rtl::OUString aParaText = "I am Edit Engine.";
+    aEngine.SetText(aParaText);
 }
 
 CPPUNIT_TEST_SUITE_REGISTRATION(Test);
diff --git a/editeng/source/editeng/eerdll.cxx b/editeng/source/editeng/eerdll.cxx
index 1e0f3e4..ccec18e 100644
--- a/editeng/source/editeng/eerdll.cxx
+++ b/editeng/source/editeng/eerdll.cxx
@@ -72,18 +72,27 @@
 #include <editeng/xmlcnitm.hxx>
 #include <editeng/forbiddencharacterstable.hxx>
 #include <editeng/justifyitem.hxx>
-#include <rtl/instance.hxx>
+
+#include <boost/scoped_ptr.hpp>
 
 using namespace ::com::sun::star;
 
-namespace
-{
-    class theEditDLL : public rtl::Static<EditDLL, theEditDLL> {};
+namespace {
+
+boost::scoped_ptr<EditDLL> pDLL;
+
 }
 
 EditDLL& EditDLL::Get()
 {
-    return theEditDLL::get();
+    if (!pDLL)
+        pDLL.reset(new EditDLL);
+    return *pDLL;
+}
+
+void EditDLL::Release()
+{
+    pDLL.reset();
 }
 
 GlobalEditData::GlobalEditData()


More information about the Libreoffice-commits mailing list