diff --git a/Source/Engine/Scripting/BinaryModule.cpp b/Source/Engine/Scripting/BinaryModule.cpp index 69033f7b6..2f9a42bbc 100644 --- a/Source/Engine/Scripting/BinaryModule.cpp +++ b/Source/Engine/Scripting/BinaryModule.cpp @@ -647,6 +647,8 @@ ScriptingTypeInitializer::ScriptingTypeInitializer(BinaryModule* module, const S module->TypeNameToTypeIndex[fullname] = TypeIndex; } +CriticalSection BinaryModule::Locker; + BinaryModule::BinaryModulesList& BinaryModule::GetModules() { static BinaryModulesList modules; diff --git a/Source/Engine/Scripting/BinaryModule.h b/Source/Engine/Scripting/BinaryModule.h index 36e90acdf..5328f9bbb 100644 --- a/Source/Engine/Scripting/BinaryModule.h +++ b/Source/Engine/Scripting/BinaryModule.h @@ -60,6 +60,9 @@ public: /// The found binary module or null if missing. static BinaryModule* GetModule(const StringAnsiView& name); + // Global scripting locker for cached data. + static CriticalSection Locker; + protected: /// diff --git a/Source/Engine/Scripting/ManagedCLR/MAssembly.h b/Source/Engine/Scripting/ManagedCLR/MAssembly.h index 3436df567..3862627d0 100644 --- a/Source/Engine/Scripting/ManagedCLR/MAssembly.h +++ b/Source/Engine/Scripting/ManagedCLR/MAssembly.h @@ -35,7 +35,6 @@ private: mutable int32 _hasCachedClasses : 1; mutable ClassesDictionary _classes; - CriticalSection _locker; int32 _reloadCount; StringAnsi _name; diff --git a/Source/Engine/Scripting/Runtime/DotNet.cpp b/Source/Engine/Scripting/Runtime/DotNet.cpp index 1d01a8ea3..7f82f8dfc 100644 --- a/Source/Engine/Scripting/Runtime/DotNet.cpp +++ b/Source/Engine/Scripting/Runtime/DotNet.cpp @@ -25,6 +25,7 @@ #include "Engine/Scripting/ManagedCLR/MException.h" #include "Engine/Scripting/ManagedCLR/MUtils.h" #include "Engine/Scripting/Scripting.h" +#include "Engine/Scripting/BinaryModule.h" #include "Engine/Engine/Globals.h" #include "Engine/Profiler/ProfilerCPU.h" #include "Engine/Threading/Threading.h" @@ -636,7 +637,7 @@ const MAssembly::ClassesDictionary& MAssembly::GetClasses() const #if TRACY_ENABLE ZoneText(*_name, _name.Length()); #endif - ScopeLock lock(_locker); + ScopeLock lock(BinaryModule::Locker); if (_hasCachedClasses) return _classes; ASSERT(_classes.IsEmpty()); @@ -939,6 +940,9 @@ MMethod* MClass::GetMethod(const char* name, int32 numParams) const const Array& MClass::GetMethods() const { + if (_hasCachedMethods) + return _methods; + ScopeLock lock(BinaryModule::Locker); if (_hasCachedMethods) return _methods; @@ -972,6 +976,9 @@ MField* MClass::GetField(const char* name) const const Array& MClass::GetFields() const { + if (_hasCachedFields) + return _fields; + ScopeLock lock(BinaryModule::Locker); if (_hasCachedFields) return _fields; @@ -1016,6 +1023,9 @@ MProperty* MClass::GetProperty(const char* name) const const Array& MClass::GetProperties() const { + if (_hasCachedProperties) + return _properties; + ScopeLock lock(BinaryModule::Locker); if (_hasCachedProperties) return _properties; @@ -1038,6 +1048,9 @@ const Array& MClass::GetProperties() const const Array& MClass::GetInterfaces() const { + if (_hasCachedInterfaces) + return _interfaces; + ScopeLock lock(BinaryModule::Locker); if (_hasCachedInterfaces) return _interfaces; @@ -1073,6 +1086,9 @@ MObject* MClass::GetAttribute(const MClass* monoClass) const const Array& MClass::GetAttributes() const { + if (_hasCachedAttributes) + return _attributes; + ScopeLock lock(BinaryModule::Locker); if (_hasCachedAttributes) return _attributes; diff --git a/Source/Engine/Scripting/Runtime/Mono.cpp b/Source/Engine/Scripting/Runtime/Mono.cpp index 676453c21..ef0c42818 100644 --- a/Source/Engine/Scripting/Runtime/Mono.cpp +++ b/Source/Engine/Scripting/Runtime/Mono.cpp @@ -1044,7 +1044,7 @@ const MAssembly::ClassesDictionary& MAssembly::GetClasses() const const StringAnsiView monoImageName(mono_image_get_name(_monoImage)); ZoneText(*monoImageName, monoImageName.Length()); #endif - ScopeLock lock(_locker); + ScopeLock lock(BinaryModule::Locker); if (_hasCachedClasses) return _classes; ASSERT(_classes.IsEmpty());