#include #include #include #include #include #include #include #include #include namespace { using namespace testing; TEST(ResourceResourceSystem, scenemanager_getinstance_should_be_thread_safe) { const VFS::Manager vfsManager; const ToUTF8::Utf8Encoder encoder(ToUTF8::WINDOWS_1252); Resource::ResourceSystem resourceSystem(&vfsManager, 1.0, &encoder.getStatelessEncoder()); Resource::SceneManager* sceneManager = resourceSystem.getSceneManager(); const Files::ConfigurationManager configurationManager; sceneManager->setShaderPath(configurationManager.getLocalPath() / "resources/shaders"); auto defines = Shader::getDefaultDefines(); auto shadowDefines = SceneUtil::ShadowManager::getShadowsDisabledDefines(); osg::ref_ptr lightManager = new SceneUtil::LightManager(SceneUtil::LightSettings{}, &resourceSystem); auto lightDefines = lightManager->getLightDefines(); for (const auto& define : shadowDefines) defines[define.first] = define.second; for (const auto& define : lightDefines) defines[define.first] = define.second; sceneManager->getShaderManager().setGlobalDefines(defines); constexpr VFS::Path::NormalizedView noSuchPath("meshes/whatever.nif"); std::vector threads; for (int i = 0; i < 50; ++i) { threads.emplace_back([=]() { sceneManager->getInstance(noSuchPath); }); } for (std::thread& thread : threads) thread.join(); } }