From 1bd107ad0af907954ea21c0acef072a076e25013 Mon Sep 17 00:00:00 2001 From: k0t9i Date: Wed, 1 Feb 2023 16:45:12 +0400 Subject: [PATCH] fix: add lock to repositories --- L2BotDll/Versions/Interlude/Repositories/DropRepository.h | 5 +++++ L2BotDll/Versions/Interlude/Repositories/HeroRepository.h | 4 ++++ L2BotDll/Versions/Interlude/Repositories/NPCRepository.h | 5 +++++ L2BotDll/Versions/Interlude/Repositories/PlayerRepository.h | 5 +++++ 4 files changed, 19 insertions(+) diff --git a/L2BotDll/Versions/Interlude/Repositories/DropRepository.h b/L2BotDll/Versions/Interlude/Repositories/DropRepository.h index c6dd7e3..15610fd 100644 --- a/L2BotDll/Versions/Interlude/Repositories/DropRepository.h +++ b/L2BotDll/Versions/Interlude/Repositories/DropRepository.h @@ -2,6 +2,7 @@ #include #include +#include #include "Domain/Repositories/EntityRepositoryInterface.h" #include "Domain/DTO/EntityState.h" #include "../Factories/DropFactory.h" @@ -18,6 +19,8 @@ namespace Interlude public: const std::vector> GetEntities() override { + std::unique_lock(m_Mutex); + const std::map items = FindAllObjects(m_Radius, [this](float_t radius, int32_t prevId) { return m_NetworkHandler.GetNextItem(radius, prevId); }); @@ -37,6 +40,7 @@ namespace Interlude void Reset() override { + std::shared_lock(m_Mutex); m_Container.Reset(); } @@ -57,5 +61,6 @@ namespace Interlude const DropFactory& m_Factory; const uint16_t m_Radius; EntityHandler& m_Container; + std::shared_timed_mutex m_Mutex; }; } diff --git a/L2BotDll/Versions/Interlude/Repositories/HeroRepository.h b/L2BotDll/Versions/Interlude/Repositories/HeroRepository.h index 9cf52c8..fef34d9 100644 --- a/L2BotDll/Versions/Interlude/Repositories/HeroRepository.h +++ b/L2BotDll/Versions/Interlude/Repositories/HeroRepository.h @@ -1,5 +1,6 @@ #pragma once +#include #include "Domain/Repositories/EntityRepositoryInterface.h" #include "../Factories/HeroFactory.h" #include "../../../Events/EventDispatcher.h" @@ -17,6 +18,7 @@ namespace Interlude public: const std::vector> GetEntities() override { + std::unique_lock(m_Mutex); auto hero = m_NetworkHandler.GetHero(); @@ -53,6 +55,7 @@ namespace Interlude void Reset() override { + std::shared_lock(m_Mutex); m_EntityHandler.Reset(); } @@ -72,5 +75,6 @@ namespace Interlude const NetworkHandlerWrapper& m_NetworkHandler; User* m_PrevHero = nullptr; EntityHandler& m_EntityHandler; + std::shared_timed_mutex m_Mutex; }; } \ No newline at end of file diff --git a/L2BotDll/Versions/Interlude/Repositories/NPCRepository.h b/L2BotDll/Versions/Interlude/Repositories/NPCRepository.h index c22185d..9ea0959 100644 --- a/L2BotDll/Versions/Interlude/Repositories/NPCRepository.h +++ b/L2BotDll/Versions/Interlude/Repositories/NPCRepository.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include "../GameStructs/NetworkHandlerWrapper.h" #include "Domain/Repositories/EntityRepositoryInterface.h" #include "../Factories/NPCFactory.h" @@ -19,6 +20,8 @@ namespace Interlude public: const std::vector> GetEntities() override { + std::unique_lock(m_Mutex); + const auto creatures = FindAllObjects(m_Radius, [this](float_t radius, int32_t prevId) { return m_NetworkHandler.GetNextCreature(radius, prevId); }); @@ -49,6 +52,7 @@ namespace Interlude void Reset() override { + std::shared_lock(m_Mutex); m_EntityHandler.Reset(); } @@ -112,5 +116,6 @@ namespace Interlude const NetworkHandlerWrapper& m_NetworkHandler; const uint16_t m_Radius = 0; EntityHandler& m_EntityHandler; + std::shared_timed_mutex m_Mutex; }; } \ No newline at end of file diff --git a/L2BotDll/Versions/Interlude/Repositories/PlayerRepository.h b/L2BotDll/Versions/Interlude/Repositories/PlayerRepository.h index 8b12116..656e864 100644 --- a/L2BotDll/Versions/Interlude/Repositories/PlayerRepository.h +++ b/L2BotDll/Versions/Interlude/Repositories/PlayerRepository.h @@ -1,5 +1,6 @@ #pragma once #include +#include #include "Domain/Repositories/EntityRepositoryInterface.h" #include "../Factories/PlayerFactory.h" #include "../../GameStructs/FindObjectsTrait.h" @@ -15,6 +16,8 @@ namespace Interlude public: const std::vector> GetEntities() override { + std::unique_lock(m_Mutex); + const auto creatures = FindAllObjects(m_Radius, [this](float_t radius, int32_t prevId) { return m_NetworkHandler.GetNextCreature(radius, prevId); }); @@ -44,6 +47,7 @@ namespace Interlude void Reset() override { + std::shared_lock(m_Mutex); m_EntityHandler.Reset(); } @@ -64,5 +68,6 @@ namespace Interlude const NetworkHandlerWrapper& m_NetworkHandler; const uint16_t m_Radius; EntityHandler& m_EntityHandler; + std::shared_timed_mutex m_Mutex; }; } \ No newline at end of file