diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2013-10-11 14:09:52 +0100 |
---|---|---|
committer | Matúš Kukan <matus.kukan@gmail.com> | 2013-10-17 21:38:38 +0200 |
commit | 902748b6ff9aca0793466c863e30c9e052321f52 (patch) | |
tree | 77669eca121104ed00880440cbd11c82cbf910ff | |
parent | 9612bdbfa9335823e864c354130717f0e7607bf1 (diff) |
fastparser: re-work locking, add high & low watermarks, change sizes etc.
Change-Id: I7fe1435addc6dce5a74a8411f7825cea331a5b3f
-rw-r--r-- | sax/source/fastparser/fastparser.cxx | 37 | ||||
-rw-r--r-- | sax/source/fastparser/fastparser.hxx | 6 |
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: |