summaryrefslogtreecommitdiff
path: root/sax
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@collabora.com>2013-10-11 14:09:52 +0100
committerMatúš Kukan <matus.kukan@gmail.com>2013-10-17 21:38:38 +0200
commit902748b6ff9aca0793466c863e30c9e052321f52 (patch)
tree77669eca121104ed00880440cbd11c82cbf910ff /sax
parent9612bdbfa9335823e864c354130717f0e7607bf1 (diff)
fastparser: re-work locking, add high & low watermarks, change sizes etc.
Change-Id: I7fe1435addc6dce5a74a8411f7825cea331a5b3f
Diffstat (limited to 'sax')
-rw-r--r--sax/source/fastparser/fastparser.cxx37
-rw-r--r--sax/source/fastparser/fastparser.hxx6
2 files changed, 37 insertions, 6 deletions
diff --git a/sax/source/fastparser/fastparser.cxx b/sax/source/fastparser/fastparser.cxx
index 6f92f59e82ac..2040c32a1ed8 100644
--- a/sax/source/fastparser/fastparser.cxx
+++ b/sax/source/fastparser/fastparser.cxx
@@ -565,15 +565,23 @@ void FastSaxParser::parseStream( const InputSource& maStructSource) throw (SAXEx
xParser->launch();
bool done = false;
do {
- rEntity.maEventsPushed.wait();
- rEntity.maEventsPushed.reset();
- MutexGuard aGuard(rEntity.maEventProtector);
+ rEntity.maConsumeResume.wait();
+ rEntity.maConsumeResume.reset();
+
+ osl::ResettableMutexGuard aGuard(rEntity.maEventProtector);
while (!rEntity.maPendingEvents.empty())
{
+ if (rEntity.maPendingEvents.size() <= rEntity.mnEventLowWater)
+ rEntity.maProduceResume.set(); // start producer again
+
EventList *pEventList = rEntity.maPendingEvents.front();
rEntity.maPendingEvents.pop();
+ aGuard.clear(); // unlock
+
if (!consume(pEventList))
done = true;
+
+ aGuard.reset(); // lock
}
} while (!done);
xParser->join();
@@ -748,12 +756,18 @@ OUString lclGetErrorMessage( XML_Error xmlE, const OUString& sSystemId, sal_Int3
void FastSaxParser::deleteUsedEvents()
{
Entity& rEntity = getEntity();
+ osl::ResettableMutexGuard aGuard(rEntity.maEventProtector);
+
while (!rEntity.maUsedEvents.empty())
{
EventList *pEventList = rEntity.maUsedEvents.front();
rEntity.maUsedEvents.pop();
+ aGuard.clear(); // unlock
+
delete pEventList;
+
+ aGuard.reset(); // lock
}
}
@@ -770,11 +784,24 @@ void FastSaxParser::produce(const Event& aEvent)
aEvent->maType == CallbackType::EXCEPTION ||
rEntity.mpProducedEvents->size() == rEntity.mnEventListSize)
{
- MutexGuard aGuard(rEntity.maEventProtector);
+ osl::ResettableMutexGuard aGuard(rEntity.maEventProtector);
+
+ while (rEntity.maPendingEvents.size() >= rEntity.mnEventHighWater)
+ { // pause parsing for a bit
+ aGuard.clear(); // unlock
+ rEntity.maProduceResume.wait();
+ rEntity.maProduceResume.reset();
+ aGuard.reset(); // lock
+ }
+
rEntity.maPendingEvents.push(rEntity.mpProducedEvents);
rEntity.mpProducedEvents = 0;
+
+ aGuard.clear(); // unlock
+
+ rEntity.maConsumeResume.set();
+
deleteUsedEvents();
- rEntity.maEventsPushed.set();
}
}
diff --git a/sax/source/fastparser/fastparser.hxx b/sax/source/fastparser/fastparser.hxx
index b23c3ff53a9c..88d6a223d0f9 100644
--- a/sax/source/fastparser/fastparser.hxx
+++ b/sax/source/fastparser/fastparser.hxx
@@ -118,7 +118,11 @@ struct Entity : public ParserData
std::queue< EventList * > maPendingEvents;
std::queue< EventList * > maUsedEvents;
osl::Mutex maEventProtector;
- osl::Condition maEventsPushed;
+
+ static const size_t mnEventLowWater = 4;
+ static const size_t mnEventHighWater = 8;
+ osl::Condition maConsumeResume;
+ osl::Condition maProduceResume;
// copied in copy constructor: