summaryrefslogtreecommitdiff
path: root/sax
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@collabora.com>2018-09-11 22:28:08 +0100
committerMiklos Vajna <vmiklos@collabora.co.uk>2018-09-14 14:53:18 +0200
commit815ff47bbd82c06bb7436a89e6ecf11fd59b8d76 (patch)
tree7e6fd8e829aa926a1a898b46dda68275f1a1c98b /sax
parent611cc1e609593ed849c760495990578606db7bfe (diff)
Ensure fastparser thread is joined in case of exceptions.
Change-Id: Ie0fb21776514a9a67e9fdff2ae856392cd711adb Reviewed-on: https://gerrit.libreoffice.org/60361 Tested-by: Jenkins Reviewed-by: Michael Meeks <michael.meeks@collabora.com> (cherry picked from commit efa2681db1fb66e5f3677adff3a5e91ccba6b9ec) Reviewed-on: https://gerrit.libreoffice.org/60372 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Diffstat (limited to 'sax')
-rw-r--r--sax/source/fastparser/fastparser.cxx18
1 files changed, 17 insertions, 1 deletions
diff --git a/sax/source/fastparser/fastparser.cxx b/sax/source/fastparser/fastparser.cxx
index 2765584a08fc..5655d7137056 100644
--- a/sax/source/fastparser/fastparser.cxx
+++ b/sax/source/fastparser/fastparser.cxx
@@ -740,6 +740,7 @@ namespace
private:
FastSaxParserImpl& m_rParser;
Entity& m_rEntity;
+ rtl::Reference<ParserThread> m_xParser;
public:
ParserCleanup(FastSaxParserImpl& rParser, Entity& rEntity)
: m_rParser(rParser)
@@ -751,6 +752,20 @@ namespace
//xmlFreeParserCtxt accepts a null arg
xmlFreeParserCtxt(m_rEntity.mpParser);
m_rParser.popEntity();
+ joinThread();
+ }
+ void setThread(const rtl::Reference<ParserThread> &xParser)
+ {
+ m_xParser = xParser;
+ }
+ void joinThread()
+ {
+ if (m_xParser.is())
+ {
+ rtl::Reference<ParserThread> xToJoin = m_xParser;
+ m_xParser.clear();
+ xToJoin->join();
+ }
}
};
}
@@ -786,6 +801,7 @@ void FastSaxParserImpl::parseStream(const InputSource& rStructSource)
{
rtl::Reference<ParserThread> xParser;
xParser = new ParserThread(this);
+ aEnsureFree.setThread(xParser);
xParser->launch();
bool done = false;
do {
@@ -827,7 +843,7 @@ void FastSaxParserImpl::parseStream(const InputSource& rStructSource)
rEntity.maUsedEvents.push(std::move(xEventList));
}
} while (!done);
- xParser->join();
+ aEnsureFree.joinThread();
deleteUsedEvents();
// callbacks used inside XML_Parse may have caught an exception