Added mutex locks on static variables such as static scope and userdata, that could be shared around threads
This commit is contained in:
parent
18ffe00bc4
commit
1fcde396c3
|
@ -23,6 +23,7 @@ namespace Porygon::StandardLibraries{
|
||||||
public:
|
public:
|
||||||
map<Utilities::HashedString, Binder::BoundVariable *> _boundVariables;
|
map<Utilities::HashedString, Binder::BoundVariable *> _boundVariables;
|
||||||
map<Utilities::HashedString, Evaluation::EvalValue*> _variables;
|
map<Utilities::HashedString, Evaluation::EvalValue*> _variables;
|
||||||
|
std::mutex _mutex;
|
||||||
|
|
||||||
InternalScope(){
|
InternalScope(){
|
||||||
BasicLibrary::RegisterVariables(&_boundVariables, &_variables);
|
BasicLibrary::RegisterVariables(&_boundVariables, &_variables);
|
||||||
|
@ -58,11 +59,13 @@ namespace Porygon::StandardLibraries{
|
||||||
|
|
||||||
|
|
||||||
static void RegisterVariable(const Utilities::HashedString& identifier, shared_ptr<ScriptType> type, Evaluation::EvalValue* value){
|
static void RegisterVariable(const Utilities::HashedString& identifier, shared_ptr<ScriptType> type, Evaluation::EvalValue* value){
|
||||||
|
std::lock_guard<std::mutex> guard(GetScope()->_mutex);
|
||||||
GetScope()->_boundVariables.insert({identifier, new Binder::BoundVariable(std::move(type))});
|
GetScope()->_boundVariables.insert({identifier, new Binder::BoundVariable(std::move(type))});
|
||||||
GetScope()->_variables.insert({identifier, value});
|
GetScope()->_variables.insert({identifier, value});
|
||||||
}
|
}
|
||||||
|
|
||||||
static void RegisterVariableRaw(uint32_t identifier, ScriptType* type, Evaluation::EvalValue* value){
|
static void RegisterVariableRaw(uint32_t identifier, ScriptType* type, Evaluation::EvalValue* value){
|
||||||
|
std::lock_guard<std::mutex> guard(GetScope()->_mutex);
|
||||||
auto hash = Utilities::HashedString::CreateLookup(identifier);
|
auto hash = Utilities::HashedString::CreateLookup(identifier);
|
||||||
GetScope()->_boundVariables.insert({hash, new Binder::BoundVariable(shared_ptr<ScriptType>(type))});
|
GetScope()->_boundVariables.insert({hash, new Binder::BoundVariable(shared_ptr<ScriptType>(type))});
|
||||||
GetScope()->_variables.insert({hash, value});
|
GetScope()->_variables.insert({hash, value});
|
||||||
|
|
|
@ -3,12 +3,14 @@
|
||||||
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <mutex>
|
||||||
#include "UserDataField.hpp"
|
#include "UserDataField.hpp"
|
||||||
#include "UserDataOperation.hpp"
|
#include "UserDataOperation.hpp"
|
||||||
|
|
||||||
namespace Porygon::UserData {
|
namespace Porygon::UserData {
|
||||||
class UserData {
|
class UserData {
|
||||||
std::unordered_map<uint32_t, unique_ptr<UserDataField>> _fields;
|
std::unordered_map<uint32_t, unique_ptr<UserDataField>> _fields;
|
||||||
|
std::mutex _mutex;
|
||||||
|
|
||||||
// Binary operations
|
// Binary operations
|
||||||
UserDataBinaryOperation* _addition = nullptr;
|
UserDataBinaryOperation* _addition = nullptr;
|
||||||
|
@ -62,6 +64,7 @@ namespace Porygon::UserData {
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void CreateField(uint32_t fieldId, UserDataField *field) {
|
inline void CreateField(uint32_t fieldId, UserDataField *field) {
|
||||||
|
std::lock_guard<std::mutex> guard(_mutex);
|
||||||
_fields.insert({fieldId, unique_ptr<UserDataField>(field)});
|
_fields.insert({fieldId, unique_ptr<UserDataField>(field)});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue