[Libreoffice-commits] core.git: include/xmloff xmloff/source

Noel Grandin (via logerrit) logerrit at kemper.freedesktop.org
Wed Nov 6 19:30:26 UTC 2019


 include/xmloff/xmlictxt.hxx     |   32 ++++++++++++++++++++++++--------
 xmloff/source/core/xmlictxt.cxx |   30 ++++++++++++++++++++++++++++--
 2 files changed, 52 insertions(+), 10 deletions(-)

New commits:
commit ef0e7e146f86999b04d7274688d72fadcaf53a36
Author:     Noel Grandin <noel.grandin at collabora.co.uk>
AuthorDate: Wed Nov 6 20:08:56 2019 +0200
Commit:     Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Wed Nov 6 20:28:52 2019 +0100

    tdf#125688 removing XWeak support from SvXMLImportContext
    
    shaves 2% off the load time
    
    Change-Id: Icac00389dfcc3339fe4faf1731e9eeb3ff8d0f0c
    Reviewed-on: https://gerrit.libreoffice.org/82139
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/include/xmloff/xmlictxt.hxx b/include/xmloff/xmlictxt.hxx
index 9cf531b4eef5..8dc67dac0227 100644
--- a/include/xmloff/xmlictxt.hxx
+++ b/include/xmloff/xmlictxt.hxx
@@ -24,8 +24,8 @@
 #include <xmloff/dllapi.h>
 #include <sal/types.h>
 #include <com/sun/star/xml/sax/XFastContextHandler.hpp>
+#include <com/sun/star/lang/XTypeProvider.hpp>
 #include <rtl/ustring.hxx>
-#include <cppuhelper/implbase.hxx>
 #include <xmloff/nmspmap.hxx>
 #include <memory>
 
@@ -37,15 +37,20 @@ class SvXMLImportContext;
 
 typedef rtl::Reference<SvXMLImportContext> SvXMLImportContextRef;
 
-class XMLOFF_DLLPUBLIC SvXMLImportContext : public cppu::WeakImplHelper< css::xml::sax::XFastContextHandler >
+/**
+This class deliberately does not support XWeak, to improve performance when loading
+large documents.
+*/
+class XMLOFF_DLLPUBLIC SvXMLImportContext : public css::xml::sax::XFastContextHandler,
+                                            public css::lang::XTypeProvider
+
 {
     friend class SvXMLImport;
 
-    SvXMLImport& mrImport;
-
-    sal_uInt16 const       mnPrefix;
-    OUString const maLocalName;
-
+    oslInterlockedCount                m_nRefCount;
+    SvXMLImport&                       mrImport;
+    sal_uInt16                         mnPrefix;
+    OUString                           maLocalName;
     std::unique_ptr<SvXMLNamespaceMap> m_pRewindMap;
 
     SAL_DLLPRIVATE std::unique_ptr<SvXMLNamespaceMap> TakeRewindMap() { return std::move(m_pRewindMap); }
@@ -74,7 +79,7 @@ public:
      * ends. By default, nothing is done.
      * Note that virtual methods cannot be used inside destructors. Use
      * EndElement instead if this is required. */
-    virtual ~SvXMLImportContext() override;
+    virtual ~SvXMLImportContext();
 
     /** Create a children element context. By default, the import's
      * CreateContext method is called to create a new default context. */
@@ -115,6 +120,17 @@ public:
         const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
 
     virtual void SAL_CALL characters(const OUString & aChars) override;
+
+    // XInterface
+    virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type& aType ) final override;
+    virtual void SAL_CALL acquire() throw () final override
+    { osl_atomic_increment(&m_nRefCount); }
+    virtual void SAL_CALL release() throw () final override
+    { if (osl_atomic_decrement(&m_nRefCount) == 0) delete this; }
+
+    // XTypeProvider
+    virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes(  ) final override;
+    virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId(  ) final override;
 };
 
 #endif // INCLUDED_XMLOFF_XMLICTXT_HXX
diff --git a/xmloff/source/core/xmlictxt.cxx b/xmloff/source/core/xmlictxt.cxx
index fb4e64ef8719..8e31d497ab8e 100644
--- a/xmloff/source/core/xmlictxt.cxx
+++ b/xmloff/source/core/xmlictxt.cxx
@@ -22,19 +22,22 @@
 #include <xmloff/xmlictxt.hxx>
 #include <sax/fastattribs.hxx>
 #include <comphelper/attributelist.hxx>
+#include <cppuhelper/queryinterface.hxx>
 
 using namespace ::com::sun::star;
 
 SvXMLImportContext::SvXMLImportContext( SvXMLImport& rImp, sal_uInt16 nPrfx,
                               const OUString& rLName )
-    : mrImport(rImp)
+    : m_nRefCount(0)
+    , mrImport(rImp)
     , mnPrefix(nPrfx)
     , maLocalName(rLName)
 {
 }
 
 SvXMLImportContext::SvXMLImportContext( SvXMLImport& rImp )
-    : mrImport(rImp)
+    : m_nRefCount(0)
+    , mrImport(rImp)
     , mnPrefix(0)
 {
 }
@@ -143,4 +146,27 @@ void SAL_CALL SvXMLImportContext::characters(const OUString &rChars)
     mrImport.Characters( rChars );
 }
 
+// XInterface
+css::uno::Any SAL_CALL SvXMLImportContext::queryInterface( const css::uno::Type& aType )
+{
+    css::uno::Any a = ::cppu::queryInterface(
+                aType,
+                static_cast< XFastContextHandler* >(this),
+                static_cast< XTypeProvider* >(this));
+
+    return a;
+}
+
+// XTypeProvider
+css::uno::Sequence< css::uno::Type > SAL_CALL SvXMLImportContext::getTypes()
+{
+    return { cppu::UnoType<XFastContextHandler>::get(),
+             cppu::UnoType<XTypeProvider>::get() };
+}
+
+css::uno::Sequence< sal_Int8 > SAL_CALL SvXMLImportContext::getImplementationId()
+{
+    return css::uno::Sequence<sal_Int8>();
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list