1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00
Fixed problems with accessing shared memory sometimes occurring after application has previously crashed.
This commit is contained in:
Michał W. Urbańczyk 2009-12-19 12:31:57 +00:00
parent cc79f1e2bd
commit d037bec1be
4 changed files with 6 additions and 4 deletions

View File

@ -90,10 +90,11 @@ void CClient::init()
gs = NULL; gs = NULL;
cb = NULL; cb = NULL;
terminate = false; terminate = false;
boost::interprocess::shared_memory_object::remove("vcmi_memory"); //if the application has previously crashed, the memory may not have been removed. to avoid problems - try to destroy it
try try
{ {
shared = new SharedMem(); shared = new SharedMem();
} HANDLE_EXCEPTION } HANDLE_EXCEPTIONC(tlog1 << "Cannot open interprocess memory: ";)
} }
CClient::CClient(void) CClient::CClient(void)

4
int3.h
View File

@ -78,7 +78,7 @@ public:
TCreature id = slots[preferable].first; TCreature id = slots[preferable].first;
for(TSlots::const_iterator j=slots.begin(); j!=slots.end(); ++j) for(TSlots::const_iterator j=slots.begin(); j!=slots.end(); ++j)
{ {
if(id == j->second.first) if(id == j->second.first && j->first != preferable)
{ {
out.first = preferable; out.first = preferable;
out.second = j->first; out.second = j->first;
@ -91,7 +91,7 @@ public:
{ {
for(TSlots::const_iterator j=slots.begin(); j!=slots.end(); ++j) for(TSlots::const_iterator j=slots.begin(); j!=slots.end(); ++j)
{ {
if(i->second.first == j->second.first) if(i->second.first == j->second.first && i->first != j->first)
{ {
out.first = i->first; out.first = i->first;
out.second = j->first; out.second = j->first;

View File

@ -2011,6 +2011,7 @@ bool CGameState::getPath(int3 src, int3 dest, const CGHeroInstance * hero, CPath
void CGameState::calculatePaths(const CGHeroInstance *hero, CPathsInfo &out, int3 src, int movement) void CGameState::calculatePaths(const CGHeroInstance *hero, CPathsInfo &out, int3 src, int movement)
{ {
assert(hero); assert(hero);
boost::shared_lock<boost::shared_mutex> lock(*mx);
if(src.x < 0) if(src.x < 0)
src = hero->getPosition(false); src = hero->getPosition(false);
if(movement < 0) if(movement < 0)

View File

@ -2217,7 +2217,7 @@ bool CGameHandler::upgradeCreature( ui32 objid, ui8 pos, ui32 upgID )
bool CGameHandler::garrisonSwap( si32 tid ) bool CGameHandler::garrisonSwap( si32 tid )
{ {
CGTownInstance *town = gs->getTown(tid); CGTownInstance *town = gs->getTown(tid);
if(!town->garrisonHero && town->visitingHero) //visiting => garrison, merge armies if(!town->garrisonHero && town->visitingHero) //visiting => garrison, merge armies: town army => hero army
{ {
CCreatureSet csn = town->visitingHero->army, cso = town->army; CCreatureSet csn = town->visitingHero->army, cso = town->army;
while(!cso.slots.empty())//while there are unmoved creatures while(!cso.slots.empty())//while there are unmoved creatures