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>
This commit is contained in:
@@ -744,6 +744,7 @@ namespace
|
||||
private:
|
||||
FastSaxParserImpl& m_rParser;
|
||||
Entity& m_rEntity;
|
||||
rtl::Reference<ParserThread> m_xParser;
|
||||
public:
|
||||
ParserCleanup(FastSaxParserImpl& rParser, Entity& rEntity)
|
||||
: m_rParser(rParser)
|
||||
@@ -759,6 +760,20 @@ namespace
|
||||
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();
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -799,6 +814,7 @@ void FastSaxParserImpl::parseStream(const InputSource& rStructSource)
|
||||
{
|
||||
rtl::Reference<ParserThread> xParser;
|
||||
xParser = new ParserThread(this);
|
||||
aEnsureFree.setThread(xParser);
|
||||
xParser->launch();
|
||||
bool done = false;
|
||||
do {
|
||||
@@ -840,7 +856,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
|
||||
|
||||
Reference in New Issue
Block a user