podofo / podofo

A C++17 PDF manipulation library

Home Page:https://podofo.github.io/podofo/documentation

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Freetype font management thread-safety

as-ascii opened this issue · comments

First of all, as always, thanks for your work on the project

It seems that there is a thread-safety problem related with freetype library. I think it would be better to introduce a mutex in PoDoFo than require a mutex around PoDoFo calls. Please find Thread-sanitizer error with backtrace below. DocWire namespace is just the parent project https://github.com/docwire/docwire using PoDoFo, you can just skip this part of backtrace.

178:   Read of size 8 at 0x7b2000009ea8 by thread T4 (mutexes: write M1234):
178:     #0 FT_List_Add /home/adrian/Work/docwire/vcpkg/buildtrees/freetype/src/freetype-2-62ce70eb82.clean/src/base/ftutil.c:277 (libfreetyped.so.6+0x4186b)
178:     #1 ft_open_face_internal /home/adrian/Work/docwire/vcpkg/buildtrees/freetype/src/freetype-2-62ce70eb82.clean/src/base/ftobjs.c:2711 (libfreetyped.so.6+0x31002)
178:     #2 FT_Open_Face /home/adrian/Work/docwire/vcpkg/buildtrees/freetype/src/freetype-2-62ce70eb82.clean/src/base/ftobjs.c:2510 (libfreetyped.so.6+0x307fc)
178:     #3 FT::TryCreateFaceFromBuffer(tcb::span<char const, 18446744073709551615ul> const&, unsigned int, FT_FaceRec_*&) /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/private/FreetypePrivate.cpp:57 (libpodofo.so.2+0x51ff21)
178:     #4 FT::TryCreateFaceFromBuffer(tcb::span<char const, 18446744073709551615ul> const&, FT_FaceRec_*&) /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/private/FreetypePrivate.cpp:44 (libpodofo.so.2+0x51fe3d)
178:     #5 PoDoFo::PdfFontMetricsBase::GetFaceHandle() const /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontMetrics.cpp:359 (libpodofo.so.2+0x3c8b4d)
178:     #6 PoDoFo::PdfFontMetrics::TryGetOrLoadFace(FT_FaceRec_*&) const /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontMetrics.cpp:66 (libpodofo.so.2+0x3c7534)
178:     #7 PoDoFo::PdfFontMetricsObject::tryLoadBuiltinCIDToGIDMap() /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontMetricsObject.cpp:617 (libpodofo.so.2+0x3d5785)
178:     #8 PoDoFo::PdfFontMetricsObject::PdfFontMetricsObject(PoDoFo::PdfObject const&, PoDoFo::PdfObject const*) /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontMetricsObject.cpp:92 (libpodofo.so.2+0x3d1caf)
178:     #9 PoDoFo::PdfFontMetricsObject::Create(PoDoFo::PdfObject const&, PoDoFo::PdfObject const*) /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontMetricsObject.cpp:392 (libpodofo.so.2+0x3d4727)
178:     #10 PoDoFo::PdfFont::TryCreateFromObject(PoDoFo::PdfObject&, std::unique_ptr<PoDoFo::PdfFont, std::default_delete<PoDoFo::PdfFont> >&) /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontFactory.cpp:167 (libpodofo.so.2+0x3b22f6)
178:     #11 PoDoFo::PdfFontManager::GetLoadedFont(PoDoFo::PdfResources const&, std::basic_string_view<char, std::char_traits<char> > const&) /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontManager.cpp:114 (libpodofo.so.2+0x3b5d0e)
178:     #12 PoDoFo::PdfResources::GetFont(std::basic_string_view<char, std::char_traits<char> > const&) const /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfResources.cpp:87 (libpodofo.so.2+0x4be27e)
178:     #13 docwire::PDFParser::Implementation::parseText() /home/adrian/Work/docwire/src/pdf_parser.cpp:8050 (libdocwire_parsers.so+0x381f72)
178:     #14 docwire::PDFParser::parse() const /home/adrian/Work/docwire/src/pdf_parser.cpp:8386 (libdocwire_parsers.so+0x33ec46)
178:     #15 docwire::Importer::Implementation::process(docwire::Info&) /home/adrian/Work/docwire/src/importer.cpp:127 (libdocwire_core.so+0x2b98f7)
178:     #16 docwire::Importer::process(docwire::Info&) const /home/adrian/Work/docwire/src/importer.cpp:212 (libdocwire_core.so+0x2b7454)
178:     #17 docwire::ChainElement::Implementation::connect(docwire::ChainElement const&)::{lambda(docwire::Info&)#1}::operator()(docwire::Info&) const /home/adrian/Work/docwire/src/chain_element.cpp:32 (libdocwire_core.so+0x2d03bf)
178:     #18 boost::detail::function::void_function_obj_invoker1<docwire::ChainElement::Implementation::connect(docwire::ChainElement const&)::{lambda(docwire::Info&)#1}, void, docwire::Info&>::invoke(boost::detail::function::function_buffer&, docwire::Info&) /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/function/function_template.hpp:158 (libdocwire_core.so+0x2d1e41)
178:     #19 boost::function1<void, docwire::Info&>::operator()(docwire::Info&) const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/function/function_template.hpp:771 (libdocwire_core.so+0x251c87)
178:     #20 boost::signals2::detail::void_type boost::signals2::detail::call_with_tuple_args<boost::signals2::detail::void_type>::m_invoke<boost::function<void (docwire::Info&)>, 0u, docwire::Info&>(boost::function<void (docwire::Info&)>&, boost::signals2::detail::unsigned_meta_array<0u>, std::tuple<docwire::Info&> const&, boost::enable_if<boost::is_void<boost::function<void (docwire::Info&)>::result_type>, void>::type*) const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/variadic_slot_invoker.hpp:105 (libdocwire_core.so+0x251157)
178:     #21 boost::signals2::detail::void_type boost::signals2::detail::call_with_tuple_args<boost::signals2::detail::void_type>::operator()<boost::function<void (docwire::Info&)>, docwire::Info&, 1ul>(boost::function<void (docwire::Info&)>&, std::tuple<docwire::Info&> const&, mpl_::size_t<1ul>) const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/variadic_slot_invoker.hpp:90 (libdocwire_core.so+0x24fdcf)
178:     #22 boost::signals2::detail::void_type boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>::operator()<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >(boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > const&) const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/variadic_slot_invoker.hpp:133 (libdocwire_core.so+0x24e24d)
178:     #23 boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >::dereference() const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/slot_call_iterator.hpp:110 (libdocwire_core.so+0x24b353)
178:     #24 boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >::reference boost::iterators::iterator_core_access::dereference<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >(boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > const&) /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/iterator/iterator_facade.hpp:631 (libdocwire_core.so+0x248db6)
178:     #25 boost::iterators::detail::iterator_facade_base<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >, boost::signals2::detail::void_type, boost::iterators::single_pass_traversal_tag, boost::signals2::detail::void_type const&, long, false, false>::operator*() const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/iterator/iterator_facade.hpp:737 (libdocwire_core.so+0x246268)
178:     #26 void boost::signals2::optional_last_value<void>::operator()<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >(boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >) const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/optional_last_value.hpp:57 (libdocwire_core.so+0x24409f)
178:     #27 void boost::signals2::detail::combiner_invoker<void>::operator()<boost::signals2::optional_last_value<void>, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >(boost::signals2::optional_last_value<void>&, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >) const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/result_type_wrapper.hpp:64 (libdocwire_core.so+0x242308)
178:     #28 boost::signals2::detail::signal_impl<void (docwire::Info&), boost::signals2::optional_last_value<void>, int, std::less<int>, boost::function<void (docwire::Info&)>, boost::function<void (boost::signals2::connection const&, docwire::Info&)>, boost::signals2::mutex>::operator()(docwire::Info&) /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/signal_template.hpp:243 (libdocwire_core.so+0x2407dd)
178:     #29 boost::signals2::signal<void (docwire::Info&), boost::signals2::optional_last_value<void>, int, std::less<int>, boost::function<void (docwire::Info&)>, boost::function<void (boost::signals2::connection const&, docwire::Info&)>, boost::signals2::mutex>::operator()(docwire::Info&) /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/signal_template.hpp:722 (libdocwire_core.so+0x2d0804)
178:     #30 docwire::ChainElement::Implementation::emit(docwire::Info&) const /home/adrian/Work/docwire/src/chain_element.cpp:37 (libdocwire_core.so+0x2d04ce)
178:     #31 docwire::ChainElement::emit(docwire::Info&) const /home/adrian/Work/docwire/src/chain_element.cpp:94 (libdocwire_core.so+0x2cf1f0)
178:     #32 docwire::DecompressArchives::process(docwire::Info&) const /home/adrian/Work/docwire/src/decompress_archives.cpp:223 (libdocwire_core.so+0x1f8133)
178:     #33 docwire::InputBase::process(docwire::ChainElement&) const /home/adrian/Work/docwire/src/input.cpp:58 (libdocwire_core.so+0x2d564b)
178:     #34 docwire::ParsingChain::process(docwire::InputBase&) /home/adrian/Work/docwire/src/parsing_chain.cpp:80 (libdocwire_core.so+0x2d300f)
178:     #35 docwire::InputBase::operator|(docwire::ParsingChain&) /home/adrian/Work/docwire/src/input.cpp:34 (libdocwire_core.so+0x2d4ecd)
178:     #36 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > docwire::SimpleExtractor::Implementation::getText<docwire::PlainTextExporter>() const /home/adrian/Work/docwire/src/simple_extractor.cpp:60 (libdocwire_core.so+0x2b13c9)
178:     #37 docwire::SimpleExtractor::Implementation::getPlainText[abi:cxx11]() const /home/adrian/Work/docwire/src/simple_extractor.cpp:120 (libdocwire_core.so+0x2b0ab3)
178:     #38 docwire::SimpleExtractor::getPlainText[abi:cxx11]() const /home/adrian/Work/docwire/src/simple_extractor.cpp:198 (libdocwire_core.so+0x2af2fe)
178:     #39 thread_func(void*) /home/adrian/Work/docwire/tests/api_tests.cpp:465 (api_tests+0x7401c)
178: 
178:   Previous write of size 8 at 0x7b2000009ea8 by thread T3:
178:     #0 FT_List_Remove /home/adrian/Work/docwire/vcpkg/buildtrees/freetype/src/freetype-2-62ce70eb82.clean/src/base/ftutil.c:340 (libfreetyped.so.6+0x41ab6)
178:     #1 FT_Done_Face /home/adrian/Work/docwire/vcpkg/buildtrees/freetype/src/freetype-2-62ce70eb82.clean/src/base/ftobjs.c:2943 (libfreetyped.so.6+0x31a7b)
178:     #2 std::_Sp_counted_deleter<FT_FaceRec_*, int (*)(FT_FaceRec_*), std::allocator<void>, (__gnu_cxx::_Lock_policy)2>::_M_dispose() /usr/include/c++/12/bits/shared_ptr_base.h:527 (libpodofo.so.2+0x3cc23b)
178:     #3 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release_last_use() /usr/include/c++/12/bits/shared_ptr_base.h:175 (api_tests+0x8953b)
178:     #4 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() /usr/include/c++/12/bits/shared_ptr_base.h:361 (api_tests+0x7f5e6)
178:     #5 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count() /usr/include/c++/12/bits/shared_ptr_base.h:1071 (api_tests+0x8973e)
178:     #6 std::__shared_ptr<FT_FaceRec_, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr() /usr/include/c++/12/bits/shared_ptr_base.h:1524 (libpodofo.so.2+0x3a4d8b)
178:     #7 std::shared_ptr<FT_FaceRec_>::~shared_ptr() /usr/include/c++/12/bits/shared_ptr.h:175 (libpodofo.so.2+0x3a4db7)
178:     #8 PoDoFo::FreeTypeFacePtr::~FreeTypeFacePtr() /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontMetrics.h:20 (libpodofo.so.2+0x3a4de3)
178:     #9 PoDoFo::PdfFontMetricsBase::~PdfFontMetricsBase() /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontMetrics.h:348 (libpodofo.so.2+0x3b3085)
178:     #10 PoDoFo::PdfFontMetricsObject::~PdfFontMetricsObject() /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontMetricsObject.h:26 (libpodofo.so.2+0x3b31bd)
178:     #11 PoDoFo::PdfFontMetricsObject::~PdfFontMetricsObject() /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontMetricsObject.h:26 (libpodofo.so.2+0x3b31ed)
178:     #12 std::default_delete<PoDoFo::PdfFontMetricsObject>::operator()(PoDoFo::PdfFontMetricsObject*) const /usr/include/c++/12/bits/unique_ptr.h:95 (libpodofo.so.2+0x3b3232)
178:     #13 std::_Sp_counted_deleter<PoDoFo::PdfFontMetricsObject*, std::default_delete<PoDoFo::PdfFontMetricsObject>, std::allocator<void>, (__gnu_cxx::_Lock_policy)2>::_M_dispose() /usr/include/c++/12/bits/shared_ptr_base.h:527 (libpodofo.so.2+0x3b4fce)
178:     #14 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release_last_use() /usr/include/c++/12/bits/shared_ptr_base.h:175 (api_tests+0x8953b)
178:     #15 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() /usr/include/c++/12/bits/shared_ptr_base.h:361 (api_tests+0x7f5e6)
178:     #16 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count() /usr/include/c++/12/bits/shared_ptr_base.h:1071 (api_tests+0x8973e)
178:     #17 std::__shared_ptr<PoDoFo::PdfFontMetrics const, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr() /usr/include/c++/12/bits/shared_ptr_base.h:1524 (libpodofo.so.2+0x3a3407)
178:     #18 std::shared_ptr<PoDoFo::PdfFontMetrics const>::~shared_ptr() /usr/include/c++/12/bits/shared_ptr.h:175 (libpodofo.so.2+0x3a346b)
178:     #19 PoDoFo::PdfFont::~PdfFont() /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFont.cpp:69 (libpodofo.so.2+0x39c94b)
178:     #20 PoDoFo::PdfFontObject::~PdfFontObject() /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontObject.h:14 (libpodofo.so.2+0x3b33f9)
178:     #21 PoDoFo::PdfFontObject::~PdfFontObject() /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontObject.h:14 (libpodofo.so.2+0x3b3429)
178:     #22 std::default_delete<PoDoFo::PdfFont>::operator()(PoDoFo::PdfFont*) const /usr/include/c++/12/bits/unique_ptr.h:95 (libpodofo.so.2+0x3585cc)
178:     #23 std::unique_ptr<PoDoFo::PdfFont, std::default_delete<PoDoFo::PdfFont> >::~unique_ptr() /usr/include/c++/12/bits/unique_ptr.h:396 (libpodofo.so.2+0x358176)
178:     #24 PoDoFo::PdfFontManager::Storage::~Storage() /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontManager.h:181 (libpodofo.so.2+0x357a0f)
178:     #25 std::pair<PoDoFo::PdfReference const, PoDoFo::PdfFontManager::Storage>::~pair() /usr/include/c++/12/bits/stl_pair.h:185 (libpodofo.so.2+0x357a3f)
178:     #26 void std::__new_allocator<std::__detail::_Hash_node<std::pair<PoDoFo::PdfReference const, PoDoFo::PdfFontManager::Storage>, false> >::destroy<std::pair<PoDoFo::PdfReference const, PoDoFo::PdfFontManager::Storage> >(std::pair<PoDoFo::PdfReference const, PoDoFo::PdfFontManager::Storage>*) /usr/include/c++/12/bits/new_allocator.h:181 (libpodofo.so.2+0x357a6f)
178:     #27 void std::allocator_traits<std::allocator<std::__detail::_Hash_node<std::pair<PoDoFo::PdfReference const, PoDoFo::PdfFontManager::Storage>, false> > >::destroy<std::pair<PoDoFo::PdfReference const, PoDoFo::PdfFontManager::Storage> >(std::allocator<std::__detail::_Hash_node<std::pair<PoDoFo::PdfReference const, PoDoFo::PdfFontManager::Storage>, false> >&, std::pair<PoDoFo::PdfReference const, PoDoFo::PdfFontManager::Storage>*) /usr/include/c++/12/bits/alloc_traits.h:535 (libpodofo.so.2+0x356e43)
178:     #28 std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<PoDoFo::PdfReference const, PoDoFo::PdfFontManager::Storage>, false> > >::_M_deallocate_node(std::__detail::_Hash_node<std::pair<PoDoFo::PdfReference const, PoDoFo::PdfFontManager::Storage>, false>*) /usr/include/c++/12/bits/hashtable_policy.h:1984 (libpodofo.so.2+0x355c86)
178:     #29 std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<PoDoFo::PdfReference const, PoDoFo::PdfFontManager::Storage>, false> > >::_M_deallocate_nodes(std::__detail::_Hash_node<std::pair<PoDoFo::PdfReference const, PoDoFo::PdfFontManager::Storage>, false>*) /usr/include/c++/12/bits/hashtable_policy.h:2006 (libpodofo.so.2+0x354b6d)
178:     #30 std::_Hashtable<PoDoFo::PdfReference, std::pair<PoDoFo::PdfReference const, PoDoFo::PdfFontManager::Storage>, std::allocator<std::pair<PoDoFo::PdfReference const, PoDoFo::PdfFontManager::Storage> >, std::__detail::_Select1st, std::equal_to<PoDoFo::PdfReference>, std::hash<PoDoFo::PdfReference>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, false, true> >::clear() /usr/include/c++/12/bits/hashtable.h:2500 (libpodofo.so.2+0x352c30)
178:     #31 std::_Hashtable<PoDoFo::PdfReference, std::pair<PoDoFo::PdfReference const, PoDoFo::PdfFontManager::Storage>, std::allocator<std::pair<PoDoFo::PdfReference const, PoDoFo::PdfFontManager::Storage> >, std::__detail::_Select1st, std::equal_to<PoDoFo::PdfReference>, std::hash<PoDoFo::PdfReference>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, false, true> >::~_Hashtable() /usr/include/c++/12/bits/hashtable.h:1584 (libpodofo.so.2+0x350d5d)
178:     #32 std::unordered_map<PoDoFo::PdfReference, PoDoFo::PdfFontManager::Storage, std::hash<PoDoFo::PdfReference>, std::equal_to<PoDoFo::PdfReference>, std::allocator<std::pair<PoDoFo::PdfReference const, PoDoFo::PdfFontManager::Storage> > >::~unordered_map() /usr/include/c++/12/bits/unordered_map.h:102 (libpodofo.so.2+0x3508d7)
178:     #33 PoDoFo::PdfFontManager::~PdfFontManager() <null> (libpodofo.so.2+0x350947)
178:     #34 PoDoFo::PdfDocument::~PdfDocument() /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfDocument.cpp:70 (libpodofo.so.2+0x34c4c9)
178:     #35 PoDoFo::PdfMemDocument::~PdfMemDocument() /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/podofo/main/PdfMemDocument.h:37 (libdocwire_parsers.so+0x3c7c97)
178:     #36 docwire::PDFParser::Implementation::~Implementation() /home/adrian/Work/docwire/src/pdf_parser.cpp:698 (libdocwire_parsers.so+0x340db1)
178:     #37 docwire::PDFParser::~PDFParser() /home/adrian/Work/docwire/src/pdf_parser.cpp:8349 (libdocwire_parsers.so+0x33e4bc)
178:     #38 docwire::PDFParser::~PDFParser() /home/adrian/Work/docwire/src/pdf_parser.cpp:8351 (libdocwire_parsers.so+0x33e509)
178:     #39 std::default_delete<docwire::Parser>::operator()(docwire::Parser*) const /usr/include/c++/12/bits/unique_ptr.h:95 (libdocwire_core.so+0x2bbece)
178:     #40 std::unique_ptr<docwire::Parser, std::default_delete<docwire::Parser> >::~unique_ptr() /usr/include/c++/12/bits/unique_ptr.h:396 (libdocwire_core.so+0x2baf40)
178:     #41 docwire::Importer::Implementation::process(docwire::Info&) /home/adrian/Work/docwire/src/importer.cpp:127 (libdocwire_core.so+0x2b9906)
178:     #42 docwire::Importer::process(docwire::Info&) const /home/adrian/Work/docwire/src/importer.cpp:212 (libdocwire_core.so+0x2b7454)
178:     #43 docwire::ChainElement::Implementation::connect(docwire::ChainElement const&)::{lambda(docwire::Info&)#1}::operator()(docwire::Info&) const /home/adrian/Work/docwire/src/chain_element.cpp:32 (libdocwire_core.so+0x2d03bf)
178:     #44 boost::detail::function::void_function_obj_invoker1<docwire::ChainElement::Implementation::connect(docwire::ChainElement const&)::{lambda(docwire::Info&)#1}, void, docwire::Info&>::invoke(boost::detail::function::function_buffer&, docwire::Info&) /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/function/function_template.hpp:158 (libdocwire_core.so+0x2d1e41)
178:     #45 boost::function1<void, docwire::Info&>::operator()(docwire::Info&) const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/function/function_template.hpp:771 (libdocwire_core.so+0x251c87)
178:     #46 boost::signals2::detail::void_type boost::signals2::detail::call_with_tuple_args<boost::signals2::detail::void_type>::m_invoke<boost::function<void (docwire::Info&)>, 0u, docwire::Info&>(boost::function<void (docwire::Info&)>&, boost::signals2::detail::unsigned_meta_array<0u>, std::tuple<docwire::Info&> const&, boost::enable_if<boost::is_void<boost::function<void (docwire::Info&)>::result_type>, void>::type*) const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/variadic_slot_invoker.hpp:105 (libdocwire_core.so+0x251157)
178:     #47 boost::signals2::detail::void_type boost::signals2::detail::call_with_tuple_args<boost::signals2::detail::void_type>::operator()<boost::function<void (docwire::Info&)>, docwire::Info&, 1ul>(boost::function<void (docwire::Info&)>&, std::tuple<docwire::Info&> const&, mpl_::size_t<1ul>) const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/variadic_slot_invoker.hpp:90 (libdocwire_core.so+0x24fdcf)
178:     #48 boost::signals2::detail::void_type boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>::operator()<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >(boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > const&) const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/variadic_slot_invoker.hpp:133 (libdocwire_core.so+0x24e24d)
178:     #49 boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >::dereference() const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/slot_call_iterator.hpp:110 (libdocwire_core.so+0x24b353)
178:     #50 boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >::reference boost::iterators::iterator_core_access::dereference<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >(boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > const&) /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/iterator/iterator_facade.hpp:631 (libdocwire_core.so+0x248db6)
178:     #51 boost::iterators::detail::iterator_facade_base<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >, boost::signals2::detail::void_type, boost::iterators::single_pass_traversal_tag, boost::signals2::detail::void_type const&, long, false, false>::operator*() const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/iterator/iterator_facade.hpp:737 (libdocwire_core.so+0x246268)
178:     #52 void boost::signals2::optional_last_value<void>::operator()<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >(boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >) const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/optional_last_value.hpp:57 (libdocwire_core.so+0x24409f)
178:     #53 void boost::signals2::detail::combiner_invoker<void>::operator()<boost::signals2::optional_last_value<void>, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >(boost::signals2::optional_last_value<void>&, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >) const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/result_type_wrapper.hpp:64 (libdocwire_core.so+0x242308)
178:     #54 boost::signals2::detail::signal_impl<void (docwire::Info&), boost::signals2::optional_last_value<void>, int, std::less<int>, boost::function<void (docwire::Info&)>, boost::function<void (boost::signals2::connection const&, docwire::Info&)>, boost::signals2::mutex>::operator()(docwire::Info&) /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/signal_template.hpp:243 (libdocwire_core.so+0x2407dd)
178:     #55 boost::signals2::signal<void (docwire::Info&), boost::signals2::optional_last_value<void>, int, std::less<int>, boost::function<void (docwire::Info&)>, boost::function<void (boost::signals2::connection const&, docwire::Info&)>, boost::signals2::mutex>::operator()(docwire::Info&) /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/signal_template.hpp:722 (libdocwire_core.so+0x2d0804)
178:     #56 docwire::ChainElement::Implementation::emit(docwire::Info&) const /home/adrian/Work/docwire/src/chain_element.cpp:37 (libdocwire_core.so+0x2d04ce)
178:     #57 docwire::ChainElement::emit(docwire::Info&) const /home/adrian/Work/docwire/src/chain_element.cpp:94 (libdocwire_core.so+0x2cf1f0)
178:     #58 docwire::DecompressArchives::process(docwire::Info&) const /home/adrian/Work/docwire/src/decompress_archives.cpp:223 (libdocwire_core.so+0x1f8133)
178:     #59 docwire::InputBase::process(docwire::ChainElement&) const /home/adrian/Work/docwire/src/input.cpp:58 (libdocwire_core.so+0x2d564b)
178:     #60 docwire::ParsingChain::process(docwire::InputBase&) /home/adrian/Work/docwire/src/parsing_chain.cpp:80 (libdocwire_core.so+0x2d300f)
178:     #61 docwire::InputBase::operator|(docwire::ParsingChain&) /home/adrian/Work/docwire/src/input.cpp:34 (libdocwire_core.so+0x2d4ecd)
178:     #62 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > docwire::SimpleExtractor::Implementation::getText<docwire::PlainTextExporter>() const /home/adrian/Work/docwire/src/simple_extractor.cpp:60 (libdocwire_core.so+0x2b13c9)
178:     #63 docwire::SimpleExtractor::Implementation::getPlainText[abi:cxx11]() const /home/adrian/Work/docwire/src/simple_extractor.cpp:120 (libdocwire_core.so+0x2b0ab3)
178:     #64 docwire::SimpleExtractor::getPlainText[abi:cxx11]() const /home/adrian/Work/docwire/src/simple_extractor.cpp:198 (libdocwire_core.so+0x2af2fe)
178:     #65 thread_func(void*) /home/adrian/Work/docwire/tests/api_tests.cpp:465 (api_tests+0x7401c)
178: 
178:   Location is heap block of size 128 at 0x7b2000009e80 allocated by thread T2:
178:     #0 malloc ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:647 (libtsan.so.2+0x3ebb8)
178:     #1 ft_alloc /home/adrian/Work/docwire/vcpkg/buildtrees/freetype/src/freetype-2-62ce70eb82.clean/builds/unix/ftsystem.c:113 (libfreetyped.so.6+0x153084)
178:     #2 ft_mem_qalloc /home/adrian/Work/docwire/vcpkg/buildtrees/freetype/src/freetype-2-62ce70eb82.clean/src/base/ftutil.c:75 (libfreetyped.so.6+0x412ba)
178:     #3 ft_mem_alloc /home/adrian/Work/docwire/vcpkg/buildtrees/freetype/src/freetype-2-62ce70eb82.clean/src/base/ftutil.c:54 (libfreetyped.so.6+0x411ee)
178:     #4 FT_Add_Module /home/adrian/Work/docwire/vcpkg/buildtrees/freetype/src/freetype-2-62ce70eb82.clean/src/base/ftobjs.c:5082 (libfreetyped.so.6+0x36eac)
178:     #5 FT_Add_Default_Modules /home/adrian/Work/docwire/vcpkg/buildtrees/freetype/src/freetype-2-62ce70eb82.clean/src/base/ftinit.c:94 (libfreetyped.so.6+0x49aa9)
178:     #6 FT_Init_FreeType /home/adrian/Work/docwire/vcpkg/buildtrees/freetype/src/freetype-2-62ce70eb82.clean/src/base/ftinit.c:228 (libfreetyped.so.6+0x49f26)
178:     #7 Init /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/private/FreetypePrivate.cpp:25 (libpodofo.so.2+0x51fbed)
178:     #8 FT::GetLibrary() /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/private/FreetypePrivate.cpp:38 (libpodofo.so.2+0x51fd8d)
178:     #9 FT::TryCreateFaceFromBuffer(tcb::span<char const, 18446744073709551615ul> const&, unsigned int, FT_FaceRec_*&) /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/private/FreetypePrivate.cpp:57 (libpodofo.so.2+0x51ff08)
178:     #10 FT::TryCreateFaceFromBuffer(tcb::span<char const, 18446744073709551615ul> const&, FT_FaceRec_*&) /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/private/FreetypePrivate.cpp:44 (libpodofo.so.2+0x51fe3d)
178:     #11 PoDoFo::PdfFontMetricsBase::GetFaceHandle() const /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontMetrics.cpp:359 (libpodofo.so.2+0x3c8b4d)
178:     #12 PoDoFo::PdfFontMetrics::TryGetOrLoadFace(FT_FaceRec_*&) const /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontMetrics.cpp:66 (libpodofo.so.2+0x3c7534)
178:     #13 PoDoFo::PdfFontMetricsObject::tryLoadBuiltinCIDToGIDMap() /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontMetricsObject.cpp:617 (libpodofo.so.2+0x3d5785)
178:     #14 PoDoFo::PdfFontMetricsObject::PdfFontMetricsObject(PoDoFo::PdfObject const&, PoDoFo::PdfObject const*) /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontMetricsObject.cpp:92 (libpodofo.so.2+0x3d1caf)
178:     #15 PoDoFo::PdfFontMetricsObject::Create(PoDoFo::PdfObject const&, PoDoFo::PdfObject const*) /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontMetricsObject.cpp:392 (libpodofo.so.2+0x3d4727)
178:     #16 PoDoFo::PdfFont::TryCreateFromObject(PoDoFo::PdfObject&, std::unique_ptr<PoDoFo::PdfFont, std::default_delete<PoDoFo::PdfFont> >&) /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontFactory.cpp:167 (libpodofo.so.2+0x3b22f6)
178:     #17 PoDoFo::PdfFontManager::GetLoadedFont(PoDoFo::PdfResources const&, std::basic_string_view<char, std::char_traits<char> > const&) /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfFontManager.cpp:114 (libpodofo.so.2+0x3b5d0e)
178:     #18 PoDoFo::PdfResources::GetFont(std::basic_string_view<char, std::char_traits<char> > const&) const /home/adrian/Work/docwire/vcpkg/buildtrees/podofo/src/0.10.3-d3371f51ad.clean/src/podofo/main/PdfResources.cpp:87 (libpodofo.so.2+0x4be27e)
178:     #19 docwire::PDFParser::Implementation::parseText() /home/adrian/Work/docwire/src/pdf_parser.cpp:8050 (libdocwire_parsers.so+0x381f72)
178:     #20 docwire::PDFParser::parse() const /home/adrian/Work/docwire/src/pdf_parser.cpp:8386 (libdocwire_parsers.so+0x33ec46)
178:     #21 docwire::Importer::Implementation::process(docwire::Info&) /home/adrian/Work/docwire/src/importer.cpp:127 (libdocwire_core.so+0x2b98f7)
178:     #22 docwire::Importer::process(docwire::Info&) const /home/adrian/Work/docwire/src/importer.cpp:212 (libdocwire_core.so+0x2b7454)
178:     #23 docwire::ChainElement::Implementation::connect(docwire::ChainElement const&)::{lambda(docwire::Info&)#1}::operator()(docwire::Info&) const /home/adrian/Work/docwire/src/chain_element.cpp:32 (libdocwire_core.so+0x2d03bf)
178:     #24 boost::detail::function::void_function_obj_invoker1<docwire::ChainElement::Implementation::connect(docwire::ChainElement const&)::{lambda(docwire::Info&)#1}, void, docwire::Info&>::invoke(boost::detail::function::function_buffer&, docwire::Info&) /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/function/function_template.hpp:158 (libdocwire_core.so+0x2d1e41)
178:     #25 boost::function1<void, docwire::Info&>::operator()(docwire::Info&) const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/function/function_template.hpp:771 (libdocwire_core.so+0x251c87)
178:     #26 boost::signals2::detail::void_type boost::signals2::detail::call_with_tuple_args<boost::signals2::detail::void_type>::m_invoke<boost::function<void (docwire::Info&)>, 0u, docwire::Info&>(boost::function<void (docwire::Info&)>&, boost::signals2::detail::unsigned_meta_array<0u>, std::tuple<docwire::Info&> const&, boost::enable_if<boost::is_void<boost::function<void (docwire::Info&)>::result_type>, void>::type*) const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/variadic_slot_invoker.hpp:105 (libdocwire_core.so+0x251157)
178:     #27 boost::signals2::detail::void_type boost::signals2::detail::call_with_tuple_args<boost::signals2::detail::void_type>::operator()<boost::function<void (docwire::Info&)>, docwire::Info&, 1ul>(boost::function<void (docwire::Info&)>&, std::tuple<docwire::Info&> const&, mpl_::size_t<1ul>) const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/variadic_slot_invoker.hpp:90 (libdocwire_core.so+0x24fdcf)
178:     #28 boost::signals2::detail::void_type boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>::operator()<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >(boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > const&) const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/variadic_slot_invoker.hpp:133 (libdocwire_core.so+0x24e24d)
178:     #29 boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >::dereference() const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/slot_call_iterator.hpp:110 (libdocwire_core.so+0x24b353)
178:     #30 boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >::reference boost::iterators::iterator_core_access::dereference<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >(boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > const&) /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/iterator/iterator_facade.hpp:631 (libdocwire_core.so+0x248db6)
178:     #31 boost::iterators::detail::iterator_facade_base<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >, boost::signals2::detail::void_type, boost::iterators::single_pass_traversal_tag, boost::signals2::detail::void_type const&, long, false, false>::operator*() const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/iterator/iterator_facade.hpp:737 (libdocwire_core.so+0x246268)
178:     #32 void boost::signals2::optional_last_value<void>::operator()<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >(boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >) const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/optional_last_value.hpp:57 (libdocwire_core.so+0x24409f)
178:     #33 void boost::signals2::detail::combiner_invoker<void>::operator()<boost::signals2::optional_last_value<void>, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >(boost::signals2::optional_last_value<void>&, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, docwire::Info&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (docwire::Info&), boost::function<void (docwire::Info&)> >, boost::signals2::mutex> >) const /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/result_type_wrapper.hpp:64 (libdocwire_core.so+0x242308)
178:     #34 boost::signals2::detail::signal_impl<void (docwire::Info&), boost::signals2::optional_last_value<void>, int, std::less<int>, boost::function<void (docwire::Info&)>, boost::function<void (boost::signals2::connection const&, docwire::Info&)>, boost::signals2::mutex>::operator()(docwire::Info&) /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/signal_template.hpp:243 (libdocwire_core.so+0x2407dd)
178:     #35 boost::signals2::signal<void (docwire::Info&), boost::signals2::optional_last_value<void>, int, std::less<int>, boost::function<void (docwire::Info&)>, boost::function<void (boost::signals2::connection const&, docwire::Info&)>, boost::signals2::mutex>::operator()(docwire::Info&) /home/adrian/Work/docwire/vcpkg/installed/x64-linux-dynamic-tsan/include/boost/signals2/detail/signal_template.hpp:722 (libdocwire_core.so+0x2d0804)
178:     #36 docwire::ChainElement::Implementation::emit(docwire::Info&) const /home/adrian/Work/docwire/src/chain_element.cpp:37 (libdocwire_core.so+0x2d04ce)
178:     #37 docwire::ChainElement::emit(docwire::Info&) const /home/adrian/Work/docwire/src/chain_element.cpp:94 (libdocwire_core.so+0x2cf1f0)
178:     #38 docwire::DecompressArchives::process(docwire::Info&) const /home/adrian/Work/docwire/src/decompress_archives.cpp:223 (libdocwire_core.so+0x1f8133)
178:     #39 docwire::InputBase::process(docwire::ChainElement&) const /home/adrian/Work/docwire/src/input.cpp:58 (libdocwire_core.so+0x2d564b)
178:     #40 docwire::ParsingChain::process(docwire::InputBase&) /home/adrian/Work/docwire/src/parsing_chain.cpp:80 (libdocwire_core.so+0x2d300f)
178:     #41 docwire::InputBase::operator|(docwire::ParsingChain&) /home/adrian/Work/docwire/src/input.cpp:34 (libdocwire_core.so+0x2d4ecd)
178:     #42 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > docwire::SimpleExtractor::Implementation::getText<docwire::PlainTextExporter>() const /home/adrian/Work/docwire/src/simple_extractor.cpp:60 (libdocwire_core.so+0x2b13c9)
178:     #43 docwire::SimpleExtractor::Implementation::getPlainText[abi:cxx11]() const /home/adrian/Work/docwire/src/simple_extractor.cpp:120 (libdocwire_core.so+0x2b0ab3)
178:     #44 docwire::SimpleExtractor::getPlainText[abi:cxx11]() const /home/adrian/Work/docwire/src/simple_extractor.cpp:198 (libdocwire_core.so+0x2af2fe)
178:     #45 thread_func(void*) /home/adrian/Work/docwire/tests/api_tests.cpp:465 (api_tests+0x7401c)

...

PoDoFo is a manipulation (read/edit) library and is general is not thread safe. It is neither designed to be read-only thread safe as many things are lazily loaded and there are no locks to synchronize these initializations, in 0.9.x as well (only few global stuff is accessibile as singletons and implicitly guarded by locks). I have no imminent plans to add some level of thread safety but I'm imaging we could add a whole document/per-page eagerly load functions so subsequent read operations are thread safe. Edit and deallocation operations shall still be affine to the creation thread. It's not in my top priority list as I'm still continuing slowly (but steadily) the API review. Feel free to elaborate and add your considerations to this issue.