[Libreoffice-commits] core.git: sax/source

Mohammed Abdul Azeem azeemmysore at gmail.com
Fri Jul 29 22:15:42 UTC 2016


 sax/source/fastparser/fastparser.cxx |   50 +++++++++++++++++++++++++++++------
 1 file changed, 42 insertions(+), 8 deletions(-)

New commits:
commit 916a11d26cb74da9dd534e07b35737def6cbf54a
Author: Mohammed Abdul Azeem <azeemmysore at gmail.com>
Date:   Thu Jul 28 23:10:12 2016 +0530

    GSoC - moving FastAttributeList::clear to consumer thread:
    
    this shares the load of clearing the attributes list with
    the consumer when producer is busy.
    
    Change-Id: I6e89858703c7af9c30b2d99fd6825dc81290b488
    Reviewed-on: https://gerrit.libreoffice.org/27649
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>

diff --git a/sax/source/fastparser/fastparser.cxx b/sax/source/fastparser/fastparser.cxx
index ab324a1..8fa9223 100644
--- a/sax/source/fastparser/fastparser.cxx
+++ b/sax/source/fastparser/fastparser.cxx
@@ -70,7 +70,11 @@ struct Entity;
 typedef std::unordered_map< OUString, sal_Int32,
         OUStringHash > NamespaceMap;
 
-typedef std::vector<Event> EventList;
+struct EventList
+{
+    std::vector<Event> maEvents;
+    bool mbIsAttributesEmpty;
+};
 
 enum CallbackType { INVALID, START_ELEMENT, END_ELEMENT, CHARACTERS, DONE, EXCEPTION };
 
@@ -531,7 +535,7 @@ EventList* Entity::getEventList()
         if (!mpProducedEvents)
         {
             mpProducedEvents = new EventList();
-            mpProducedEvents->resize(mnEventListSize);
+            mpProducedEvents->maEvents.resize(mnEventListSize);
             mnProducedEventsSize = 0;
         }
     }
@@ -544,7 +548,7 @@ Event& Entity::getEvent( CallbackType aType )
         return maSharedEvent;
 
     EventList* pEventList = getEventList();
-    Event& rEvent = (*pEventList)[mnProducedEventsSize++];
+    Event& rEvent = pEventList->maEvents[mnProducedEventsSize++];
     rEvent.maType = aType;
     return rEvent;
 }
@@ -783,6 +787,24 @@ void FastSaxParserImpl::parseStream(const InputSource& maStructSource)
                         done = true;
 
                     aGuard.reset(); // lock
+
+                    if ( rEntity.maPendingEvents.size() <= rEntity.mnEventLowWater )
+                    {
+                        aGuard.clear();
+                        for (auto aEventIt = pEventList->maEvents.begin();
+                            aEventIt != pEventList->maEvents.end(); ++aEventIt)
+                        {
+                            if (aEventIt->mxAttributes.is())
+                            {
+                                aEventIt->mxAttributes->clear();
+                                if( rEntity.mxNamespaceHandler.is() )
+                                    aEventIt->mxDeclAttributes->clear();
+                            }
+                            pEventList->mbIsAttributesEmpty = true;
+                        }
+                        aGuard.reset();
+                    }
+
                     rEntity.maUsedEvents.push(pEventList);
                 }
             } while (!done);
@@ -926,8 +948,9 @@ void FastSaxParserImpl::produce( bool bForceFlush )
 bool FastSaxParserImpl::consume(EventList *pEventList)
 {
     Entity& rEntity = getEntity();
-    for (EventList::iterator aEventIt = pEventList->begin();
-         aEventIt != pEventList->end(); ++aEventIt)
+    pEventList->mbIsAttributesEmpty = false;
+    for (auto aEventIt = pEventList->maEvents.begin();
+         aEventIt != pEventList->maEvents.end(); ++aEventIt)
     {
         switch ((*aEventIt).maType)
         {
@@ -1042,17 +1065,28 @@ void FastSaxParserImpl::callbackStartElement(const xmlChar *localName , const xm
     }
 
     // create attribute map and process namespace instructions
-    Event& rEvent = getEntity().getEvent( START_ELEMENT );
+    Event& rEvent = rEntity.getEvent( START_ELEMENT );
+    bool bIsAttributesEmpty = false;
+    if ( rEntity.mbEnableThreads )
+        bIsAttributesEmpty = rEntity.getEventList()->mbIsAttributesEmpty;
+
     if (rEvent.mxAttributes.is())
-        rEvent.mxAttributes->clear();
+    {
+        if( !bIsAttributesEmpty )
+            rEvent.mxAttributes->clear();
+    }
     else
         rEvent.mxAttributes.set(
                 new FastAttributeList( rEntity.mxTokenHandler,
                                        rEntity.mpTokenHandler ) );
+
     if( rEntity.mxNamespaceHandler.is() )
     {
         if (rEvent.mxDeclAttributes.is())
-            rEvent.mxDeclAttributes->clear();
+        {
+            if( !bIsAttributesEmpty )
+                rEvent.mxDeclAttributes->clear();
+        }
         else
             rEvent.mxDeclAttributes.set(
                 new FastAttributeList( rEntity.mxTokenHandler,


More information about the Libreoffice-commits mailing list