From de1437102ec588ea66125b59d1ed0ff6afcb1c66 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Tue, 13 Sep 2022 12:55:14 +0200 Subject: [PATCH] Fix crash on shutdown due to custom JsonAsset C++ instance --- Source/Engine/Content/JsonAsset.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Source/Engine/Content/JsonAsset.cpp b/Source/Engine/Content/JsonAsset.cpp index 47ea395c9..6808c4ca2 100644 --- a/Source/Engine/Content/JsonAsset.cpp +++ b/Source/Engine/Content/JsonAsset.cpp @@ -263,6 +263,9 @@ Asset::LoadResult JsonAsset::loadAsset() Level::ScriptsReloaded.Bind(this); #endif + // Destroy instance on scripting shutdown (eg. asset from scripts) + Scripting::ScriptsUnload.Bind(this); + return LoadResult::Ok; } @@ -272,6 +275,7 @@ void JsonAsset::unload(bool isReloading) Level::ScriptsReloadStart.Unbind(this); Level::ScriptsReloaded.Unbind(this); #endif + Scripting::ScriptsUnload.Unbind(this); DeleteInstance(); JsonAssetBase::unload(isReloading); @@ -279,6 +283,8 @@ void JsonAsset::unload(bool isReloading) bool JsonAsset::CreateInstance() { + ScopeLock lock(Locker); + // Try to scripting type for this data const StringAsANSI<> dataTypeNameAnsi(DataTypeName.Get(), DataTypeName.Length()); const auto typeHandle = Scripting::FindScriptingType(StringAnsiView(dataTypeNameAnsi.Get(), DataTypeName.Length())); @@ -320,6 +326,8 @@ bool JsonAsset::CreateInstance() void JsonAsset::DeleteInstance() { + ScopeLock lock(Locker); + // C# instance if (MObject* object = GetManagedInstance()) {