Kaydet (Commit) efa2681d authored tarafından Michael Meeks's avatar Michael Meeks

Ensure fastparser thread is joined in case of exceptions.

Change-Id: Ie0fb21776514a9a67e9fdff2ae856392cd711adb
Reviewed-on: https://gerrit.libreoffice.org/60361
Tested-by: Jenkins
Reviewed-by: 's avatarMichael Meeks <michael.meeks@collabora.com>
üst ec06ffdf
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment