SwXAutoTextEntry needs a disposal protocol
SwXAutoTextEntry::GetBodyText calls SwGlossaries::EditGroupDoc to create a Sw[Web]GlosDocShell (which it then stores in xDocSh), and there must be a call to that shell's DoClose to clean up its resources. However, if a reference to the SwXAutoTextEntry is still held during XDesktop::terminate (as can happen in JunitTest_sw_unoapi_1, where such a reference is held from Java, thus arbitrarily delaying destruction of the SwXAutoTextEntry until the JVM does GC), SwXAutoTextEntry::Notify's PrepareCloseDoc case will release xDocSh without calling DoClose, so an eventual ~SwXAutoTextEntry will not call DoClose either. (And calling DoClose from withing SwXAutoTextEntry::Notify would cause a crash, as it would destroy the SwGlosDocShell recursively from within its SfxBroadcaster::Broadcast call.) So introduce a disposal protocol for XAutoTextEntry and call it at least in the place that caused the resource leak in JunitTest_sw_unoapi_1. For lack of a better inerface, reuse css.lang.XComponent for that protocol, even though this scenario doesn't involve breaking cyclic references among UNO objects caused by listener patterns. Change-Id: Id6501b84e562950e40b83e0b1afd1b3184807856
This commit is contained in:
@@ -87,11 +87,17 @@ public class SwXAutoTextEntry extends TestCase {
|
||||
try {
|
||||
if ( oGroup.hasByName("NewEntryName") ) {
|
||||
log.println("Removing 'NewEntryName' element");
|
||||
((com.sun.star.lang.XComponent) AnyConverter.toObject(
|
||||
new Type(com.sun.star.lang.XComponent.class),
|
||||
oGroup.getByName("NewEntryName"))).dispose();
|
||||
oGroup.removeByName("NewEntryName");
|
||||
}
|
||||
} catch ( com.sun.star.container.NoSuchElementException e ) {
|
||||
log.println("Cannot remove TextEntry from group...");
|
||||
e.printStackTrace(log);
|
||||
} catch ( com.sun.star.lang.WrappedTargetException e ) {
|
||||
log.println("Cannot remove TextEntry from group...");
|
||||
e.printStackTrace(log);
|
||||
}
|
||||
log.println( "disposing xTextDoc " );
|
||||
util.DesktopTools.closeDoc(xTextDoc);
|
||||
|
||||
@@ -31,6 +31,8 @@
|
||||
#include <com/sun/star/text/XText.hpp>
|
||||
#include <svl/itemprop.hxx>
|
||||
#include <svl/lstner.hxx>
|
||||
#include <cppuhelper/basemutex.hxx>
|
||||
#include <cppuhelper/compbase.hxx>
|
||||
#include <cppuhelper/implbase.hxx>
|
||||
#include <svtools/unoevent.hxx>
|
||||
class SwTextBlocks;
|
||||
@@ -155,7 +157,8 @@ public:
|
||||
|
||||
class SwXAutoTextEntry
|
||||
:public SfxListener
|
||||
,public cppu::WeakImplHelper
|
||||
,public cppu::BaseMutex
|
||||
,public cppu::WeakComponentImplHelper
|
||||
<
|
||||
css::text::XAutoTextEntry,
|
||||
css::lang::XServiceInfo,
|
||||
@@ -178,6 +181,8 @@ class SwXAutoTextEntry
|
||||
}
|
||||
void GetBodyText ();
|
||||
|
||||
void SAL_CALL disposing() override;
|
||||
|
||||
protected:
|
||||
/** ensure that the current content (which may only be in-memory so far) is flushed to the auto text group file
|
||||
|
||||
|
||||
@@ -718,6 +718,7 @@ sal_Int64 SAL_CALL SwXAutoTextEntry::getSomething( const uno::Sequence< sal_Int8
|
||||
|
||||
SwXAutoTextEntry::SwXAutoTextEntry(SwGlossaries* pGlss, const OUString& rGroupName,
|
||||
const OUString& rEntryName) :
|
||||
WeakComponentImplHelper(m_aMutex),
|
||||
pGlossaries(pGlss),
|
||||
sGroupName(rGroupName),
|
||||
sEntryName(rEntryName),
|
||||
@@ -801,6 +802,12 @@ void SwXAutoTextEntry::GetBodyText ()
|
||||
xBodyText.set( *pBodyText, uno::UNO_QUERY);
|
||||
}
|
||||
|
||||
void SwXAutoTextEntry::disposing()
|
||||
{
|
||||
SolarMutexGuard g;
|
||||
implFlushDocument(true);
|
||||
}
|
||||
|
||||
uno::Reference< text::XTextCursor > SwXAutoTextEntry::createTextCursor() throw( uno::RuntimeException, std::exception )
|
||||
{
|
||||
SolarMutexGuard aGuard;
|
||||
|
||||
Reference in New Issue
Block a user