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