Race condition on initializing a vector of reserved node names
It's not reproducible in the normal conditions. I accidentally caught this when was running openmw under gdb. Adding a sleep to the right place reprocudes the race with ThreadSanitizer on ff90c9ce:
WARNING: ThreadSanitizer: data race (pid=29141)
Read of size 1 at 0x7b7000050378 by thread T15:
#0 std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__is_long() const /usr/bin/../include/c++/v1/string:1445:39 (openmw+0x15219ce)
#1 std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__get_pointer() const /usr/bin/../include/c++/v1/string:1544:17 (openmw+0x15219ce)
#2 std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::data() const /usr/bin/../include/c++/v1/string:1251:75 (openmw+0x15219ce)
#3 std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator std::__1::basic_string_view<char, std::__1::char_traits<char> >() const /usr/bin/../include/c++/v1/string:879:65 (openmw+0x15219ce)
#4 std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*> Misc::partialBinarySearch<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) /home/elsid/dev/openmw/./components/misc/algorithm.hpp:47:56 (openmw+0x15219ce)
#5 Resource::CanOptimizeCallback::isReservedName(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const /home/elsid/dev/openmw/components/resource/scenemanager.cpp:661:53 (openmw+0x15219ce)
#6 Resource::CanOptimizeCallback::isOperationPermissibleForObjectImplementation(SceneUtil::Optimizer const*, osg::Node const*, unsigned int) const /home/elsid/dev/openmw/components/resource/scenemanager.cpp:681:17 (openmw+0x1521362)
#7 SceneUtil::Optimizer::isOperationPermissibleForObject(osg::Node const*, unsigned int) const /home/elsid/dev/openmw/components/sceneutil/optimizer.hpp:216:66 (openmw+0x15b1c6c)
#8 SceneUtil::BaseOptimizerVisitor::isOperationPermissibleForObject(osg::Node const*) const /home/elsid/dev/openmw/components/sceneutil/optimizer.hpp:466:37 (openmw+0x15b1c6c)
#9 SceneUtil::Optimizer::MergeGeometryVisitor::mergeGroup(osg::Group&) /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:1202:10 (openmw+0x15b1c6c)
#10 SceneUtil::Optimizer::MergeGeometryVisitor::apply(osg::Group&) /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:1170:9 (openmw+0x15b1aa5)
#11 osg::Group::accept(osg::NodeVisitor&) /home/elsid/dev/OpenSceneGraph/build/clang/tsan/install/include/osg/Group:38:9 (openmw+0x8ab8c5)
#12 osg::Group::traverse(osg::NodeVisitor&) /home/elsid/dev/OpenSceneGraph/src/osg/Group.cpp:63:17 (libosg.so.162+0x1ee6d2)
#13 osg::NodeVisitor::traverse(osg::Node&) /home/elsid/dev/OpenSceneGraph/build/clang/tsan/install/include/osg/NodeVisitor (openmw+0x15b1adb)
#14 SceneUtil::Optimizer::MergeGeometryVisitor::apply(osg::Group&) /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:1172:5 (openmw+0x15b1adb)
#15 osg::Group::accept(osg::NodeVisitor&) /home/elsid/dev/OpenSceneGraph/build/clang/tsan/install/include/osg/Group:38:9 (openmw+0x8ab8c5)
#16 SceneUtil::Optimizer::optimize(osg::Node*, unsigned int) /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:119:15 (openmw+0x15aa043)
#17 Resource::SceneManager::getTemplate(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) /home/elsid/dev/openmw/components/resource/scenemanager.cpp:794:27 (openmw+0x1518649)
#18 MWRender::PreloadCommonAssetsWorkItem::doWork() /home/elsid/dev/openmw/apps/openmw/mwrender/renderingmanager.cpp:352:57 (openmw+0x818e2d)
#19 SceneUtil::WorkThread::run() /home/elsid/dev/openmw/components/sceneutil/workqueue.cpp:134:15 (openmw+0x159f306)
#20 SceneUtil::WorkThread::WorkThread(SceneUtil::WorkQueue&)::$_1::operator()() const /home/elsid/dev/openmw/components/sceneutil/workqueue.cpp:117:24 (openmw+0x159f4a0)
#21 decltype(static_cast<SceneUtil::WorkThread::WorkThread(SceneUtil::WorkQueue&)::$_1>(fp)()) std::__1::__invoke<SceneUtil::WorkThread::WorkThread(SceneUtil::WorkQueue&)::$_1>(SceneUtil::WorkThread::WorkThread(SceneUtil::WorkQueue&)::$_1&&) /usr/bin/../include/c++/v1/type_traits:3640:23 (openmw+0x159f4a0)
#22 void std::__1::__thread_execute<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, SceneUtil::WorkThread::WorkThread(SceneUtil::WorkQueue&)::$_1>(std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, SceneUtil::WorkThread::WorkThread(SceneUtil::WorkQueue&)::$_1>&, std::__1::__tuple_indices<>) /usr/bin/../include/c++/v1/thread:282:5 (openmw+0x159f4a0)
#23 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, SceneUtil::WorkThread::WorkThread(SceneUtil::WorkQueue&)::$_1> >(void*) /usr/bin/../include/c++/v1/thread:293:5 (openmw+0x159f4a0)
Previous write of size 8 at 0x7b7000050378 by main thread:
#0 memcpy <null> (openmw+0x781d16)
#1 std::__1::enable_if<(is_move_constructible<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__rep>::value) && (is_move_assignable<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__rep>::value), void>::type std::__1::swap<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__rep>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__rep&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__rep&) /usr/bin/../include/c++/v1/__utility/swap.h:37:7 (openmw+0x1522203)
#2 std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::swap(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) /usr/bin/../include/c++/v1/string:3452:5 (openmw+0x1522203)
#3 void std::__1::swap<char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) /usr/bin/../include/c++/v1/string:4313:11 (openmw+0x1522203)
#4 void std::__1::__introsort<bool (*&)(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> >), std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, bool (*&)(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> >), std::__1::iterator_traits<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>::difference_type) /usr/bin/../include/c++/v1/__algorithm/sort.h:418:17 (openmw+0x1522203)
#5 void std::__1::__introsort<bool (*&)(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> >), std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, bool (*&)(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> >), std::__1::iterator_traits<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>::difference_type) /usr/bin/../include/c++/v1/__algorithm/sort.h:462:11 (openmw+0x15227d8)
#6 void std::__1::__sort<bool (*&)(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> >), std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, bool (*&)(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> >)) /usr/bin/../include/c++/v1/__algorithm/sort.h:482:3 (openmw+0x15218f5)
#7 void std::__1::sort<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>, bool (*)(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> >)>(std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>, std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>, bool (*)(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> >)) /usr/bin/../include/c++/v1/__algorithm/sort.h:542:5 (openmw+0x15218f5)
#8 Resource::CanOptimizeCallback::isReservedName(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const /home/elsid/dev/openmw/components/resource/scenemanager.cpp:658:17 (openmw+0x15218f5)
#9 Resource::CanOptimizeCallback::isOperationPermissibleForObjectImplementation(SceneUtil::Optimizer const*, osg::Node const*, unsigned int) const /home/elsid/dev/openmw/components/resource/scenemanager.cpp:681:17 (openmw+0x1521362)
#10 SceneUtil::Optimizer::isOperationPermissibleForObject(osg::Node const*, unsigned int) const /home/elsid/dev/openmw/components/sceneutil/optimizer.hpp:216:66 (openmw+0x15bcf55)
#11 SceneUtil::BaseOptimizerVisitor::isOperationPermissibleForObject(osg::Node const*) const /home/elsid/dev/openmw/components/sceneutil/optimizer.hpp:466:37 (openmw+0x15bcf55)
#12 SceneUtil::CollectLowestTransformsVisitor::isOperationPermissibleForObject(osg::Node const*) const /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:271:42 (openmw+0x15bcf55)
#13 void SceneUtil::CollectLowestTransformsVisitor::registerWithCurrentObjects<osg::MatrixTransform>(osg::MatrixTransform*) /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:348:62 (openmw+0x15bcf55)
#14 SceneUtil::CollectLowestTransformsVisitor::apply(osg::MatrixTransform&) /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:201:13 (openmw+0x15bbd80)
#15 NifOsg::MatrixTransform::accept(osg::NodeVisitor&) /home/elsid/dev/openmw/./components/nifosg/matrixtransform.hpp:18:9 (openmw+0x15a9075)
#16 SceneUtil::CollectLowestTransformsVisitor::collectDataFor(osg::Drawable*) /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:240:25 (openmw+0x15b8de3)
#17 SceneUtil::Optimizer::FlattenStaticTransformsVisitor::removeTransforms(osg::Node*) /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:700:14 (openmw+0x15aaa8d)
#18 SceneUtil::Optimizer::optimize(osg::Node*, unsigned int) /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:76:27 (openmw+0x15a9817)
#19 Resource::SceneManager::getTemplate(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) /home/elsid/dev/openmw/components/resource/scenemanager.cpp:794:27 (openmw+0x1518649)
#20 MWRender::ActorAnimation::attach(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> >, bool) /home/elsid/dev/openmw/apps/openmw/mwrender/actoranimation.cpp:85:86 (openmw+0x8b5966)
#21 MWRender::NpcAnimation::insertBoundedPart(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> >, bool, osg::Vec4f*, bool) /home/elsid/dev/openmw/apps/openmw/mwrender/npcanimation.cpp:712:40 (openmw+0x8632ed)
#22 MWRender::NpcAnimation::addOrReplaceIndividualPart(ESM::PartReferenceType, int, int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool, osg::Vec4f*, bool) /home/elsid/dev/openmw/apps/openmw/mwrender/npcanimation.cpp:817:30 (openmw+0x86165d)
#23 MWRender::NpcAnimation::addPartGroup(int, int, std::__1::vector<ESM::PartReference, std::__1::allocator<ESM::PartReference> > const&, bool, osg::Vec4f*) /home/elsid/dev/openmw/apps/openmw/mwrender/npcanimation.cpp:932:13 (openmw+0x860f73)
#24 MWRender::NpcAnimation::updateParts() /home/elsid/dev/openmw/apps/openmw/mwrender/npcanimation.cpp:630:13 (openmw+0x85f9df)
#25 MWRender::NpcAnimation::updateNpcBase() /home/elsid/dev/openmw/apps/openmw/mwrender/npcanimation.cpp:519:5 (openmw+0x85df42)
#26 MWRender::NpcAnimation::NpcAnimation(MWWorld::Ptr const&, osg::ref_ptr<osg::Group>, Resource::ResourceSystem*, bool, MWRender::NpcAnimation::ViewMode, float) /home/elsid/dev/openmw/apps/openmw/mwrender/npcanimation.cpp:296:5 (openmw+0x85cf8f)
#27 MWRender::CharacterPreview::rebuild() /home/elsid/dev/openmw/apps/openmw/mwrender/characterpreview.cpp:376:26 (openmw+0x88f0d4)
#28 MWGui::InventoryWindow::InventoryWindow(MWGui::DragAndDrop*, osg::Group*, Resource::ResourceSystem*) /home/elsid/dev/openmw/apps/openmw/mwgui/inventorywindow.cpp:72:19 (openmw+0x9dc2f0)
#29 std::__1::__unique_if<MWGui::InventoryWindow>::__unique_single std::__1::make_unique<MWGui::InventoryWindow, MWGui::DragAndDrop*, osg::Group*, Resource::ResourceSystem*&>(MWGui::DragAndDrop*&&, osg::Group*&&, Resource::ResourceSystem*&) /usr/bin/../include/c++/v1/__memory/unique_ptr.h:725:32 (openmw+0x952d97)
#30 MWGui::WindowManager::initUI() /home/elsid/dev/openmw/apps/openmw/mwgui/windowmanagerimp.cpp:312:32 (openmw+0x952d97)
#31 OMW::Engine::prepareEngine() /home/elsid/dev/openmw/apps/openmw/engine.cpp:873:21 (openmw+0x1360828)
#32 OMW::Engine::go() /home/elsid/dev/openmw/apps/openmw/engine.cpp:1042:5 (openmw+0x1361abd)
#33 runApplication(int, char**) /home/elsid/dev/openmw/apps/openmw/main.cpp:228:17 (openmw+0x1356e0e)
#34 wrapApplication(int (*)(int, char**), int, char**, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) /home/elsid/dev/openmw/components/debug/debugging.cpp:330:19 (openmw+0x1757a91)
#35 main /home/elsid/dev/openmw/apps/openmw/main.cpp:240:12 (openmw+0x1356f0a)
As if synchronized via sleep:
#0 nanosleep <null> (openmw+0x7b6528)
#1 std::__1::this_thread::sleep_for(std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l> > const&) <null> (libc++.so.1+0x5fd28)
#2 Resource::CanOptimizeCallback::isOperationPermissibleForObjectImplementation(SceneUtil::Optimizer const*, osg::Node const*, unsigned int) const /home/elsid/dev/openmw/components/resource/scenemanager.cpp:681:17 (openmw+0x1521362)
#3 SceneUtil::Optimizer::isOperationPermissibleForObject(osg::Node const*, unsigned int) const /home/elsid/dev/openmw/components/sceneutil/optimizer.hpp:216:66 (openmw+0x15bcf55)
#4 SceneUtil::BaseOptimizerVisitor::isOperationPermissibleForObject(osg::Node const*) const /home/elsid/dev/openmw/components/sceneutil/optimizer.hpp:466:37 (openmw+0x15bcf55)
#5 SceneUtil::CollectLowestTransformsVisitor::isOperationPermissibleForObject(osg::Node const*) const /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:271:42 (openmw+0x15bcf55)
#6 void SceneUtil::CollectLowestTransformsVisitor::registerWithCurrentObjects<osg::MatrixTransform>(osg::MatrixTransform*) /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:348:62 (openmw+0x15bcf55)
#7 SceneUtil::CollectLowestTransformsVisitor::apply(osg::MatrixTransform&) /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:201:13 (openmw+0x15bbd80)
#8 NifOsg::MatrixTransform::accept(osg::NodeVisitor&) /home/elsid/dev/openmw/./components/nifosg/matrixtransform.hpp:18:9 (openmw+0x15a9075)
#9 SceneUtil::CollectLowestTransformsVisitor::collectDataFor(osg::Drawable*) /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:240:25 (openmw+0x15b8de3)
#10 SceneUtil::Optimizer::FlattenStaticTransformsVisitor::removeTransforms(osg::Node*) /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:700:14 (openmw+0x15aaa8d)
#11 SceneUtil::Optimizer::optimize(osg::Node*, unsigned int) /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:76:27 (openmw+0x15a9817)
#12 Resource::SceneManager::getTemplate(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) /home/elsid/dev/openmw/components/resource/scenemanager.cpp:794:27 (openmw+0x1518649)
#13 MWRender::PreloadCommonAssetsWorkItem::doWork() /home/elsid/dev/openmw/apps/openmw/mwrender/renderingmanager.cpp:352:57 (openmw+0x818e2d)
#14 SceneUtil::WorkThread::run() /home/elsid/dev/openmw/components/sceneutil/workqueue.cpp:134:15 (openmw+0x159f306)
#15 SceneUtil::WorkThread::WorkThread(SceneUtil::WorkQueue&)::$_1::operator()() const /home/elsid/dev/openmw/components/sceneutil/workqueue.cpp:117:24 (openmw+0x159f4a0)
#16 decltype(static_cast<SceneUtil::WorkThread::WorkThread(SceneUtil::WorkQueue&)::$_1>(fp)()) std::__1::__invoke<SceneUtil::WorkThread::WorkThread(SceneUtil::WorkQueue&)::$_1>(SceneUtil::WorkThread::WorkThread(SceneUtil::WorkQueue&)::$_1&&) /usr/bin/../include/c++/v1/type_traits:3640:23 (openmw+0x159f4a0)
#17 void std::__1::__thread_execute<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, SceneUtil::WorkThread::WorkThread(SceneUtil::WorkQueue&)::$_1>(std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, SceneUtil::WorkThread::WorkThread(SceneUtil::WorkQueue&)::$_1>&, std::__1::__tuple_indices<>) /usr/bin/../include/c++/v1/thread:282:5 (openmw+0x159f4a0)
#18 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, SceneUtil::WorkThread::WorkThread(SceneUtil::WorkQueue&)::$_1> >(void*) /usr/bin/../include/c++/v1/thread:293:5 (openmw+0x159f4a0)
Location is heap block of size 1968 at 0x7b7000050000 allocated by main thread:
#0 operator new(unsigned long) <null> (openmw+0x801ef9)
#1 void* std::__1::__libcpp_operator_new<unsigned long>(unsigned long) /usr/bin/../include/c++/v1/new:245:10 (openmw+0x8b15ea)
#2 std::__1::__libcpp_allocate(unsigned long, unsigned long) /usr/bin/../include/c++/v1/new:271:10 (openmw+0x8b15ea)
#3 std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::allocate(unsigned long) /usr/bin/../include/c++/v1/__memory/allocator.h:105:38 (openmw+0x8b15ea)
#4 std::__1::allocator_traits<std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::allocate(std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >&, unsigned long) /usr/bin/../include/c++/v1/__memory/allocator_traits.h:262:20 (openmw+0x8b15ea)
#5 std::__1::__split_buffer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >&>::__split_buffer(unsigned long, unsigned long, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >&) /usr/bin/../include/c++/v1/__split_buffer:306:29 (openmw+0x8b15ea)
#6 void std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::__push_back_slow_path<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&&) /usr/bin/../include/c++/v1/vector:1517:49 (openmw+0x8b15ea)
#7 std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::push_back(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&&) /usr/bin/../include/c++/v1/vector:1549:9 (openmw+0x152182a)
#8 Resource::CanOptimizeCallback::isReservedName(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const /home/elsid/dev/openmw/components/resource/scenemanager.cpp:656:35 (openmw+0x152182a)
#9 Resource::CanOptimizeCallback::isOperationPermissibleForObjectImplementation(SceneUtil::Optimizer const*, osg::Node const*, unsigned int) const /home/elsid/dev/openmw/components/resource/scenemanager.cpp:681:17 (openmw+0x1521362)
#10 SceneUtil::Optimizer::isOperationPermissibleForObject(osg::Node const*, unsigned int) const /home/elsid/dev/openmw/components/sceneutil/optimizer.hpp:216:66 (openmw+0x15bcf55)
#11 SceneUtil::BaseOptimizerVisitor::isOperationPermissibleForObject(osg::Node const*) const /home/elsid/dev/openmw/components/sceneutil/optimizer.hpp:466:37 (openmw+0x15bcf55)
#12 SceneUtil::CollectLowestTransformsVisitor::isOperationPermissibleForObject(osg::Node const*) const /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:271:42 (openmw+0x15bcf55)
#13 void SceneUtil::CollectLowestTransformsVisitor::registerWithCurrentObjects<osg::MatrixTransform>(osg::MatrixTransform*) /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:348:62 (openmw+0x15bcf55)
#14 SceneUtil::CollectLowestTransformsVisitor::apply(osg::MatrixTransform&) /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:201:13 (openmw+0x15bbd80)
#15 NifOsg::MatrixTransform::accept(osg::NodeVisitor&) /home/elsid/dev/openmw/./components/nifosg/matrixtransform.hpp:18:9 (openmw+0x15a9075)
#16 SceneUtil::CollectLowestTransformsVisitor::collectDataFor(osg::Drawable*) /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:240:25 (openmw+0x15b8de3)
#17 SceneUtil::Optimizer::FlattenStaticTransformsVisitor::removeTransforms(osg::Node*) /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:700:14 (openmw+0x15aaa8d)
#18 SceneUtil::Optimizer::optimize(osg::Node*, unsigned int) /home/elsid/dev/openmw/components/sceneutil/optimizer.cpp:76:27 (openmw+0x15a9817)
#19 Resource::SceneManager::getTemplate(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) /home/elsid/dev/openmw/components/resource/scenemanager.cpp:794:27 (openmw+0x1518649)
#20 MWRender::ActorAnimation::attach(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> >, bool) /home/elsid/dev/openmw/apps/openmw/mwrender/actoranimation.cpp:85:86 (openmw+0x8b5966)
#21 MWRender::NpcAnimation::insertBoundedPart(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> >, bool, osg::Vec4f*, bool) /home/elsid/dev/openmw/apps/openmw/mwrender/npcanimation.cpp:712:40 (openmw+0x8632ed)
#22 MWRender::NpcAnimation::addOrReplaceIndividualPart(ESM::PartReferenceType, int, int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool, osg::Vec4f*, bool) /home/elsid/dev/openmw/apps/openmw/mwrender/npcanimation.cpp:817:30 (openmw+0x86165d)
#23 MWRender::NpcAnimation::addPartGroup(int, int, std::__1::vector<ESM::PartReference, std::__1::allocator<ESM::PartReference> > const&, bool, osg::Vec4f*) /home/elsid/dev/openmw/apps/openmw/mwrender/npcanimation.cpp:932:13 (openmw+0x860f73)
#24 MWRender::NpcAnimation::updateParts() /home/elsid/dev/openmw/apps/openmw/mwrender/npcanimation.cpp:630:13 (openmw+0x85f9df)
#25 MWRender::NpcAnimation::updateNpcBase() /home/elsid/dev/openmw/apps/openmw/mwrender/npcanimation.cpp:519:5 (openmw+0x85df42)
#26 MWRender::NpcAnimation::NpcAnimation(MWWorld::Ptr const&, osg::ref_ptr<osg::Group>, Resource::ResourceSystem*, bool, MWRender::NpcAnimation::ViewMode, float) /home/elsid/dev/openmw/apps/openmw/mwrender/npcanimation.cpp:296:5 (openmw+0x85cf8f)
#27 MWRender::CharacterPreview::rebuild() /home/elsid/dev/openmw/apps/openmw/mwrender/characterpreview.cpp:376:26 (openmw+0x88f0d4)
#28 MWGui::InventoryWindow::InventoryWindow(MWGui::DragAndDrop*, osg::Group*, Resource::ResourceSystem*) /home/elsid/dev/openmw/apps/openmw/mwgui/inventorywindow.cpp:72:19 (openmw+0x9dc2f0)
#29 std::__1::__unique_if<MWGui::InventoryWindow>::__unique_single std::__1::make_unique<MWGui::InventoryWindow, MWGui::DragAndDrop*, osg::Group*, Resource::ResourceSystem*&>(MWGui::DragAndDrop*&&, osg::Group*&&, Resource::ResourceSystem*&) /usr/bin/../include/c++/v1/__memory/unique_ptr.h:725:32 (openmw+0x952d97)
#30 MWGui::WindowManager::initUI() /home/elsid/dev/openmw/apps/openmw/mwgui/windowmanagerimp.cpp:312:32 (openmw+0x952d97)
#31 OMW::Engine::prepareEngine() /home/elsid/dev/openmw/apps/openmw/engine.cpp:873:21 (openmw+0x1360828)
#32 OMW::Engine::go() /home/elsid/dev/openmw/apps/openmw/engine.cpp:1042:5 (openmw+0x1361abd)
#33 runApplication(int, char**) /home/elsid/dev/openmw/apps/openmw/main.cpp:228:17 (openmw+0x1356e0e)
#34 wrapApplication(int (*)(int, char**), int, char**, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) /home/elsid/dev/openmw/components/debug/debugging.cpp:330:19 (openmw+0x1757a91)
#35 main /home/elsid/dev/openmw/apps/openmw/main.cpp:240:12 (openmw+0x1356f0a)
Thread T15 (tid=29158, running) created by main thread at:
#0 pthread_create <null> (openmw+0x780f26)
#1 std::__1::__libcpp_thread_create(unsigned long*, void* (*)(void*), void*) /usr/bin/../include/c++/v1/__threading_support:375:10 (openmw+0x159f1a5)
#2 std::__1::thread::thread<SceneUtil::WorkThread::WorkThread(SceneUtil::WorkQueue&)::$_1, void>(SceneUtil::WorkThread::WorkThread(SceneUtil::WorkQueue&)::$_1&&) /usr/bin/../include/c++/v1/thread:309:16 (openmw+0x159f1a5)
#3 SceneUtil::WorkThread::WorkThread(SceneUtil::WorkQueue&) /home/elsid/dev/openmw/components/sceneutil/workqueue.cpp:117:7 (openmw+0x159f1a5)
#4 std::__1::__unique_if<SceneUtil::WorkThread>::__unique_single std::__1::make_unique<SceneUtil::WorkThread, SceneUtil::WorkQueue&>(SceneUtil::WorkQueue&) /usr/bin/../include/c++/v1/__memory/unique_ptr.h:725:32 (openmw+0x159e6c3)
#5 SceneUtil::WorkQueue::start(unsigned long) /home/elsid/dev/openmw/components/sceneutil/workqueue.cpp:54:31 (openmw+0x159e6c3)
#6 SceneUtil::WorkQueue::WorkQueue(unsigned long) /home/elsid/dev/openmw/components/sceneutil/workqueue.cpp:39:5 (openmw+0x159e57a)
#7 OMW::Engine::prepareEngine() /home/elsid/dev/openmw/apps/openmw/engine.cpp:772:22 (openmw+0x135f642)
#8 OMW::Engine::go() /home/elsid/dev/openmw/apps/openmw/engine.cpp:1042:5 (openmw+0x1361abd)
#9 runApplication(int, char**) /home/elsid/dev/openmw/apps/openmw/main.cpp:228:17 (openmw+0x1356e0e)
#10 wrapApplication(int (*)(int, char**), int, char**, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) /home/elsid/dev/openmw/components/debug/debugging.cpp:330:19 (openmw+0x1757a91)
#11 main /home/elsid/dev/openmw/apps/openmw/main.cpp:240:12 (openmw+0x1356f0a)
--- a/components/resource/scenemanager.cpp
+++ b/components/resource/scenemanager.cpp
@@ -2,6 +2,8 @@
#include <cstdlib>
#include <filesystem>
+#include <thread>
+#include <chrono>
#include <osg/AlphaFunc>
#include <osg/Group>
@@ -646,6 +648,8 @@ namespace Resource
"Left Clavicle", "Weapon Bone", "Tail", "Bip01", "Root Bone", "BoneOffset", "AttachLight", "Arrow", "Camera", "Collision", "Right_Wrist", "Left_Wrist",
"Shield_Bone", "Right_Forearm", "Left_Forearm", "Right_Upper_Arm", "Left_Clavicle", "Weapon_Bone", "Root_Bone"};
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+
reservedNames = std::vector<std::string>(reserved, reserved + sizeof(reserved)/sizeof(reserved[0]));
for (unsigned int i=0; i<sizeof(reserved)/sizeof(reserved[0]); ++i)
Edited by elsid