summaryrefslogtreecommitdiff
path: root/editeng
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@gmail.com>2012-04-11 23:29:01 -0400
committerKohei Yoshida <kohei.yoshida@gmail.com>2012-04-11 23:41:51 -0400
commitb5800fac1d57b80772823bd8bc288a6cebe82e6f (patch)
treeb228cc7a8517fdb2311d8a7527719da9b65b49dd /editeng
parent3b887c8d3fef676e0037a4f3381f6a491ec0da4f (diff)
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.
Diffstat (limited to 'editeng')
-rw-r--r--editeng/inc/editeng/eerdll.hxx1
-rw-r--r--editeng/qa/unit/core-test.cxx5
-rw-r--r--editeng/source/editeng/eerdll.cxx19
3 files changed, 18 insertions, 7 deletions
diff --git a/editeng/inc/editeng/eerdll.hxx b/editeng/inc/editeng/eerdll.hxx
index 00094cfbc436..226aefe00479 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 b8e31119f9eb..49a6efba3070 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 1e0f3e4241f4..ccec18e19628 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()