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:
committed by
Michael Meeks
parent
7f32fddb44
commit
916a11d26c
@@ -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,
|
||||||
|
Reference in New Issue
Block a user