1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-03-21 21:17:49 +02:00

Protect public access to Modificators with another mutex.

This commit is contained in:
Tomasz Zieliński 2023-05-07 08:24:08 +02:00
parent a58094aefe
commit 966a24d27e
6 changed files with 28 additions and 4 deletions

View File

@ -62,17 +62,17 @@ protected:
bool finished = false; bool finished = false;
//bool wasStarted() const; mutable boost::shared_mutex externalAccessMutex; //Used to communicate between Modificators
using Lock = boost::unique_lock<boost::shared_mutex>;
private: private:
virtual void process() = 0; virtual void process() = 0;
std::string name; std::string name;
//bool started = false;
std::list<Modificator*> preceeders; //must be ordered container std::list<Modificator*> preceeders; //must be ordered container
mutable boost::shared_mutex mx; mutable boost::shared_mutex mx; //Used only for task scheduling
using Lock = boost::unique_lock<boost::shared_mutex>;
void dump(); void dump();
}; };

View File

@ -43,6 +43,7 @@ void ObjectManager::init()
void ObjectManager::createDistancesPriorityQueue() void ObjectManager::createDistancesPriorityQueue()
{ {
Lock lock(externalAccessMutex);
tilesByDistance.clear(); tilesByDistance.clear();
for(const auto & tile : zone.areaPossible().getTilesVector()) for(const auto & tile : zone.areaPossible().getTilesVector())
{ {
@ -52,21 +53,25 @@ void ObjectManager::createDistancesPriorityQueue()
void ObjectManager::addRequiredObject(CGObjectInstance * obj, si32 strength) void ObjectManager::addRequiredObject(CGObjectInstance * obj, si32 strength)
{ {
Lock lock(externalAccessMutex);
requiredObjects.emplace_back(obj, strength); requiredObjects.emplace_back(obj, strength);
} }
void ObjectManager::addCloseObject(CGObjectInstance * obj, si32 strength) void ObjectManager::addCloseObject(CGObjectInstance * obj, si32 strength)
{ {
Lock lock(externalAccessMutex);
closeObjects.emplace_back(obj, strength); closeObjects.emplace_back(obj, strength);
} }
void ObjectManager::addNearbyObject(CGObjectInstance * obj, CGObjectInstance * nearbyTarget) void ObjectManager::addNearbyObject(CGObjectInstance * obj, CGObjectInstance * nearbyTarget)
{ {
Lock lock(externalAccessMutex);
nearbyObjects.emplace_back(obj, nearbyTarget); nearbyObjects.emplace_back(obj, nearbyTarget);
} }
void ObjectManager::updateDistances(const rmg::Object & obj) void ObjectManager::updateDistances(const rmg::Object & obj)
{ {
Lock lock(externalAccessMutex);
tilesByDistance.clear(); tilesByDistance.clear();
for (auto tile : zone.areaPossible().getTiles()) //don't need to mark distance for not possible tiles for (auto tile : zone.areaPossible().getTiles()) //don't need to mark distance for not possible tiles
{ {
@ -78,11 +83,13 @@ void ObjectManager::updateDistances(const rmg::Object & obj)
const rmg::Area & ObjectManager::getVisitableArea() const const rmg::Area & ObjectManager::getVisitableArea() const
{ {
Lock lock(externalAccessMutex);
return objectsVisitableArea; return objectsVisitableArea;
} }
std::vector<CGObjectInstance*> ObjectManager::getMines() const std::vector<CGObjectInstance*> ObjectManager::getMines() const
{ {
Lock lock(externalAccessMutex);
std::vector<CGObjectInstance*> mines; std::vector<CGObjectInstance*> mines;
for(auto * object : objects) for(auto * object : objects)

View File

@ -33,22 +33,26 @@ void QuestArtifactPlacer::init()
void QuestArtifactPlacer::addQuestArtZone(std::shared_ptr<Zone> otherZone) void QuestArtifactPlacer::addQuestArtZone(std::shared_ptr<Zone> otherZone)
{ {
Lock lock(externalAccessMutex);
questArtZones.push_back(otherZone); questArtZones.push_back(otherZone);
} }
void QuestArtifactPlacer::addQuestArtifact(const ArtifactID& id) void QuestArtifactPlacer::addQuestArtifact(const ArtifactID& id)
{ {
Lock lock(externalAccessMutex);
logGlobal->info("Need to place quest artifact artifact %s", VLC->artifacts()->getById(id)->getNameTranslated()); logGlobal->info("Need to place quest artifact artifact %s", VLC->artifacts()->getById(id)->getNameTranslated());
questArtifactsToPlace.emplace_back(id); questArtifactsToPlace.emplace_back(id);
} }
void QuestArtifactPlacer::rememberPotentialArtifactToReplace(CGObjectInstance* obj) void QuestArtifactPlacer::rememberPotentialArtifactToReplace(CGObjectInstance* obj)
{ {
Lock lock(externalAccessMutex);
artifactsToReplace.push_back(obj); artifactsToReplace.push_back(obj);
} }
std::vector<CGObjectInstance*> QuestArtifactPlacer::getPossibleArtifactsToReplace() const std::vector<CGObjectInstance*> QuestArtifactPlacer::getPossibleArtifactsToReplace() const
{ {
Lock lock(externalAccessMutex);
return artifactsToReplace; return artifactsToReplace;
} }
@ -109,16 +113,19 @@ void QuestArtifactPlacer::placeQuestArtifacts(CRandomGenerator * rand)
void QuestArtifactPlacer::dropReplacedArtifact(CGObjectInstance* obj) void QuestArtifactPlacer::dropReplacedArtifact(CGObjectInstance* obj)
{ {
Lock lock(externalAccessMutex);
boost::remove(artifactsToReplace, obj); boost::remove(artifactsToReplace, obj);
} }
size_t QuestArtifactPlacer::getMaxQuestArtifactCount() const size_t QuestArtifactPlacer::getMaxQuestArtifactCount() const
{ {
Lock lock(externalAccessMutex);
return questArtifacts.size(); return questArtifacts.size();
} }
ArtifactID QuestArtifactPlacer::drawRandomArtifact() ArtifactID QuestArtifactPlacer::drawRandomArtifact()
{ {
Lock lock(externalAccessMutex);
if (!questArtifacts.empty()) if (!questArtifacts.empty())
{ {
ArtifactID ret = questArtifacts.back(); ArtifactID ret = questArtifacts.back();
@ -134,5 +141,6 @@ ArtifactID QuestArtifactPlacer::drawRandomArtifact()
void QuestArtifactPlacer::addRandomArtifact(ArtifactID artid) void QuestArtifactPlacer::addRandomArtifact(ArtifactID artid)
{ {
Lock lock(externalAccessMutex);
questArtifacts.push_back(artid); questArtifacts.push_back(artid);
} }

View File

@ -76,6 +76,7 @@ void RoadPlacer::drawRoads(bool secondary)
|| (!secondary && generator.getConfig().defaultRoadType.empty())) || (!secondary && generator.getConfig().defaultRoadType.empty()))
return; return;
Lock lock(externalAccessMutex);
zone.areaPossible().subtract(roads); zone.areaPossible().subtract(roads);
zone.freePaths().unite(roads); zone.freePaths().unite(roads);
map.getEditManager()->getTerrainSelection().setSelection(roads.getTilesVector()); map.getEditManager()->getTerrainSelection().setSelection(roads.getTilesVector());
@ -87,6 +88,7 @@ void RoadPlacer::drawRoads(bool secondary)
void RoadPlacer::addRoadNode(const int3& node) void RoadPlacer::addRoadNode(const int3& node)
{ {
Lock lock(externalAccessMutex);
roadNodes.insert(node); roadNodes.insert(node);
} }
@ -111,6 +113,7 @@ void RoadPlacer::connectRoads()
return; return;
//take any tile from road nodes as destination zone for all other road nodes //take any tile from road nodes as destination zone for all other road nodes
Lock lock(externalAccessMutex);
if(roads.empty()) if(roads.empty())
roads.add(*roadNodes.begin()); roads.add(*roadNodes.begin());

View File

@ -45,6 +45,7 @@ void TreasurePlacer::init()
void TreasurePlacer::addObjectToRandomPool(const ObjectInfo& oi) void TreasurePlacer::addObjectToRandomPool(const ObjectInfo& oi)
{ {
Lock lock(externalAccessMutex);
possibleObjects.push_back(oi); possibleObjects.push_back(oi);
} }
@ -525,16 +526,19 @@ void TreasurePlacer::addAllPossibleObjects()
size_t TreasurePlacer::getPossibleObjectsSize() const size_t TreasurePlacer::getPossibleObjectsSize() const
{ {
Lock lock(externalAccessMutex);
return possibleObjects.size(); return possibleObjects.size();
} }
void TreasurePlacer::setMaxPrisons(size_t count) void TreasurePlacer::setMaxPrisons(size_t count)
{ {
Lock lock(externalAccessMutex);
maxPrisons = count; maxPrisons = count;
} }
size_t TreasurePlacer::getMaxPrisons() const size_t TreasurePlacer::getMaxPrisons() const
{ {
Lock lock(externalAccessMutex);
return maxPrisons; return maxPrisons;
} }

View File

@ -90,11 +90,13 @@ void WaterProxy::init()
const std::vector<WaterProxy::Lake> & WaterProxy::getLakes() const const std::vector<WaterProxy::Lake> & WaterProxy::getLakes() const
{ {
Lock lock(externalAccessMutex);
return lakes; return lakes;
} }
void WaterProxy::collectLakes() void WaterProxy::collectLakes()
{ {
Lock lock(externalAccessMutex);
int lakeId = 0; int lakeId = 0;
for(const auto & lake : connectedAreas(zone.getArea(), true)) for(const auto & lake : connectedAreas(zone.getArea(), true))
{ {