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@libreoffice.org>
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
This commit is contained in:
Mohammed Abdul Azeem
2016-07-28 23:10:12 +05:30
committed by Michael Meeks
parent 7f32fddb44
commit 916a11d26c

View File

@@ -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,