[Libreoffice-commits] core.git: sw/source
Stephan Bergmann (via logerrit)
logerrit at kemper.freedesktop.org
Thu Jan 30 08:33:40 UTC 2020
sw/source/core/doc/acmplwrd.cxx | 100 ++++++++++++++++++++--------------------
1 file changed, 51 insertions(+), 49 deletions(-)
New commits:
commit bdd1229c3e1f1d8281e56151b3907c9a6eb07e04
Author: Stephan Bergmann <sbergman at redhat.com>
AuthorDate: Wed Jan 29 15:56:00 2020 +0100
Commit: Stephan Bergmann <sbergman at redhat.com>
CommitDate: Thu Jan 30 09:33:05 2020 +0100
Revert "SwAutoCompleteClient: SwClient no more"
This reverts commit fa26db1c053a8510ada15fcbaa7e36ae0f6920a5 for now, as it
breaks UBSan builds during e.g. JunitTest_sw_unoapi_1
(<https://ci.libreoffice.org/job/lo_ubsan/1518/>):
> /sw/source/core/doc/acmplwrd.cxx:138:9: runtime error: member access within address 0x607001517be0 which does not point to an object of type 'SwAutoCompleteClient'
> 0x607001517be0: note: object is of type 'SvtListener'
> af 07 80 42 d0 8e 97 f4 84 2b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00
> ^~~~~~~~~~~~~~~~~~~~~~~
> vptr for 'SvtListener'
> #0 0x2b85787e94b6 in SwAutoCompleteClient::Notify(SfxHint const&) /sw/source/core/doc/acmplwrd.cxx:138:9
> #1 0x2b84f3d5d886 in SvtBroadcaster::Broadcast(SfxHint const&) /svl/source/notify/broadcast.cxx:128:25
> #2 0x2b84f3d5c07a in SvtBroadcaster::~SvtBroadcaster() /svl/source/notify/broadcast.cxx:96:5
> #3 0x2b857812fdc4 in sw::BroadcasterMixin::~BroadcasterMixin() /sw/inc/calbck.hxx:84:24
> #4 0x2b857af251c4 in SwPageDesc::~SwPageDesc() /sw/source/core/layout/pagedesc.cxx:127:1
> #5 0x2b857af25234 in SwPageDesc::~SwPageDesc() /sw/source/core/layout/pagedesc.cxx:126:1
> #6 0x2b8578f2c550 in SwDoc::~SwDoc() /sw/source/core/doc/docnew.cxx:466:9
> #7 0x2b857892a9c3 in SwDoc::release() /sw/source/core/doc/doc.cxx:117:9
> #8 0x2b8579d1efae in rtl::Reference<SwDoc>::clear() /include/rtl/ref.hxx:159:19
> #9 0x2b857e12fd44 in SwDocShell::RemoveLink() /sw/source/uibase/app/docshini.cxx:438:16
> #10 0x2b857e12eac7 in SwDocShell::~SwDocShell() /sw/source/uibase/app/docshini.cxx:366:5
> #11 0x2b857e12ff2b in SwDocShell::~SwDocShell() /sw/source/uibase/app/docshini.cxx:356:1
> #12 0x2b857e130104 in SwDocShell::~SwDocShell() /sw/source/uibase/app/docshini.cxx:356:1
> #13 0x2b84edcb1a4a in SvRefBase::ReleaseRef() /include/tools/ref.hxx:163:29
> #14 0x2b84edcb1020 in tools::SvRef<SfxObjectShell>::~SvRef() /include/tools/ref.hxx:56:36
Change-Id: Iaf1cb698bf898efc66a3abaa1c8bfd3116b389b7
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87715
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman at redhat.com>
diff --git a/sw/source/core/doc/acmplwrd.cxx b/sw/source/core/doc/acmplwrd.cxx
index fc911a1993cc..619faef05aa4 100644
--- a/sw/source/core/doc/acmplwrd.cxx
+++ b/sw/source/core/doc/acmplwrd.cxx
@@ -24,7 +24,7 @@
#include <doc.hxx>
#include <pagedesc.hxx>
#include <poolfmt.hxx>
-#include <svl/listener.hxx>
+#include <calbck.hxx>
#include <IDocumentStylePoolAccess.hxx>
#include <editeng/svxacorr.hxx>
#include <osl/diagnose.h>
@@ -35,12 +35,14 @@
#include <cassert>
#include <vector>
-#include <atomic>
-class SwAutoCompleteClient final: public SvtListener
+class SwAutoCompleteClient : public SwClient
{
SwAutoCompleteWord* m_pAutoCompleteWord;
SwDoc* m_pDoc;
+#if OSL_DEBUG_LEVEL > 0
+ static sal_uLong s_nSwAutoCompleteClientCount;
+#endif
public:
SwAutoCompleteClient(SwAutoCompleteWord& rToTell, SwDoc& rSwDoc);
SwAutoCompleteClient(const SwAutoCompleteClient& rClient);
@@ -49,44 +51,13 @@ public:
SwAutoCompleteClient& operator=(const SwAutoCompleteClient& rClient);
const SwDoc& GetDoc() const {return *m_pDoc;}
- virtual void Notify(const SfxHint&) override;
#if OSL_DEBUG_LEVEL > 0
- static sal_uInt32 GetElementCount() {return s_nSwAutoCompleteClientCount.load();}
-private:
- static std::atomic<sal_uInt32> s_nSwAutoCompleteClientCount;
+ static sal_uLong GetElementCount() {return s_nSwAutoCompleteClientCount;}
#endif
+protected:
+ virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) override;
};
-
-SwAutoCompleteClient::SwAutoCompleteClient(SwAutoCompleteWord& rToTell, SwDoc& rSwDoc)
- : m_pAutoCompleteWord(&rToTell)
- , m_pDoc(&rSwDoc)
-{
- StartListening(m_pDoc->getIDocumentStylePoolAccess().GetPageDescFromPool(RES_POOLPAGE_STANDARD)->GetNotifier());
-#if OSL_DEBUG_LEVEL > 0
- ++s_nSwAutoCompleteClientCount;
-#endif
-}
-
-SwAutoCompleteClient::SwAutoCompleteClient(const SwAutoCompleteClient& rClient)
- : SvtListener()
- , m_pAutoCompleteWord(rClient.m_pAutoCompleteWord)
- , m_pDoc(rClient.m_pDoc)
-{
- StartListening(m_pDoc->getIDocumentStylePoolAccess().GetPageDescFromPool(RES_POOLPAGE_STANDARD)->GetNotifier());
-#if OSL_DEBUG_LEVEL > 0
- ++s_nSwAutoCompleteClientCount;
-#endif
-}
-
-SwAutoCompleteClient::~SwAutoCompleteClient()
-{
-#if OSL_DEBUG_LEVEL > 0
- --s_nSwAutoCompleteClientCount;
-#endif
- (void) this;
-}
-
typedef std::vector<SwAutoCompleteClient> SwAutoCompleteClientVector;
class SwAutoCompleteWord_Impl
@@ -101,7 +72,6 @@ public:
};
typedef std::vector<const SwDoc*> SwDocPtrVector;
-
class SwAutoCompleteString
: public editeng::IAutoCompleteString
{
@@ -120,22 +90,59 @@ class SwAutoCompleteString
static sal_uLong GetElementCount() {return s_nSwAutoCompleteStringCount;}
#endif
};
+#if OSL_DEBUG_LEVEL > 0
+ sal_uLong SwAutoCompleteClient::s_nSwAutoCompleteClientCount = 0;
+ sal_uLong SwAutoCompleteString::s_nSwAutoCompleteStringCount = 0;
+#endif
+
+SwAutoCompleteClient::SwAutoCompleteClient(SwAutoCompleteWord& rToTell, SwDoc& rSwDoc) :
+ m_pAutoCompleteWord(&rToTell),
+ m_pDoc(&rSwDoc)
+{
+ m_pDoc->getIDocumentStylePoolAccess().GetPageDescFromPool(RES_POOLPAGE_STANDARD)->Add(this);
+#if OSL_DEBUG_LEVEL > 0
+ ++s_nSwAutoCompleteClientCount;
+#endif
+}
+
+SwAutoCompleteClient::SwAutoCompleteClient(const SwAutoCompleteClient& rClient) :
+ SwClient(),
+ m_pAutoCompleteWord(rClient.m_pAutoCompleteWord),
+ m_pDoc(rClient.m_pDoc)
+{
+ m_pDoc->getIDocumentStylePoolAccess().GetPageDescFromPool(RES_POOLPAGE_STANDARD)->Add(this);
+#if OSL_DEBUG_LEVEL > 0
+ ++s_nSwAutoCompleteClientCount;
+#endif
+}
+
+SwAutoCompleteClient::~SwAutoCompleteClient()
+{
+#if OSL_DEBUG_LEVEL > 0
+ --s_nSwAutoCompleteClientCount;
+#else
+ (void) this;
+#endif
+}
SwAutoCompleteClient& SwAutoCompleteClient::operator=(const SwAutoCompleteClient& rClient)
{
m_pAutoCompleteWord = rClient.m_pAutoCompleteWord;
m_pDoc = rClient.m_pDoc;
- StartListening(m_pDoc->getIDocumentStylePoolAccess().GetPageDescFromPool(RES_POOLPAGE_STANDARD)->GetNotifier());
+ StartListeningToSameModifyAs(rClient);
return *this;
}
-void SwAutoCompleteClient::Notify(const SfxHint& rHint)
+void SwAutoCompleteClient::Modify( const SfxPoolItem* pOld, const SfxPoolItem *)
{
- if(rHint.GetId() == SfxHintId::Dying)
+ switch( pOld ? pOld->Which() : 0 )
{
- EndListeningAll();
+ case RES_REMOVE_UNO_OBJECT:
+ case RES_OBJECTDYING:
+ if( static_cast<void*>(GetRegisteredIn()) == static_cast<const SwPtrMsgPoolItem *>(pOld)->pObject )
+ EndListeningAll();
m_pAutoCompleteWord->DocumentDying(*m_pDoc);
- m_pDoc = nullptr;
+ break;
}
}
@@ -206,7 +213,7 @@ SwAutoCompleteWord::~SwAutoCompleteWord()
m_WordList.DeleteAndDestroyAll(); // so the assertion below works
#if OSL_DEBUG_LEVEL > 0
sal_uLong nStrings = SwAutoCompleteString::GetElementCount();
- sal_uInt32 nClients = SwAutoCompleteClient::GetElementCount();
+ sal_uLong nClients = SwAutoCompleteClient::GetElementCount();
OSL_ENSURE(!nStrings && !nClients, "AutoComplete: clients or string count mismatch");
#endif
}
@@ -394,9 +401,4 @@ void SwAutoCompleteWord::DocumentDying(const SwDoc& rDoc)
}
}
-#if OSL_DEBUG_LEVEL > 0
-std::atomic<sal_uInt32> SwAutoCompleteClient::s_nSwAutoCompleteClientCount = 0;
-sal_uLong SwAutoCompleteString::s_nSwAutoCompleteStringCount = 0;
-#endif
-
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list