From 66b452e90c6ae9f05dc9625b5978ac1aab2d316f 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 4a6d92c66..af49094bc 100644 --- a/Source/Engine/Content/JsonAsset.cpp +++ b/Source/Engine/Content/JsonAsset.cpp @@ -247,6 +247,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; } @@ -256,6 +259,7 @@ void JsonAsset::unload(bool isReloading) Level::ScriptsReloadStart.Unbind(this); Level::ScriptsReloaded.Unbind(this); #endif + Scripting::ScriptsUnload.Unbind(this); DeleteInstance(); JsonAssetBase::unload(isReloading); @@ -263,6 +267,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())); @@ -304,6 +310,8 @@ bool JsonAsset::CreateInstance() void JsonAsset::DeleteInstance() { + ScopeLock lock(Locker); + // C# instance if (MObject* object = GetManagedInstance()) {