From 07f10af84ac70dba4b5e8f8b7c5957d427a9af74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hanno=20J=2E=20G=C3=B6decke?= Date: Sun, 21 Apr 2024 16:27:49 +0200 Subject: [PATCH] fix: fix crash when releasing materials (#135) --- package/cpp/core/EngineImpl.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/package/cpp/core/EngineImpl.cpp b/package/cpp/core/EngineImpl.cpp index 1735a9d0..b8830b15 100644 --- a/package/cpp/core/EngineImpl.cpp +++ b/package/cpp/core/EngineImpl.cpp @@ -477,23 +477,26 @@ std::shared_ptr EngineImpl::createMaterial(std::shared_ptrgetData(), buffer->getSize()); std::shared_ptr material = References::adoptEngineRef( - _engine, builder.build(*_engine), [dispatcher](std::shared_ptr engine, Material* material) { - dispatcher->runAsync([engine, material]() { + _engine, builder.build(*_engine), [dispatcher, sharedThis](std::shared_ptr engine, Material* material) { + dispatcher->runAsync([engine, material, sharedThis]() { + std::unique_lock lock(sharedThis->_mutex); Logger::log(TAG, "Destroying material..."); engine->destroy(material); }); }); std::shared_ptr materialImpl = References::adoptEngineRef( - _engine, new MaterialImpl(material), [dispatcher](std::shared_ptr engine, MaterialImpl* pMaterialImpl) { - dispatcher->runAsync([engine, pMaterialImpl]() { + _engine, new MaterialImpl(material), [dispatcher, sharedThis](std::shared_ptr engine, MaterialImpl* pMaterialImpl) { + dispatcher->runAsync([engine, pMaterialImpl, sharedThis]() { Logger::log(TAG, "Destroying MaterialImpl / all material instances..."); // Iterate over materialWrapper.getInstances() vector and destroy all instances for (auto& materialInstanceWrapper : pMaterialImpl->getInstances()) { + std::unique_lock lock(sharedThis->_mutex); MaterialInstance* materialInstance = materialInstanceWrapper->getMaterialInstance(); engine->destroy(materialInstance); }